Документація 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, шляхи значення та резервного механізму 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;

Див. також