Documentação do HotXLS

Política de validação de entrada de fórmulas

O XLS clássico e o XLSX expõem o mesmo contrato sem efeitos colaterais para classificar a entrada de fórmulas antes que o chamador altere uma célula

Política compartilhada

TXLSFormulaEmptyStringMode =
  (xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
  (xlfusmReject, xlfusmPreserve);

TXLSFormulaEntryPolicy = record
  EmptyStringMode: TXLSFormulaEmptyStringMode;
  UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
  UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
O IXLSWorkbook e o TXLSWorkbook clássicos expõem a propriedade junto com o TXLSXWorkbook; XLSDefaultFormulaEntryPolicy limpa a entrada vazia e rejeita funções desconhecidas e nomes definidos desconhecidos
A propriedade da pasta de trabalho é copiada por valor e validada atomicamente na atribuição, de modo que valores de enumeração sem suporte geram EArgumentOutOfRangeException sem alterar a política anterior

Resultado da validação

function ValidateFormulaEntry(Row, Col: Integer;
  const Formula: WideString): TXLSFormulaEntryValidationResult;

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue distingue ausência de erro, função desconhecida, nome desconhecido, erro de sintaxe, limitação do formato de destino e coordenadas de destino inválidas
Action seleciona limpar a célula, armazenar a cadeia de caracteres, armazenar a fórmula ou rejeitar, enquanto Symbol identifica uma função ou um nome desconhecido quando um deles foi reconhecido

Texto vazio e fórmulas

Uma entrada exatamente vazia retorna xlfeaClearCell ou xlfeaStoreString conforme EmptyStringMode
Uma fórmula que retorna uma cadeia de caracteres vazia, como ="", permanece uma fórmula e retorna xlfeaStoreFormula quando o formato de destino consegue representá-la
O texto da fórmula pode incluir ou omitir um sinal de igualdade inicial
A atribuição de uma cadeia de caracteres exatamente vazia por meio da propriedade Value normal da célula do XLS clássico ou do XLSX agora aplica esse modo diretamente: o padrão remove qualquer valor ou fórmula existente, enquanto xlfesmPreserveString substitui o conteúdo da célula por uma cadeia de caracteres constante de comprimento zero
Null e Unassigned sempre limpam a célula em qualquer modo, enquanto uma fórmula real como ="" permanece uma fórmula com um resultado de cadeia de caracteres vazia armazenado ou calculado de forma independente
Os gravadores de linhas ou colunas de cadeias de caracteres e Variant do XLSX aplicam a mesma regra sem materializar lacunas limpas e mantêm o armazenamento empacotado sempre que os valores restantes são representáveis nele
Os leitores nativos de XLS, XLSX e ODS e os conversores de XLS para XLSX ou de XLSX para XLS tratam os valores armazenados como entrada confiável, de modo que uma cadeia de caracteres vazia constante no nível do arquivo sobrevive mesmo quando a pasta de trabalho de destino mantém a política padrão de entrada do usuário

Símbolos desconhecidos e formatos de destino

Funções de usuário registradas no escopo da pasta de trabalho ou do processo e retornos de chamada OnUserFunction ou OnUserFunctionEx atribuídos contam como conhecidos durante a validação sem invocar um manipulador, enquanto chamadas não registradas mantêm o nome da função em Symbol
O modo estrito retorna xlfeaReject para funções ou nomes desconhecidos; a atribuição por meio da propriedade Formula normal da célula rejeita antes de alterar o valor, o cache de fórmulas ou as dependências
O modo de preservação retém o diagnóstico e armazena a fórmula por meio da API normal da célula; o XLS clássico serializa uma chamada desconhecida por meio de tokens de função de usuário de suplemento BIFF e mantém o texto de nomes desconhecidos ao salvar, reabrir e converter entre XLS e XLSX
O XLS clássico também compila fórmulas conhecidas por meio do gravador BIFF e retorna xlfeiTargetFormatUnsupported quando a expressão não pode ser representada, enquanto o XLSX aceita funções de fórmula modernas conhecidas com suporte em seu modelo de fórmulas
A validação do XLSX reconhece LAMBDA, itens chamáveis lexicais LET , nomes definidos que se referem a lambdas, espaços reservados de relatório, links de pastas de trabalho externas registrados e referências estruturadas qualificadas ou não qualificadas válidas, incluindo formas aninhadas e da linha atual
O modo de compatibilidade também pode manter referências estruturadas externas não resolvidas para processamento posterior, enquanto o modo estrito ainda rejeita nomes de tabela não resolvidos

Cálculo e auditoria em massa

Uma função desconhecida preservada que permanece sem tratamento após o despacho para lambdas e funções de usuário, ou um nome desconhecido preservado, é avaliada como um erro Variant com o código $1D, o erro do Excel #NAME? ; o mesmo erro tipado se propaga pelas fórmulas dependentes e pela avaliação contextual
As funções internas conhecidas que não estão implementadas permanecem distintas de uma chamada desconhecida, enquanto registrar, substituir, remover ou limpar uma função de usuário no escopo da pasta de trabalho ou do processo e alterar a fórmula de um nome definido invalida o estado desatualizado de dependências e cálculo
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
  out AStats: TXLSFormulaSymbolAuditStats):
  TXLSFormulaSymbolIssues; overload;

TXLSFormulaSymbolIssueKind = (xlfsiUnknownFunction, xlfsiUnknownName,
  xlfsiSyntaxError);
TXLSFormulaSymbolLocationKind = (xlfslCell, xlfslDefinedName);

TXLSFormulaSymbolIssue = record
  Kind: TXLSFormulaSymbolIssueKind;
  LocationKind: TXLSFormulaSymbolLocationKind;
  Sheet: Integer;
  Row: Integer;
  Col: Integer;
  DefinedNameIndex: Integer;
  DefinedName: WideString;
  Formula: WideString;
  Symbol: WideString;
end;
TXLSWorkbook e TXLSXWorkbook oferecem as mesmas sobrecargas de auditoria em massa; cada problema identifica uma função desconhecida, um nome desconhecido ou um erro de sintaxe junto com um local de célula da planilha ou de um nome definido, a fórmula de origem e o símbolo não resolvidoLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), a fórmula de origem e o símbolo não resolvido
A auditoria percorre árvores de fórmulas analisadas ou tokens BIFF armazenados em vez de examinar texto, de modo que um texto semelhante a função dentro de uma cadeia de caracteres não é relatado; a compilação do XLSX usa um cache local da operação com chave baseada no texto da fórmula resolvido, na planilha, na localidade, na geração dos nomes definidos, nas gerações dos registros de funções de usuário e na disponibilidade dos retornos de chamada
EntryCount informa as fórmulas auditadas, UniqueFormulaCount informa as fórmulas compiladas ou inspecionadas de forma independente e CacheHitCount informa as entradas repetidas atendidas pelo cache da operação

Sem mutação da planilha

A validação não cria nem edita uma célula, não altera valores em cache, não atualiza o grafo de dependências, não marca a pasta de trabalho como modificada e não invoca um manipulador de funções de usuário registrado
A validação direta permanece livre de mutações; a atribuição normal de fórmula aplica a mesma decisão internamente e só confirma depois que a validação e a preparação do formato de destino são bem-sucedidas

Exemplo em Delphi

Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;

Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
  Sheet.Cells[4, 2].Formula := FormulaText;

Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
  if Issues[I].Kind = xlfsiUnknownFunction then
    LogUnknownSymbol(Issues[I].Symbol);

Veja também

Avaliação contextual de fórmulas
Mecanismo de cálculo do Excel
Membros adicionais da API XLS clássica
Membros avançados da API XLSX