Klasa TXLSFormulaDebugger
TXLSFormulaDebugger analizuje formułę w kontekście jednego arkusza XLSX i zwraca należącą do obiektu TXLSFormulaDebugSession
Sesja łączy kompletne sparsowane drzewo wyrażeń z rzeczywistą kolejnością obliczeń, wartościami pośrednimi, współrzędnymi zależności, wybranymi leniwymi gałęziami, pominiętymi wyrażeniami i pierwszym źródłem błędu
Wywołujący jest właścicielem każdej sesji zwróconej przez Analyze i musi ją zwolnić
Deklaracja
type
TXLSFormulaDebugger = class
constructor Create(Worksheet: TXLSXWorksheet);
function Analyze(const Formula: WideString):
TXLSFormulaDebugSession;
end;
Elementy sesji
| Formula | Znormalizowane źródło bez opcjonalnego znaku równości na początku |
| FinalValue | Obliczona wartość skalarna lub standardowy błąd formuły Variant |
| Nodes | Sparsowane węzły w kolejności rodzic-przed-dzieckiem |
| Dependencies | Zależności komórek, zakresów lub nazw zdefiniowanych z rozstrzygniętymi współrzędnymi arkusza, gdy są dostępne |
| StepNodes | Węzły w deterministycznej kolejności obliczeń, w tym węzły pominięte |
| CurrentNode | Węzeł wybrany przez interaktywny kursor nawigacji |
| ErrorOriginNodeId | Najgłębszy węzeł, który wywołał końcowy błąd formuły, lub -1, gdy wynik końcowy nie jest błędem |
| ErrorCode | Kod błędu programu Excel przenoszony przez końcową wartość błędu |
| ErrorText | Tekst wyświetlania programu Excel, np. #DIV/0! lub #N/A |
Diagnostyka węzłów
Każdy TXLSFormulaDebugNode raportuje swojego rodzica, głębokość, zakres źródła, rodzaj węzła, nazwę operatora lub funkcji, identyfikatory węzłów operandów, wartości operandów, wartość wyniku, indeks obliczenia, stan, wybraną gałąź i szczegóły błędu
Stan węzła to fdsPending, fdsEvaluated, fdsSkipped lub fdsError
Diagnostyka gałęzi odróżnia prawdziwą i fałszywą ścieżkę IF, ścieżki wartości i wartości zastępczej IFERROR lub IFNA oraz wybraną gałąź CHOOSE, IFS lub SWITCH
Odzyskane błędy wewnętrzne pozostają widoczne na swoich węzłach, nawet gdy końcowy wynik formuły jest prawidłowy
Nawigacja
MoveFirstwybiera pierwszy krok obliczeńMoveNextiMovePreviousprzesuwają bieżący kursor bez przeliczaniaSeekNodewybiera jeden węzeł po jego stabilnym identyfikatorze lokalnym sesjiResetczyści kursor, zachowując całą diagnostykę
Przykład
Debugger := TXLSFormulaDebugger.Create(Sheet);
try
Session := Debugger.Analyze('=IF(A1=0,42,B1/C1)');
try
if Session.MoveFirst then
repeat
Writeln(Session.CurrentNode.Source);
until not Session.MoveNext;
finally
Session.Free;
end;
finally
Debugger.Free;
end;