Le XLS classique et le XLSX exposent le même contrat sans effets secondaires pour classifier la saisie de formules avant qu'un appelant ne modifie une cellule
Politique partagée
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Classic IXLSWorkbook et TXLSWorkbook classiques exposent la propriété conjointement avec TXLSXWorkbook; XLSDefaultFormulaEntryPolicy efface la saisie vide et rejette les fonctions inconnues et les noms définis inconnus
La propriété du classeur est copiée par valeur et validée atomiquement lors de l'affectation, de sorte que des valeurs d'énumération non prises en charge lèvent EArgumentOutOfRangeException sans modifier la politique précédente
Résultat de la validation
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue distingue l'absence d'erreur, une fonction inconnue, un nom inconnu, une erreur de syntaxe, une limitation du format cible et des coordonnées cibles invalides
Action choisit d'effacer la cellule, de stocker une chaîne, de stocker une formule ou de rejeter, tandis que Symbol identifie une fonction ou un nom inconnu lorsqu'il en a été reconnu un
Texte vide et formules
Une saisie exactement vide renvoie xlfeaClearCell ou xlfeaStoreString selon EmptyStringMode
Une formule qui renvoie une chaîne vide, telle que ="", reste une formule et renvoie xlfeaStoreFormula lorsque le format cible peut la représenter
Le texte de formule peut inclure ou omettre un signe égal de début
L'affectation d'une chaîne exactement vide via la propriété Value normale des cellules XLS classiques ou XLSX applique désormais directement ce mode : la valeur par défaut supprime toute valeur ou formule existante, tandis que xlfesmPreserveString remplace le contenu de la cellule par une chaîne constante de longueur nulle
Null et Unassigned effacent toujours la cellule dans les deux modes, tandis qu'une véritable formule telle que ="" reste une formule avec un résultat de chaîne vide stocké ou calculé indépendamment
Les writers de lignes ou de colonnes de chaînes et de Variant XLSX appliquent la même règle sans matérialiser les trous vidés et conservent le stockage compact tant que les valeurs restantes y sont représentables
Les lecteurs natifs XLS, XLSX et ODS ainsi que les convertisseurs XLS vers XLSX ou XLSX vers XLS traitent les valeurs stockées comme des entrées de confiance, si bien qu'une chaîne vide constante au niveau du fichier survit même lorsque le classeur de destination conserve la politique de saisie utilisateur par défaut
Symboles inconnus et formats cibles
Les fonctions utilisateur enregistrées au niveau du classeur ou du processus et les callbacks OnUserFunction ou OnUserFunctionEx affectés comptent comme connus pendant la validation sans invoquer de gestionnaire, tandis que les appels non enregistrés conservent leur nom de fonction dans Symbol
Le mode strict renvoie xlfeaReject pour les fonctions ou noms inconnus ; l'affectation via la propriété Formula normale de la cellule rejette avant de modifier la valeur, le cache de formules ou les dépendances
Le mode de préservation conserve le diagnostic et stocke la formule via l'API normale des cellules ; le XLS classique sérialise un appel inconnu via les tokens de fonctions utilisateur de compléments BIFF et conserve le texte des noms inconnus lors de l'enregistrement, de la réouverture et de la conversion XLS/XLSX
Le XLS classique compile en outre les formules connues via le writer BIFF et renvoie xlfeiTargetFormatUnsupported lorsque l'expression ne peut pas être représentée, tandis que le XLSX accepte les fonctions de formules modernes connues prises en charge par son modèle de formules
La validation XLSX reconnaît LAMBDA, les appelables LET lexicaux, les noms définis qui référencent des lambdas, les espaces réservés de rapport, les liens externes de classeur enregistrés et les références structurées qualifiées ou non qualifiées valides, y compris les formes imbriquées et de ligne courante
Le mode de compatibilité peut également conserver les références structurées externes non résolues pour un traitement ultérieur, tandis que le mode strict rejette toujours les noms de tables non résolus
Calcul et audit groupé
Une fonction inconnue préservée qui reste non gérée après la répartition vers les lambdas et les fonctions utilisateur, ou un nom inconnu préservé, s'évalue en erreur Variant avec le code $1D, l'erreur Excel #NAME? ; la même erreur typée se propage à travers les formules dépendantes et l'évaluation contextuelle
Les fonctions intégrées connues qui ne sont pas implémentées restent distinctes d'un appel inconnu, tandis que l'enregistrement, le remplacement, la suppression ou l'effacement d'une fonction utilisateur au niveau du classeur ou du processus et la modification d'une formule de nom défini invalident l'état périmé des dépendances et du calcul
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSFormulaSymbolIssueKind = (xlfsiUnknownFunction, xlfsiUnknownName,
xlfsiSyntaxError);
TXLSFormulaSymbolLocationKind = (xlfslCell, xlfslDefinedName);
TXLSFormulaSymbolIssue = record
Kind: TXLSFormulaSymbolIssueKind;
LocationKind: TXLSFormulaSymbolLocationKind;
Sheet: Integer;
Row: Integer;
Col: Integer;
DefinedNameIndex: Integer;
DefinedName: WideString;
Formula: WideString;
Symbol: WideString;
end;
TXLSWorkbook et TXLSXWorkbook proposent les mêmes surcharges d'audit groupé ; chaque problème identifie une fonction inconnue, un nom inconnu ou une erreur de syntaxe avec un emplacement de cellule de feuille de calcul ou un emplacement de nom défini, la formule source et le symbole non résoluLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), la formule source et le symbole non résolu
L'audit parcourt les arbres de formules analysés ou les tokens BIFF stockés au lieu de scanner le texte, de sorte qu'un texte ressemblant à une fonction à l'intérieur d'une chaîne n'est pas signalé ; la compilation XLSX utilise un cache local à l'opération indexé par le texte de formule résolu, la feuille de calcul, les paramètres régionaux, la génération des noms définis, les générations des registres de fonctions utilisateur et la disponibilité des callbacks
EntryCount indique les formules auditées, UniqueFormulaCount indique les formules compilées ou inspectées indépendamment et CacheHitCount indique les entrées répétées servies par le cache d'opération
Aucune mutation de la feuille de calcul
La validation ne crée ni ne modifie de cellule, ne change pas les valeurs en cache, ne met pas à jour le graphe de dépendances, ne marque pas le classeur comme modifié et n'invoque aucun gestionnaire de fonctions utilisateur enregistré
La validation directe reste exempte de mutation ; l'affectation normale d'une formule applique la même décision en interne et ne valide qu'après le succès de la validation et de la préparation du format cible
Exemple Delphi
Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;
Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
Sheet.Cells[4, 2].Formula := FormulaText;
Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
if Issues[I].Kind = xlfsiUnknownFunction then
LogUnknownSymbol(Issues[I].Symbol);Voir aussi