Não existe uma maneira direta de obter o URL de uma célula com um hiperlink gerado por uma fórmula. Você precisa extrair o primeiro argumento da função HYPERLINK()
e avaliá-lo manualmente.
Esta é a versão modificada do seu código que faz isso:
Function GetURL(cell As Range, Optional default_value As Variant)
With cell.Range("A1")
If .Hyperlinks.Count = 1 Then
GetURL = .Hyperlinks(1).Address
Else
If Left$(Replace(Replace(Replace(.Formula, " ", ""), vbCr, ""), vbLf, ""), 11) = "=HYPERLINK(" Then
Dim idxFirstArgument As Long: idxFirstArgument = InStr(.Formula, "(") + 1
GetURL = Evaluate(Mid$(.Formula, idxFirstArgument, InStrRev(.Formula, ",") - idxFirstArgument))
Else
GetURL = default_value
End If
End If
End With
End Function
Observe que quaisquer espaços estranhos ou quebras de linha adicionadas na fórmula são devidamente explicados.
Advertências:
- Isso só funcionará em fórmulas com uma função
HYPERLINK()
mais externa. (No entanto, todas as fórmulas podem ser refatoradas para queHYPERLINK()
seja o mais externo, com apenas uma pequena desvantagem; alternativamente, todas as fórmulas podem ser refatoradas para um dos formulários=IF(…,…,HYPERLINK())
ou=HYPERLINK()
, sem inconvenientes e exigindo apenas uma pequena modificação no código; finalmente, com bastante esforço, o código poderia ser escrito para analisar qualquer fórmula não importando onde a funçãoHYPERLINK()
estivesse situada. - Se houver alguma vírgula após a vírgula delimitando o primeiro e o segundo argumentos da função
HYPERLINK()
, o código será interrompido (pode ser corrigido com relativa facilidade).