Excel-berekeningsengine
Overzicht
HotXLS bevat een ingebouwde engine voor het parseren en berekenen van formules; deze engine evalueert celformules programmatisch binnen uw proces, waardoor het niet nodig is om Excel of externe OLE-controllers aan te roepen om berekende werkmapwaarden te resolveren
Berekeningsuitvoering
Activeer voor het opslaan of exporteren een volledige herberekening van de werkmap met de hoofdwerkmapinterface
procedure Calculate;
De engine ondersteunt standaard wiskundige, datum-, logische, tekenreeks- en statistische functiefamilies; het lost celafhankelijkheden opeenvolgend op en volgt referentieketens om cirkelverwijzingen te voorkomen
Contextuele formule-evaluatie
TXLSWorksheet en TXLSXWorksheet stellen EvaluateFormulaAt beschikbaar om formuletekst te berekenen op een gekozen rij en kolom (1-based), zonder een tijdelijke cel weg te schrijven of de berekeningsstatus van de werkmap te veranderen
A1- en R1C1-referentiestijlen, lokale namen, structured references, formuleafhankelijkheden, array-roots, getypeerde Excel-foutwaarden, volatile-status, expliciete autorisatie van externe verwijzingen, annulering en stabiele foutcategorieën maken allemaal gebruik van de normale werkmapevaluator
CreateFormulaEvaluationTemplate compileert één keer een onveranderlijk anker en hergebruikt dat voor alle doelcellen; A1-structured references die van de doelrij afhangen worden per doelcontext opgelost, en limieten per aanroep begrenzen de formulelengte, het aantal syntaxitems, de recursiediepte en het aantal gegenereerde array-bytes
Zie Contextuele formule-evaluatie voor resultaattypen, standaardbudgetten, levensduurregels en Delphi- of C++Builder-voorbeelden
Array-operators
Rekenkundige operatoren, vergelijkingsoperatoren, concatenatie, unaire negatie en de procentoperator accepteren zowel berekende arrays als scalaire waarden
Een scalair wordt gebroadcast naar elk element, en een array van één rij of één kolom wordt gebroadcast langs een compatibele dimensie; incompatibele vormen geven #VALUE! terug
Fouten blijven behouden in hun eigen resultaatcel, dus één deling door nul of één ongeldig element gooit de berekende waarden van de overige cellen niet weg
COMBINA en PERMUTATIONA hanteren dezelfde scalaire en broadcast-arraysemantiek, met afgekapte niet-negatieve gehele argumenten en gecontroleerde overflow, terwijl MUNIT een compacte tweedimensionale Double-eenheidsmatrix teruggeeft
FormulaArrayMemoryLimit staat standaard op 64 MiB en begrenst de gegenereerde matrixpayloads; MUNIT valideert daarnaast de resterende spill-ruimte op het werkblad in plaats van een vast dimensieplafond op te leggen
Aanwezigheid van formules controleren
ISFORMULA(reference) controleert of een cel eigenaar is van een formule zonder de gerefereerde cel te berekenen, dus een formule blijft detecteerbaar wanneer het gecachte resultaat een fout of een lege tekenreeks is
Een rechthoekig bereik geeft een Booleaanse array met dezelfde vorm terug; leden van gedeelde formules en van klassieke of XLSX-matrixformules geven true terug, en bij een dynamische spill is alleen het anker een formulecel
Directe waarden en scalaire gedefinieerde namen geven #VALUE! terug, ongeldige verwijzingen behouden #REF!, en gegenereerde Booleaanse arrays worden begrensd door FormulaArrayMemoryLimit
XLSX schrijft _xlfn.ISFORMULA en herstelt de kale naam bij het openen, ODS gebruikt de standaardsyntax of:=ISFORMULA, en klassieke XLS-uitvoer wijst de niet-ondersteunde future function af voordat de gegevens worden weggeschreven
Moderne tekstfuncties
UNICHAR kapt numerieke invoer af richting nul en converteert geldige Unicode-scalarwaarden naar UTF-16, inclusief surrogate-paaruitvoer voor supplementary planes en alle private-use-bereiken
Nul en invoer buiten het bereik geven #VALUE! terug, terwijl geïsoleerde surrogate-codepoints en Unicode-noncharacters #N/A opleveren; bereikinvoer en gegenereerde arrays behouden deze fouten per element
BAHTTEXT converteert eindige getallen naar Thaise baht- en satang-tekst, rondt middelste waarden weg van nul af op twee decimalen, behoudt een minteken wanneer de afgeronde grootte nul wordt en schrijft wetenschappelijke notatie volledig uit zonder in te krimpen via een integer-type
XLSX slaat UNICHAR op als _xlfn.UNICHAR en herstelt de kale naam bij het opnieuw openen; BAHTTEXT gebruikt zijn standaard functie-identiteit en blijft kaal in XLS- en XLSX-formules
Regressie en voorspelling
LINEST en LOGEST accepteren een of meer voorspelkolommen of -rijen en geven coëfficiënten terug in Excel-volgorde, gevolgd door het optionele intercept
Als het statistiekargument true is, geven beide functies het volledige resultaat van vijf rijen terug met coëfficiëntfouten, fit-statistieken, de F-statistiek, vrijheidsgraden, de regressiekwadratensom en de residuele kwadratensom
TREND en GROWTH gebruiken hetzelfde multivariabele model en behouden de rij- of kolomvorm van de opgegeven nieuwe voorspelwaarden
Herberekening van afhankelijkheden in klassiek XLS
TXLSWorkbook.Recalculate bouwt bij de eerste aanroep een grafiek van formuleafhankelijkheden en evalueert formules in de volgorde van hun precedenten in plaats van in fysieke celvolgorde
Latere aanroepen hergebruiken de grafiek en herberekenen alleen de transitieve afhankelijken van gewijzigde waarden plus volatile formules; bewerkingen aan formules, namen, werkbladstructuur en herschreven verwijzingen maken de grafiek veilig ongeldig en bouwen die opnieuw op
Cirkelverwijzingen gebruiken de klassieke werkmapinstellingen EnableIteration, MaxIterations en MaxIterationChange, terwijl UseFullPrecision=False de weergegeven getalprecisie toepast op gecachte resultaten en de berekeningen daar stroomafwaarts
Afhankelijkheden van gedefinieerde namen
Incrementele berekening volgt namen met werkmap- of werkbladbereik door geneste formules en verwijzingen naar meerdere gebieden heen
Naamformules zonder cycli leveren hun exacte celafhankelijkheden aan, terwijl recursieve naamcycli veilig terugvallen op volatile herberekening
What-If-datatabellen
Zowel klassieke XLS- als moderne XLSX-werkbladen kunnen What-If-datatabellen met één of twee variabelen aanmaken, berekenen, lezen, schrijven, kopiëren en structureel aanpassen
function AddDataTable( const AResultRange, ARowInputCell, AColumnInputCell: WideString ): TXLSDataTable;
Het resultaatbereik bevat uitsluitend berekende uitvoercellen, terwijl formules en proefwaarden de omliggende cellen gebruiken, in dezelfde indeling als Excel
- Tabel met kolominvoer — laat
ARowInputCellleeg, zet een bronformule boven elke resultaatkolom en zet de proefwaarden links van de resultaatrijen - Tabel met rijinvoer — laat
AColumnInputCellleeg, zet een bronformule links van elke resultaatrij en zet de proefwaarden boven de resultaatkolommen - Tabel met twee variabelen — geef beide invoercellen op, zet de bronformule boven en links van het resultaatbereik, de proefwaarden voor rijinvoer boven de resultaten en de proefwaarden voor kolominvoer links
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;
Dit voorbeeld met kolominvoer berekent 3, 5 en 7 in D2:D4; elke proefwaarde wordt toegepast via een geïsoleerde berekeningscontext, dus formules die indirect via andere formulecellen bij B1 uitkomen, worden correct herberekend
AddDataTable geeft nil terug bij een ongeldig bereik, een ongeldige invoerverwijzing of wanneer beide invoerverwijzingen leeg zijn; de collectie DataTables van het werkblad stelt de resulterende definitie en de bijbehorende deleted-input-vlaggen beschikbaar
Bij het verwijderen van een gerefereerde invoercel blijft de tabeldefinitie behouden en geven de uitvoeren #REF! terug, conform de opgeslagen werkmapsemantiek
Door de gebruiker gedefinieerde functies
Breid de formula-engine uit met aangepaste bedrijfslogica; registreer uw eigen functies met behulp van de onderstaande evenementen
Gevaarlijke externe en macro-achtige namen worden geweigerd voordat argumenten of handlers worden uitgevoerd, tenzij de werkmap of een individuele contextuele evaluatie expliciet AllowUnsafeFormulaCallbacks inschakelt
- Gebeurtenis OnUserFunction — Basis door de gebruiker gedefinieerde functies afhandelen
- Gebeurtenis OnUserFunctionEx — Complexe functies met celbereikparameters oplossen
- Callback voor gebruikersfunctie — Handtekeningvereisten voor externe handlers