Документация HotXLS

Класс TXLSFormulaDebugger

TXLSFormulaDebugger анализирует формулу в контексте одного листа XLSX и возвращает принадлежащий вызывающему коду объект TXLSFormulaDebugSession

Сеанс объединяет полное разобранное дерево выражений с фактическим порядком вычисления, промежуточными значениями, координатами зависимостей, выбранными отложенными ветвями, пропущенными выражениями и источником первой ошибки

Вызывающий код владеет и должен освободить каждый сеанс, возвращённый методом Analyze

Объявление

type
  TXLSFormulaDebugger = class
    constructor Create(Worksheet: TXLSXWorksheet);
    function Analyze(const Formula: WideString):
      TXLSFormulaDebugSession;
  end;

Члены сеанса

FormulaНормализованный исходный код без необязательного ведущего знака равенства
FinalValueВычисленное скалярное значение или стандартная ошибка формулы Variant
NodesРазобранные узлы в порядке «родитель до потомков»
DependenciesЗависимости от ячеек, диапазонов или определённых имён с разрешёнными координатами листа, когда это возможно
StepNodesУзлы в детерминированном порядке вычисления, включая пропущенные узлы
CurrentNodeУзел, выбранный интерактивным курсором навигации
ErrorOriginNodeIdСамый глубокий узел, из которого возникла конечная ошибка формулы, или -1, когда конечный результат не является ошибкой
ErrorCodeКод ошибки Excel, переносимый конечным значением ошибки
ErrorTextТекст ошибки Excel, например #DIV/0! или #N/A

Диагностика узлов

Каждый TXLSFormulaDebugNode сообщает своего родителя, глубину, диапазон исходного кода, вид узла, имя оператора или функции, идентификаторы операндов, значения операндов, значение результата, индекс вычисления, состояние, выбранную ветвь и сведения об ошибке

Состояние узла — fdsPending, fdsEvaluated, fdsSkipped или fdsError

Диагностика ветвей различает ветви IF со значениями true и false, ветви значения и резервные ветви IFERROR или IFNA, а также выбранную ветвь CHOOSE, IFS или SWITCH

Восстановленные внутренние ошибки остаются видимыми на своих узлах, даже когда конечный результат формулы является допустимым

Навигация

Пример

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;

См. также