ฉบับแปลนี้เจาะประเด็น Preserving VBA macros and external links when Delphi code rewrites a workbook โดยยึดบทความภาษาอังกฤษที่อัปเดตแล้วเป็นฐานอ้างอิงทางเทคนิคสำหรับทีม Delphi, PDF และซอฟต์แวร์เอกสาร
หน้านี้แปลงบทความฐานที่อัปเดตแล้วให้เป็นจุดตรวจสอบที่ใช้ได้จริงสำหรับการออกแบบ การนำไปใช้ และการตรวจสอบผล
เนื้อหาที่ซิงก์จากบทความภาษาอังกฤษ
บทความต้นฉบับภาษาอังกฤษได้รับการขยายด้วยบริบทการใช้งานจริง จุดตัดสินใจเชิงเทคนิค และตัวอย่างที่เป็นรูปธรรม หน้านี้จึงควรใช้เป็นคู่มือทำงาน ไม่ใช่บทสรุปสั้น
หัวข้อสำคัญในบทความฐานที่อัปเดตแล้ว:
- ใช้ไฟล์นำเข้าขนาดเล็กที่ทำซ้ำได้ก่อนเชื่อมฟีเจอร์กับข้อมูลจริง
- คงชื่อผลิตภัณฑ์ ชื่อ API ชื่อไฟล์ และค่า literal ไว้ตามเดิม
- เก็บผล validator และข้อมูลเวอร์ชันไว้พร้อมไฟล์ตัวอย่างที่สร้างขึ้น
ทางเลือกสำหรับการนำไปใช้จริง
เริ่มจากชนิดไฟล์ ผลลัพธ์ที่ต้องการ และสถานะข้อผิดพลาดที่ผู้ใช้ควรเห็น จากนั้นผูกการเรียก API แต่ละครั้งกับผลลัพธ์ที่ตรวจสอบได้ เพื่อให้การตรวจสอบ log และงานสนับสนุนจำลองกรณีลูกค้าได้
- ใช้ไฟล์นำเข้าขนาดเล็กที่ทำซ้ำได้ก่อนเชื่อมฟีเจอร์กับข้อมูลจริง
- คงชื่อผลิตภัณฑ์ ชื่อ API ชื่อไฟล์ และค่า literal ไว้ตามเดิม
- เก็บผล validator และข้อมูลเวอร์ชันไว้พร้อมไฟล์ตัวอย่างที่สร้างขึ้น
โค้ดและจุดอ้างอิง API
ตัวอย่างโค้ดคงไว้ตามเดิมเพื่อให้นักพัฒนาเทียบกับโปรเจ็กต์ Delphi, C++Builder และ Lazarus/FPC ได้โดยตรง
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
begin
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Data');
Sheet.Cells[1, 1].Value := 'Refreshed ' + DateTimeToStr(Now);
Book.LoadVbaProjectFromFile('macros\vbaProject.bin');
if not Book.HasVbaProject then
raise Exception.Create('VBA payload failed to load');
// The .xlsm extension is not cosmetic: it selects the
// macro-enabled content type inside the package.
Book.SaveAs('monthly-report.xlsm');
finally
Book.Free;
end;
end;var
Src, Dst: IXLSWorkbook; // interface references: no manual Free
begin
Src := TXLSWorkbook.Create;
if Src.Open('legacy-model.xls') <= 0 then
raise Exception.Create('Cannot open legacy model');
if Src.HasVBAProject then
Src.SaveVBAProjectToFile('extracted-vba.bin');
Dst := TXLSWorkbook.Create;
Dst.Sheets.Add.Name := 'Report2026';
Dst.LoadVBAProjectFromFile('extracted-vba.bin');
Dst.SaveAs('report-with-macros.xls');
end;var
Link: TXLSXExternalLink;
begin
Link := Book.ExternalLinks.Add('\\fileserver\finance\fx-rates-2026.xlsx');
Link.SheetNames.Add('FX');
if Book.ExternalLinks.Count > 0 then
Writeln(Format('%d external link(s): delivery requires reachable targets',
[Book.ExternalLinks.Count]));
end;การตรวจสอบก่อนเผยแพร่
ตรวจไฟล์ผลลัพธ์ด้วยเครื่องมือเดียวกับที่ลูกค้าหรือระบบเก็บถาวรใช้ บันทึกเวอร์ชันคอมโพเนนต์ ข้อมูลทดสอบ เวอร์ชัน validator และผลที่สังเกตได้เพื่อไล่รอย regression ได้ชัดเจน
อ่านเพิ่มเติม
- our article on worksheet protection and page setup
- our article on sheet listing and lightweight workbook inspection
- HotXLS Component
หมายเหตุเพิ่มเติม
ส่วนเสริมนี้ทำให้เวอร์ชันสั้นกลายเป็นคู่มือที่ใช้งานได้จริงมากขึ้น และยังคงสอดคล้องกับ Preserving VBA macros and external links when Delphi code rewrites a workbook รวมถึงฐานทางเทคนิคของบทความภาษาอังกฤษ เนื้อหาควรแสดงให้ชัดว่าเรื่องเริ่มจาก input แบบใด คาดหวัง output อะไร และต้องยืนยันพฤติกรรมตรงจุดไหนผ่าน validation
ลำดับของการตัดสินใจสำคัญมาก: เริ่มจากรูปแบบข้อมูล ต่อด้วยขอบเขตของการเปลี่ยนแปลง จากนั้นคือ dependency ของ API แล้วจึงถึงพฤติกรรมสุดท้าย หากบทความพูดถึงหลายทางเลือก ก็ควรอธิบายด้วยว่าทางไหนเหมาะกับ maintenance, support และการทำซ้ำปัญหามากกว่า
code block ชื่อไฟล์ ชื่อ API และค่า literal ทุกอย่างต้องคงเดิม คำอธิบายรอบ ๆ จะขยายได้ แต่ตัวอย่างโค้ดต้องเป็นจุดอ้างอิงที่แม่นยำ เพื่อให้ผู้อ่านเทียบกับโปรเจ็กต์ Delphi, C++Builder หรือ Lazarus/FPC ของตนได้ตรง ๆ
ส่วน validation ควรพูดถึงไฟล์ตัวอย่างขนาดเล็ก การเทียบผลลัพธ์ และการบันทึก version ของ component หรือ validator ถ้าหน้านี้อธิบาย bug fix หรือ migration ต้องระบุเส้นทางการทำซ้ำ สถานะเริ่มต้นที่เห็น และจุดยืนยันให้ชัด เพื่อให้ติดตาม regression ได้โดยไม่ต้องเดา
การขยายแบบนี้ทำให้หน้ายังมีประโยชน์หลังอ่านครั้งแรก ทั้งสำหรับ reviewer ในฐานะคำอธิบายเหตุผล สำหรับ support ในฐานะบริบทการวิเคราะห์ และสำหรับทีมดูแลในฐานะบันทึกอ้างอิงก่อนการเปลี่ยนแปลงครั้งถัดไป
- อย่าเปลี่ยนชื่อผลิตภัณฑ์ API ไฟล์ หรือ literal
- ถ้ามี code block ให้คงไว้ตามเดิม
- อธิบาย validation ด้วยไฟล์ตัวอย่างและผลลัพธ์ที่เทียบกันได้
- แสดงลำดับการตัดสินใจให้ชัด ไม่ใช่แค่สรุปสั้นเกินไป