Cet article français présente Préserver les projets VBA et les liens externes avec HotXLS pour les équipes qui construisent des solutions avec Delphi, C++Builder, Lazarus/FPC et les composants losLab
L'accent est mis sur les choix pratiques, les pièges et les points de contrôle afin que la solution reste fiable en production
Décisions d'architecture
Identifiez les actifs protégés du classeur avant toute modification : acceptez-vous, conservez-vous, bloquez-vous ou convertissez-vous les classeurs avec macros, quel inventaire des liens externes gardez-vous, quelle politique de mise à jour appliquez-vous, quels domaines sont approuvés et quel comportement d'actualisation adoptez-vous
- whether macro-enabled workbooks are accepted, preserved, blocked, or converted
- external link inventory, update policy, trusted domains, and refresh behavior
- which workbook edits are allowed without rewriting protected payloads
- security warning, operator review, and audit-report requirements
Parcours d'implémentation
Conservez les charges opaques sauf indication contraire de la politique. L'ordre ci-dessous garde le flux lisible pour les équipes Delphi et C++Builder
- inventory VBA projects, external links, data connections, and defined names before editing
- load worksheet data changes without executing or refreshing external content
- preserve opaque payloads where policy allows and mark blocked content clearly
- save in a format that supports the required payloads
- compare pre-save and post-save inventories before delivery
Preuves de validation
Preuves de conservation pour les classeurs gouvernés. Conservez ces champs avec la sortie ou le dossier de support
- macro presence, VBA project preservation status, and macro-enabled format decision
- external link targets, trusted or blocked status, and refresh policy
- payload inventory before and after save
- operator decision for workbooks with governed content
La conservation n'est pas l'exécution
Préserver les charges VBA et les liens externes consiste à garder les structures du classeur intactes tout en évitant clairement toute confiance ou exécution automatiques. L'application doit inventorier ce qui existe et décider ce qui peut changer
Notes d'implémentation en production
Traitez la préservation des charges VBA et des liens externes avec HotXLS comme un contrat de service explicite autour des appels HotXLS, en séparant validation d’entrée, écriture du classeur, contrôle de sortie et preuves de support
- Définir la source de données, les plages de cellules et le format de sortie avant de créer le classeur
- Consigner le nombre de lignes, les feuilles, les avertissements et le chemin de sortie dans une trace relisible
- Encapsuler les détails applicatifs dans des helpers testables plutôt que dans des événements UI
- Rouvrir ou inspecter le fichier enregistré avant livraison à un autre système ou au client
Défaillances à répéter en test
- Un SaveAs réussi ne prouve pas que le contrat métier est respecté
- Polices, droits et paramètres régionaux peuvent différer entre serveur et poste de développement
- Les journaux ne doivent exposer ni mots de passe, ni données client, ni liens internes
Exemple Delphi détaillé
L'exemple Delphi suivant montre une frontière de service pratique pour ce sujet, avec politiques, journalisation et validation dans une couche testable
procedure UpdateLinkedWorkbookWithoutBreakingMacros(const InputFile, OutputFile: string; const Update: TWorkbookUpdate);
var
Wb: TXLSXWorkbook;
BeforeState: TMacroLinkInventory;
AfterState: TMacroLinkInventory;
begin
RequireFileExists(InputFile);
Wb := TXLSXWorkbook.Create;
try
Wb.Open(InputFile);
BeforeState := CaptureMacroAndLinkInventory(Wb);
AssertAllowedExternalLinks(BeforeState, Update.AllowedLinkHosts);
SetNamedValue(Wb, 'RefreshDate', Update.RefreshDate);
FillNamedTable(Wb, 'DataRefreshRows', Update.Rows);
Wb.Calculate;
if Wb.SaveAs(OutputFile) <> 1 then
RaiseWorkbookSaveError(OutputFile);
AfterState := InspectMacroAndLinkInventory(OutputFile);
AssertMacroModulesPreserved(BeforeState, AfterState);
AssertExternalLinksPolicy(AfterState, Update.AllowedLinkHosts);
WriteMacroLinkAudit(OutputFile, BeforeState, AfterState);
finally
Wb.Free;
end;
end;
Liste de mise en production
- Run the workflow on an empty workbook, a normal customer workbook, and a worst-case workbook
- Open the output with the target spreadsheet application or downstream importer
- Log product version, template version, profile, row count, output path, elapsed time, and warning count
- Keep passwords, temporary files, customer data, and support bundles under explicit retention rules
- Add regression workbooks when a customer file exposes a new edge case
Documentation produit
Exemples de code supplémentaires
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;