Dokumentacja HotXLS

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

FormulaZnormalizowane źródło bez opcjonalnego znaku równości na początku
FinalValueObliczona wartość skalarna lub standardowy błąd formuły Variant
NodesSparsowane węzły w kolejności rodzic-przed-dzieckiem
DependenciesZależności komórek, zakresów lub nazw zdefiniowanych z rozstrzygniętymi współrzędnymi arkusza, gdy są dostępne
StepNodesWęzły w deterministycznej kolejności obliczeń, w tym węzły pominięte
CurrentNodeWęzeł wybrany przez interaktywny kursor nawigacji
ErrorOriginNodeIdNajgłębszy węzeł, który wywołał końcowy błąd formuły, lub -1, gdy wynik końcowy nie jest błędem
ErrorCodeKod błędu programu Excel przenoszony przez końcową wartość błędu
ErrorTextTekst 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

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;

Zobacz także