Извлечь URL из ячейки, к которой применена формула = Hyperlink ()

1261
S7H

Я хочу получить URL из ячейки, к которой применена эта формула.

=HYPERLINK(CONCATENATE("https://loremipsum.com/#/Advertiser/",[@[Customer CID]],"/.html"), "View") 

Формула имеет структурированную ссылку на один из столбцов на моем листе, «Customer CID».

Когда я пытаюсь применить этот макрос к моему листу, он выдает значение по умолчанию, даже когда формула оценивает правильный URL.

Function GetURL(cell As Range, Optional default_value As Variant) If (cell.Range("A1").Hyperlinks.Count <> 1) Then GetURL = default_value Else GetURL = cell.Range("A1").Hyperlinks(1).Address End If End Function 

Но когда я не применяю формулу и не добавляю гиперссылку к ячейке, щелкая правой кнопкой мыши по ячейке, функция макроса =GetUrl([@[Customer CID]], "")работает и дает мне URL.

Кто-нибудь знает, как я могу выполнить эту задачу для получения гиперссылки из ячейки, если эта ячейка оценивает гиперссылку из формулы?

3
Чтобы окончательно устранить ошибки `#VALUE!`, Сначала выберите все ячейки ошибок (`J2: J5`), убедившись, что` J2` является активной ячейкой. Затем нажмите `F2`. Затем нажмите `Ctrl` +` Enter`. robinCTS 5 лет назад 0
Чтобы объединить свои учетные записи, чтобы вы могли прокомментировать и принять или иным образом отредактировать свой вопрос, вы должны использовать форму [contact] (https://superuser.com/contact) и выбрать «Мне нужно объединить учетные записи». Mokubai 5 лет назад 0

1 ответ на вопрос

1
robinCTS

Нет прямого способа получить 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()функции, код нарушится (может быть исправлено относительно легко).

Похожие вопросы