Excel-beräkningsmotor
Översikt
HotXLS innehåller en inbyggd motor för tolkning och beräkning av formler; motorn utvärderar cellformler programmatiskt i din process och eliminerar behovet av att anropa Excel eller externa OLE-styrenheter för att lösa beräknade arbetsboksvärden
Beräkningskörning
Innan du sparar eller exporterar ska du utlösa en fullständig omberäkning av arbetsboken via huvudgränssnittet för arbetsboken
procedure Calculate;
Motorn stöder standardfamiljer för matematiska, datum-, logiska, sträng- och statistiska funktioner; den löser cellberoenden sekventiellt och följer referenskedjor för att förhindra cirkulära referenser
Kontextuell formelutvärdering
TXLSWorksheet och TXLSXWorksheet exponerar EvaluateFormulaAt för att beräkna formulertext i en vald rad och kolumn med ettbaserad numrering, utan att skriva en tillfällig cell eller ändra arbetsbokens beräkningstillstånd
A1- och R1C1-referensformat, lokala namn, strukturerade referenser, formelberoenden, array-rötter, typade Excel-felvärden, volatil status, uttrycklig auktorisering av externa referenser, annullering och stabila felkategorier hanteras av arbetsbokens normala utvärderare
CreateFormulaEvaluationTemplate kompilerar ett oföränderligt ankare en gång och återanvänder det för flera målceller; A1-strukturerade referenser som beror av målraden löses för varje målkontext, och gränser per anrop begränsar formellängd, antal syntaxsteg, rekursionsdjup och antal genererade arraybyte
Se Kontextuell formelutvärdering för resultattyper, standardbudgeter, livstidsregler och Delphi- eller C++Builder-exempel
Arrayoperatorer
Aritmetiska operatorer, jämförelseoperatorer, sammanfogningsoperatorer, unär negation och procentoperatorer accepterar beräknade arrayer liksom skalära värden
Ett skalärt värde tillämpas på varje element, och en array med en rad eller en kolumn expanderas över en kompatibel dimension; inkompatibla former returnerar #VALUE!
Fel behålls i sina enskilda resultatceller, så en enda division med noll eller ett ogiltigt element förkastar inte de värden som beräknats för de återstående cellerna
COMBINA och PERMUTATIONA har samma skalära och arrayexpanderande semantik, med trunkerade icke-negativa heltalsargument och kontrollerad overflow, medan MUNIT returnerar en kompakt tvådimensionell identitetsmatris av typen Double
FormulaArrayMemoryLimit har standardvärdet 64 MiB och begränsar de genererade matrisnyttolasterna; MUNIT validerar dessutom det återstående spillområdet i kalkylbladet i stället för att införa ett fast tak för dimensionen
Kontroll av formelförekomst
ISFORMULA(reference) kontrollerar vilka celler som innehåller formler utan att beräkna den refererade cellen, så att en formel fortfarande kan upptäckas när dess cachade resultat är ett fel eller en tom sträng
Ett rektangulärt område returnerar en boolesk array med samma form; delade formler och medlemmar i klassiska eller XLSX-matrisformler returnerar true, medan endast ankaret i ett dynamiskt spill är en formelcell
Direkta värden och skalära definierade namn returnerar #VALUE!, ogiltiga referenser bevarar #REF!, och de genererade booleska arrayerna begränsas av FormulaArrayMemoryLimit
XLSX skriver _xlfn.ISFORMULA och återställer namnet utan prefix vid öppning, ODS använder standardsyntaxen of:=ISFORMULA, och klassiska XLS-utdata avvisar den ej stödda framtida funktionen innan data skrivs
Moderna textfunktioner
UNICHAR trunkerar numeriska indata mot noll och konverterar giltiga Unicode-skalärvärden till UTF-16, inklusive surrogatpar i utdata för supplerande plan och alla privata användningsintervall
Indata som är noll eller ligger utanför intervallet returnerar #VALUE!, medan isolerade surrogatkodpunkter och Unicode-noncharacters returnerar #N/A; indata från områden och genererade arrayer bevarar dessa fel per element
BAHTTEXT konverterar ändliga tal till text i thailändska baht och satang, avrundar mittpunktsvärden från noll med två decimalers noggrannhet, behåller det negativa tecknet när den avrundade storleken blir noll, och expanderar vetenskaplig notation utan avkortning via en heltalstyp
XLSX sparar UNICHAR som _xlfn.UNICHAR och återställer namnet utan prefix när filen öppnas igen; BAHTTEXT använder sin standardfunktionsidentitet och förblir utan prefix i XLS- och XLSX-formler
Regression och prediktion
LINEST och LOGEST accepterar en eller flera prediktorkolumner eller -rader och returnerar koefficienter i Excels ordning följt av den valfria konstanttermen
När statistikargumentet är true returnerar båda funktionerna det fullständiga femradiga resultatet med koefficientfel, anpassningsstatistik, F-statistik, frihetsgrader, regressionskvadratsumma och residualkvadratsumma
TREND och GROWTH använder samma multivariabla modell och bevarar rad- eller kolumnformen för de nya prediktorvärden som anges
Omberäkning av klassiska XLS-beroenden
TXLSWorkbook.Recalculate bygger en graf över formelberoenden vid det första anropet och utvärderar formler med föregångare först i stället för i fysisk cellordning
Senare anrop återanvänder grafen och omberäknar endast transitiva beroenden till ändrade värden plus volatila formler; formelredigeringar, namn, kalkylbladsstruktur och omskrivna referenser ogiltigförklarar grafen och bygger upp den igen på ett säkert sätt
Cirkulära referenser använder arbetsbokens klassiska inställningar EnableIteration, MaxIterations och MaxIterationChange, medan UseFullPrecision=False tillämpar den visade talprecisionen på cachade resultat och deras efterföljande beräkningar
Beroenden för definierade namn
Den inkrementella beräkningen följer arbetsboks- och kalkylbladsomfattande namn genom nästlade formler och referenser till flera områden
Acykliska namnformler bidrar med sina exakta cellberoenden, medan rekursiva namncykler på ett säkert sätt faller tillbaka till volatil omberäkning
What-If-datatabeller
Både klassiska XLS- och moderna XLSX-kalkylblad kan skapa, beräkna, läsa, skriva, kopiera och strukturellt justera What-If-datatabeller med en eller två variabler
function AddDataTable( const AResultRange, ARowInputCell, AColumnInputCell: WideString ): TXLSDataTable;
Resultatområdet innehåller endast beräknade utdataceller, medan formler och testvärden använder de omgivande cellerna i samma layout som Excel
- Tabell med kolumnindata — lämna
ARowInputCelltomt, placera en källformel ovanför varje resultatkolumn och placera testvärdena till vänster om resultatrader - Tabell med radindata — lämna
AColumnInputCelltomt, placera en källformel till vänster om varje resultatrad och placera testvärdena ovanför resultatkolumnerna - Tabell med två variabler — ange båda indatancellerna, placera källformeln ovanför och till vänster om resultatområdet, radindatans testvärden ovanför resultaten och kolumnindatans testvärden till vänster
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;
Det här exemplet med kolumnindata beräknar 3, 5 och 7 i D2:D4; varje testvärde tillämpas via en isolerad beräkningskontext, så formler som når B1 indirekt via andra formelceller omberäknas korrekt
AddDataTable returnerar nil för ett ogiltigt område, en ogiltig indatreferens eller när båda indatreferenserna är tomma; kalkylbladets samling DataTables exponerar den resulterande definitionen och dess flaggor för borttagna indata
Om en refererad indatancell tas bort bevaras tabelldefinitionen, och utdatacellerna returnerar #REF!, vilket motsvarar semantiken i den lagrade arbetsboken
Användardefinierade funktioner
Utvidga formelmotorn med anpassad affärslogik; registrera dina egna funktioner via händelserna nedan
Farliga externa namn och namn i makrostil nekas innan argumenten eller hanterarna körs, om inte arbetsboken eller en enskild kontextuell utvärdering uttryckligen aktiverar AllowUnsafeFormulaCallbacks
- Händelsen OnUserFunction — Hantera grundläggande användardefinierade funktioner
- Händelsen OnUserFunctionEx — Lös komplexa funktioner med parametrar för cellområden
- Återanrop för användarfunktion — Signaturkrav för externa hanterare