Documentação HotXLS

Classe TXLSFormulaDebugger

TXLSFormulaDebugger analisa uma fórmula no contexto de uma planilha XLSX e retorna um TXLSFormulaDebugSession de propriedade do chamador

A sessão combina a árvore completa de expressões analisadas com a ordem real de avaliação, valores intermediários, coordenadas de dependências, ramos lentos selecionados, expressões ignoradas e a primeira origem de erro

O chamador é o proprietário e deve liberar toda sessão retornada por Analyze

Declaração

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

Membros da sessão

FormulaOrigem normalizada sem o sinal de igual opcional no início
FinalValueValor escalar calculado ou erro padrão de fórmula Variant
NodesNós analisados em ordem de pai antes de filho
DependenciesDependências de célula, intervalo ou nome definido com coordenadas de planilha resolvidas quando disponíveis
StepNodesNós em ordem determinística de avaliação, incluindo nós ignorados
CurrentNodeNó selecionado pelo cursor interativo de navegação
ErrorOriginNodeIdNó mais profundo que originou o erro final da fórmula, ou -1 quando o resultado final não é um erro
ErrorCodeCódigo de erro do Excel transportado pelo valor de erro final
ErrorTextTexto de exibição do Excel, como #DIV/0! ou #N/A

Diagnósticos de nó

Cada TXLSFormulaDebugNode informa seu pai, profundidade, extensão de origem, tipo de nó, nome do operador ou da função, identificadores de nós operandos, valores de operandos, valor do resultado, índice de avaliação, estado, ramo selecionado e detalhes de erro

O estado do nó é fdsPending, fdsEvaluated, fdsSkipped ou fdsError

Os diagnósticos de ramo distinguem caminhos IF verdadeiro e falso, caminhos de valor e de fallback de IFERROR ou IFNA, e o ramo selecionado de CHOOSE, IFS ou SWITCH

Erros internos recuperados permanecem visíveis em seus nós mesmo quando o resultado final da fórmula é válido

Navegação

Exemplo

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;

Veja também