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 or
(em vez der.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.