Silnik obliczeniowy Excel
Przegląd
HotXLS zawiera wbudowany silnik do analizowania i obliczania formuł; silnik ten oblicza formuły komórek programowo w ramach Twojego procesu, eliminując potrzebę wywoływania programu Excel lub zewnętrznych kontrolerów OLE w celu ustalenia obliczonych wartości skoroszytu
Wykonanie obliczeń
Przed zapisaniem lub eksportem uruchom pełne ponowne obliczenie skoroszytu za pomocą głównego interfejsu skoroszytu
procedure Calculate;
Silnik obsługuje standardowe rodziny funkcji matematycznych, daty, logicznych, ciągów znaków i statystycznych; sekwencyjnie rozstrzyga zależności komórek i podąża za łańcuchami odwołań, aby zapobiec odwołaniom cyklicznym
Kontekstowe obliczanie formuł
TXLSWorksheet i TXLSXWorksheet udostępniają EvaluateFormulaAt do obliczenia tekstu formuły we wskazanym wierszu i kolumnie (numeracja od jedynki) bez zapisywania komórki tymczasowej i bez zmiany stanu obliczeń skoroszytu
Style odwołań A1 i R1C1, nazwy lokalne, odwołania strukturalne, zależności formuł, korzenie tablic, wpisane wartości błędów programu Excel, status lotności, jawna autoryzacja odwołań zewnętrznych, anulowanie i stabilne kategorie błędów korzystają ze zwykłego mechanizmu obliczającego skoroszytu
CreateFormulaEvaluationTemplate kompiluje niezmienną kotwicę jednokrotnie i ponownie używa jej dla wielu komórek docelowych; strukturalne odwołania A1 wrażliwe na wiersz docelowy są rozwiązywane dla każdego kontekstu docelowego, a limity na wywołanie ograniczają długość formuły, liczbę kroków elementów składni, głębokość rekursji i rozmiar wygenerowanych tablic w bajtach
Zobacz Kontekstowe obliczanie formuł, aby poznać typy wyników, domyślne budżety, zasady cyklu życia oraz przykłady dla Delphi i C++Builder
Operatory tablicowe
Operatory arytmetyczne, porównania, konkatenacji, negacji jednoargumentowej i procentu przyjmują obliczone tablice, a nie tylko wartości skalarne
Skalar rozprowadzany jest na każdy element, a tablica o jednym wierszu lub jednej kolumnie rozprowadzana jest wzdłuż zgodnego wymiaru; niezgodne kształty zwracają #VALUE!
Błędy pozostają zachowane w swoich komórkach wynikowych, więc pojedyncze dzielenie przez zero lub pojedynczy nieprawidłowy element nie powoduje utraty wartości obliczonych dla pozostałych komórek
COMBINA i PERMUTATIONA mają wspólną semantykę skalarną i tablicową (broadcast) z obcinanymi nieujemnymi argumentami całkowitymi i sprawdzanym przepełnieniem, a MUNIT zwraca zwięzłą dwuwymiarową macierz jednostkową typu Double
FormulaArrayMemoryLimit ma domyślnie wartość 64 MiB i ogranicza rozmiar generowanych macierzy; MUNIT dodatkowo sprawdza pozostały obszar rozlania (spill) arkusza zamiast narzucać stały limit wymiarów
Inspekcja obecności formuł
ISFORMULA(reference) sprawdza, czy komórka zawiera formułę, bez jej obliczania, więc formuła pozostaje wykrywalna, nawet gdy jej wynik z pamięci podręcznej to błąd albo pusty ciąg
Prostokątny zakres zwraca tablicę logiczną o tym samym kształcie; komórki formuły współdzielonej oraz klasycznych lub XLSX formuł tablicowych zwracają true, a komórką formuły jest wyłącznie kotwica dynamicznego rozlania
Bezpośrednie wartości i skalarne nazwy zdefiniowane zwracają #VALUE!, nieprawidłowe odwołania zachowują #REF!, a generowane tablice logiczne są ograniczane przez FormulaArrayMemoryLimit
XLSX zapisuje _xlfn.ISFORMULA i przywraca samą nazwę przy otwarciu, ODS używa standardowej składni of:=ISFORMULA, a wyjście klasycznego XLS odrzuca nieobsługiwaną funkcję przyszłą (future function) przed zapisaniem danych
Nowoczesne funkcje tekstowe
UNICHAR obcina wejścia liczbowe w stronę zera i konwertuje poprawne wartości skalarne Unicode na UTF-16, w tym wyjście w postaci par surrogate dla płaszczyzn uzupełniających oraz wszystkie zakresy prywatne
Zero i wejścia poza zakresem zwracają #VALUE!, a odosobnione punkty kodowe surrogate i znaki niedozwolone Unicode (noncharacters) zwracają #N/A; wejścia zakresowe i generowane tablice zachowują te błędy per element
BAHTTEXT konwertuje liczby skończone na tekst tajski z kwotami w bahtach i satangach, zaokrągla wartości środkowe w kierunku od zera do dwóch miejsc po przecinku, zachowuje znak minus, gdy zaokrąglona wartość bezwzględna spada do zera, i rozwija notację naukową bez zawężania przez typ całkowity
XLSX zapisuje UNICHAR jako _xlfn.UNICHAR i przywraca samą nazwę po ponownym otwarciu; BAHTTEXT zachowuje swoje standardowe oznaczenie funkcji i pozostaje bez prefiksu w formułach XLS i XLSX
Regresja i predykcja
LINEST i LOGEST przyjmują jedną lub więcej kolumn albo wierszy zmiennych objaśniających i zwracają współczynniki w kolejności Excela, a po nich opcjonalny wyraz wolny
Gdy argument statystyk ma wartość true, obie funkcje zwracają pełny wynik o pięciu wierszach, zawierający błędy współczynników, statystyki dopasowania, statystykę F, stopnie swobody, sumę kwadratów regresji i sumę kwadratów reszt
TREND i GROWTH korzystają z tego samego modelu wielozmiennego i zachowują kształt wierszowy lub kolumnowy podanych nowych wartości zmiennych objaśniających
Ponowne obliczanie zależności w klasycznym XLS
TXLSWorkbook.Recalculate buduje graf zależności formuł przy pierwszym wywołaniu i oblicza formuły w kolejności od poprzedników, a nie w kolejności fizycznej komórek
Kolejne wywołania ponownie używają grafu i przeliczają wyłącznie przechodnich zależnych od zmienionych wartości oraz formuły lotne; edycje formuł, nazwy, struktura arkusza i przepisane odwołania bezpiecznie unieważniają graf i budują go od nowa
Odwołania cykliczne korzystają z klasycznych ustawień skoroszytu EnableIteration, MaxIterations i MaxIterationChange, a UseFullPrecision=False stosuje precyzję wyświetlanych liczb do wyników z pamięci podręcznej i zależnych od nich obliczeń
Zależności nazw zdefiniowanych
Obliczanie przyrostowe śledzi nazwy o zakresie skoroszytu i arkusza poprzez zagnieżdżone formuły i odwołania do wielu obszarów
Acykliczne formuły nazw wnoszą swoje dokładne zależności komórkowe, a rekurencyjne cykle nazw mają bezpieczny fallback w postaci przeliczania formuł lotnych
Tabele danych analizy „co jeśli"
Arkusze klasycznego XLS i nowoczesnego XLSX potrafią tworzyć, obliczać, odczytywać, zapisywać, kopiować i strukturalnie modyfikować tabele danych analizy „co jeśli" z jedną lub dwiema zmiennymi
function AddDataTable( const AResultRange, ARowInputCell, AColumnInputCell: WideString ): TXLSDataTable;
Zakres wyników zawiera wyłącznie obliczone komórki wyjściowe, natomiast formuły i wartości próbne korzystają z otaczających komórek, w tym samym układzie co w Excelu
- Tabela z wejściem kolumnowym — pozostaw
ARowInputCellpuste, umieść formułę źródłową nad każdą kolumną wyników, a wartości próbne po lewej stronie wierszy wyników - Tabela z wejściem wierszowym — pozostaw
AColumnInputCellpuste, umieść formułę źródłową po lewej stronie każdego wiersza wyników, a wartości próbne nad kolumnami wyników - Tabela z dwiema zmiennymi — podaj obie komórki wejściowe, umieść formułę źródłową nad i po lewej stronie zakresu wyników, wartości próbne wejścia wierszowego nad wynikami, a wartości próbne wejścia kolumnowego po lewej
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;
Ten przykład z wejściem kolumnowym oblicza 3, 5 i 7 w D2:D4; każda wartość próbna jest stosowana przez izolowany kontekst obliczeń, więc formuły sięgające do B1 pośrednio, poprzez inne komórki formuł, są poprawnie przeliczane
AddDataTable zwraca nil dla nieprawidłowego zakresu, nieprawidłowego odwołania wejściowego albo gdy oba odwołania wejściowe są puste; kolekcja DataTables arkusza udostępnia powstałą definicję oraz jej flagi usuniętych wejść
Usunięcie wskazywanej komórki wejściowej zachowuje definicję tabeli i zwraca #REF! dla jej wyników, co odpowiada semantyce zapisanego skoroszytu
Funkcje zdefiniowane przez użytkownika
Rozszerz silnik formuł o niestandardową logikę biznesową; zarejestruj własne funkcje przy użyciu poniższych zdarzeń
Niebezpieczne nazwy zewnętrzne i nazwy w stylu makr są blokowane, zanim zostaną uruchomione argumenty lub handlery, chyba że skoroszyt albo pojedyncze kontekstowe obliczenie jawnie włączy AllowUnsafeFormulaCallbacks
- Zdarzenie OnUserFunction — Obsługuj podstawowe funkcje zdefiniowane przez użytkownika
- Zdarzenie OnUserFunctionEx — Rozstrzygaj złożone funkcje z parametrami zakresu komórek
- Wywołanie zwrotne funkcji użytkownika — Wymagania dotyczące sygnatury dla zewnętrznych programów obsługi