EXCEL: testa se a célula usa outras células em sua fórmula

2

Eu estava tentando formatar células de maneira condicional, cujo valor não dependia de mais nada, então pensei em aplicar ISFORMULA a cada célula, mas percebi que, se uma célula tem algo como =10^23 , também seria uma fórmula, mesmo que seu valor seja constante.

Uma célula com fórmula =10+5 teria a função que estou procurando retornar FALSE e uma célula com =A5+3 teria a função retornar TRUE.

    
por PistoletPierre 06.11.2017 / 15:39

1 resposta

4

Aqui está uma UDF que deve funcionar na maioria dos casos:

Function HAS_REF(r As Range) As Boolean
    HAS_REF = (r.Formula <> r.FormulaR1C1)
End Function

As propriedades Formula e FormulaR1C1 de um intervalo são as mesmas, a menos que contenham uma referência de célula.

Exceção: Se a célula contiver uma referência a um intervalo nomeado, ambos serão iguais e sua célula não será destacada.

Atualização:

Aqui está uma versão que também verifica nomes de intervalos:

Function HAS_REF(r As Range) As Boolean
    Dim i As Long

    HAS_REF = (r.Formula <> r.FormulaR1C1)

    If HAS_REF Then Exit Function

    For i = 1 To ThisWorkbook.Names.Count
        If InStr(r.Formula, ThisWorkbook.Names(i).Name) Then
            HAS_REF = True
            Exit Function
        End If
    Next i
End Function

Claro, se você não estiver usando nomes de intervalo em sua pasta de trabalho, a função que eu postei anteriormente deve ser suficiente.

Sobre o atributo Precedents :

Eu tentei usar o atributo Precedents do intervalo para verificar referências. Mas isso não parece funcionar. Eu tentei o seguinte:

  • Usando diretamente r.Precedents no UDF para verificar se o intervalo tinha precedentes. Atribuindo-o a uma variável de intervalo, simplesmente atribuiu o r (em vez de r.Precedents ).

  • Usando uma sub rotina de ajuda para fazer a verificação real, chamando o sub da função. Isso não funcionou também. No entanto, quando você comenta a linha na função que chama o procedimento secundário, a sub trabalha e verifica os precedentes corretamente.

  • Tentei usar variáveis globais que são acessíveis pela sub-rotina UDF e auxiliar. Não faz diferença.

por 06.11.2017 / 18:16