Нет прямого способа получить URL из ячейки с гиперссылкой, созданной по формуле. Вам нужно извлечь первый аргумент из HYPERLINK()
функции и вручную оценить его.
Это модифицированная версия вашего кода, которая делает это:
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
Обратите внимание, что любые посторонние пробелы или добавленные разрывы строк в формуле учитываются должным образом.
Предостережения:
- Это будет работать только с формулами с самой внешней
HYPERLINK()
функцией. (Тем не менее, каждая формула может быть реорганизована таким образом, что онаHYPERLINK()
является самой внешней, с незначительным недостатком; поочередно все формулы могут быть реорганизованы в одну из форм=IF(…,…,HYPERLINK())
или=HYPERLINK()
без недостатков и требующие лишь незначительной модификации кода; наконец, с довольно Приложив немного усилий, можно написать код для анализа любой формулы независимо от того, где находитсяHYPERLINK()
функция.); - Если после запятой есть какие-либо запятые, разделяющие первый и второй аргументы
HYPERLINK()
функции, код нарушится (может быть исправлено относительно легко).