Moteur de calcul Excel
Vue d'ensemble
HotXLS inclut un moteur intégré pour analyser et calculer les formules ; ce moteur évalue les formules de cellule par programme au sein de votre processus, éliminant le besoin d'appeler Excel ou des contrôleurs OLE externes pour résoudre les valeurs calculées du classeur
Exécution du calcul
Avant d'enregistrer ou d'exporter, déclenchez un recalcul complet du classeur à l'aide de l'interface principale du classeur
procedure Calculate;
Le moteur prend en charge les familles de fonctions mathématiques, de date, logiques, de chaîne et statistiques standard ; il résout séquentiellement les dépendances de cellule et suit les chaînes de référence pour éviter les références circulaires
Évaluation contextuelle des formules
TXLSWorksheet et TXLSXWorksheet exposent EvaluateFormulaAt pour calculer le texte d'une formule dans une ligne et une colonne choisies (base 1), sans écrire de cellule temporaire ni modifier l'état de calcul du classeur
Les styles de référence A1 et R1C1, les noms locaux, les références structurées, les dépendances de formule, les racines de tableau, les valeurs d'erreur Excel typées, l'état volatil, l'autorisation explicite des références externes, l'annulation et les catégories d'échec stables partagent l'évaluateur normal du classeur
CreateFormulaEvaluationTemplate compile une ancre immuable une seule fois et la réutilise sur les cellules cibles ; les références structurées A1 sensibles à la ligne cible sont résolues pour chaque contexte cible, et des limites par appel encadrent la longueur de formule, les étapes d'éléments de syntaxe, la profondeur de récursion et les octets de tableau générés
Voir Évaluation contextuelle des formules pour les types de résultats, les budgets par défaut, les règles de cycle de vie et les exemples Delphi ou C++Builder
Opérateurs matriciels
Les opérateurs arithmétiques, de comparaison, de concaténation, de négation unaire et de pourcentage acceptent des tableaux calculés en plus des valeurs scalaires
Un scalaire est diffusé sur chaque élément, et un tableau d'une ligne ou d'une colonne est diffusé le long d'une dimension compatible ; les formes incompatibles renvoient #VALUE!
Les erreurs sont conservées dans leurs cellules de résultat individuelles, de sorte qu'une division par zéro ou un élément invalide ne sacrifie pas les valeurs calculées pour les autres cellules
COMBINA et PERMUTATIONA partagent les sémantiques scalaire et de diffusion de tableau, avec des arguments entiers non négatifs tronqués et un dépassement contrôlé, tandis que MUNIT renvoie une matrice identité Double bidimensionnelle compacte
FormulaArrayMemoryLimit vaut 64 Mio par défaut et borne les charges utiles matricielles générées ; MUNIT valide en plus la zone de propagation (spill) restante de la feuille de calcul au lieu d'imposer un plafond de dimensions fixe
Inspection de la présence de formule
ISFORMULA(reference) vérifie la présence d'une formule sans calculer la cellule référencée, de sorte qu'une formule reste détectable même si son résultat en cache est une erreur ou une chaîne vide
Une plage rectangulaire renvoie un tableau booléen de même forme ; les membres de formule partagée et de formule matricielle classique ou XLSX renvoient true, tandis que seule l'ancre d'une propagation dynamique est une cellule de formule
Les valeurs directes et les noms définis scalaires renvoient #VALUE!, les références invalides conservent #REF!, et les tableaux booléens générés sont limités par FormulaArrayMemoryLimit
XLSX écrit _xlfn.ISFORMULA et restaure le nom sans préfixe à l'ouverture, ODS utilise la syntaxe standard of:=ISFORMULA, et la sortie XLS classique rejette la fonction future non prise en charge avant de valider les données
Fonctions de texte modernes
UNICHAR tronque les entrées numériques vers zéro et convertit les valeurs scalaires Unicode valides en UTF-16, y compris la sortie en paires de substitution pour les plans supplémentaires et toutes les plages d'usage privé
Les entrées à zéro ou hors plage renvoient #VALUE!, tandis que les points de code de substitution isolés et les non-caractères Unicode renvoient #N/A ; les entrées de plage et de tableau généré conservent ces erreurs élément par élément
BAHTTEXT convertit les nombres finis en texte de bahts et satangs thaïlandais, arrondit les valeurs médianes en s'éloignant de zéro à deux décimales, conserve le signe négatif lorsque la magnitude arrondie devient nulle, et développe la notation scientifique sans passer par un type entier
XLSX enregistre UNICHAR sous la forme _xlfn.UNICHAR et restaure le nom sans préfixe à la réouverture ; BAHTTEXT conserve son identité de fonction standard et reste sans préfixe dans les formules XLS et XLSX
Régression et prédiction
LINEST et LOGEST acceptent une ou plusieurs colonnes ou lignes de variables explicatives et renvoient les coefficients dans l'ordre Excel, suivis de la constante facultative
Lorsque l'argument statistiques est vrai, les deux fonctions renvoient le résultat complet en cinq lignes contenant les erreurs des coefficients, les statistiques d'ajustement, la statistique F, les degrés de liberté, la somme des carrés de la régression et la somme des carrés des résidus
TREND et GROWTH utilisent le même modèle multivariable et conservent la forme en ligne ou en colonne des nouvelles valeurs explicatives fournies
Recalcul des dépendances XLS classiques
TXLSWorkbook.Recalculate construit un graphe de dépendances de formules lors de son premier appel et évalue les formules dans l'ordre des précédents plutôt que dans l'ordre physique des cellules
Les appels suivants réutilisent le graphe et ne recalculent que les dépendants transitifs des valeurs modifiées ainsi que les formules volatiles ; les modifications de formules, les noms, la structure des feuilles de calcul et les réécritures de références invalident et reconstruisent le graphe en toute sécurité
Les références circulaires utilisent les paramètres classiques de classeur EnableIteration, MaxIterations et MaxIterationChange, tandis que UseFullPrecision=False applique la précision d'affichage des nombres aux résultats en cache et à leurs calculs en aval
Dépendances des noms définis
Le calcul incrémental suit les noms à portée de classeur et à portée de feuille de calcul à travers les formules imbriquées et les références multi-plages
Les formules de noms acycliques fournissent leurs dépendances de cellules exactes, tandis que les cycles de noms récursifs passent en repli, sans risque, sur un recalcul volatile
Tables de données What-If
Les feuilles de calcul XLS classiques comme XLSX modernes peuvent créer, calculer, lire, écrire, copier et ajuster structurellement des tables de données What-If à une ou deux variables
function AddDataTable( const AResultRange, ARowInputCell, AColumnInputCell: WideString ): TXLSDataTable;
La plage de résultats ne contient que les cellules de sortie calculées, tandis que les formules et les valeurs d'essai occupent les cellules environnantes, dans la même disposition qu'Excel
- Table à entrée de colonne — laissez
ARowInputCellvide, placez une formule source au-dessus de chaque colonne de résultats et placez les valeurs d'essai à gauche des lignes de résultats - Table à entrée de ligne — laissez
AColumnInputCellvide, placez une formule source à gauche de chaque ligne de résultats et placez les valeurs d'essai au-dessus des colonnes de résultats - Table à deux variables — fournissez les deux cellules d'entrée, placez la formule source au-dessus et à gauche de la plage de résultats, les valeurs d'essai d'entrée de ligne au-dessus des résultats et les valeurs d'essai d'entrée de colonne à gauche
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;
Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;
Cet exemple à entrée de colonne calcule 3, 5 et 7 dans D2:D4 ; chaque valeur d'essai est appliquée via un contexte de calcul isolé, de sorte que les formules qui atteignent B1 indirectement, à travers d'autres cellules de formule, sont recalculées correctement
AddDataTable renvoie nil pour une plage invalide, une référence d'entrée invalide ou lorsque les deux références d'entrée sont vides ; la collection DataTables de la feuille de calcul expose la définition obtenue et ses indicateurs d'entrée supprimée
La suppression d'une cellule d'entrée référencée préserve la définition de la table et renvoie #REF! pour ses sorties, conformément à la sémantique du classeur enregistré
Fonctions définies par l'utilisateur
Étendez le moteur de formule avec une logique métier personnalisée ; enregistrez vos propres fonctions à l'aide des événements ci-dessous
Les noms externes et de style macro dangereux sont refusés avant l'exécution des arguments ou des gestionnaires, sauf si le classeur ou une évaluation contextuelle donnée active explicitement AllowUnsafeFormulaCallbacks
- Événement OnUserFunction — Gérer les fonctions de base définies par l'utilisateur
- Événement OnUserFunctionEx — Résoudre les fonctions complexes avec des paramètres de plage de cellules
- Callback de fonction utilisateur — Exigences de signature pour les gestionnaires externes