Article technique

Préserver les projets VBA et les liens externes avec HotXLS

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

  1. inventory VBA projects, external links, data connections, and defined names before editing
  2. load worksheet data changes without executing or refreshing external content
  3. preserve opaque payloads where policy allows and mark blocked content clearly
  4. save in a format that supports the required payloads
  5. 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

Composant HotXLS

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;