Класс 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
Восстановленные внутренние ошибки остаются видимыми на своих узлах, даже когда конечный результат формулы является допустимым
Навигация
MoveFirstвыбирает первый шаг вычисленияMoveNextиMovePreviousперемещают текущий курсор без повторного вычисленияSeekNodeвыбирает один узел по его стабильному идентификатору в рамках сеансаResetсбрасывает курсор, сохраняя всю диагностику
Пример
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;