Использование внешних ссылок VBA для ссылки на закрытую книгу UDF

#excel #vba #hyperlink #range #user-defined-functions

Вопрос:

Я пытаюсь создать UDF, чтобы получить полный путь к диапазону, чтобы создать гиперссылку на этот диапазон.

До этого момента я писал этот код:

 Function DirCelda(rng As Range) As String

    Application.Volatile
    
    Dim Sh As Worksheet
    Dim Wb As Workbook

    Set Sh = rng.Parent
    Set Wb = Sh.Parent

    DirCelda = Wb.FullName amp; "#'" amp; Sh.Name amp; "'!" amp; rng.Address

End Function
 

Он отлично работает с ячейками внутри документа и с диапазонами в других документах (пока они открыты).

т.е.:

 =DirCelda(F8:G9)
 

возвращает: P:RodriLinksExcel.xlsm#’Лист1′!$F$8:$G$9

 =DirCelda('[Caminos.xlsx]Sheet23'!$M$6:$N$22)
 

возвращает: P:RodriCaminos.xlsx#’Лист23′!$M$6:$N$22

Но, когда я закрою книгу «Caminos.xlsx», Excel (в соответствии с объяснением здесь) изменяет способ определения параметра, включая полный путь к файлу.

Итак, последний пример превращается в это:

 =DirCelda('P:Rodri[Caminos.xlsx]Sheet23'!$M$6:$N$22)
 

И он возвращает: #ЗНАЧЕНИЕ!ошибка.

Я пытался включить/отключить приложение de.Изменчивый метод, но когда этот UDF используется в формуле ГИПЕРССЫЛКИ (), Excel снова вычисляет UDF.

Я пытался преобразовать этот диапазон в строку, чтобы определить путь к диапазону, но каждый раз получал одну и ту же ошибку.

Кто-нибудь может мне помочь, пожалуйста?

Заранее спасибо. С уважением!

Комментарии:

1. Не уверен, что это возможно.

2. Моя первая идея состояла в том, чтобы функция перезаписала Application.Caller значение строковым адресом, удалив формулу. Но мои тесты, чтобы доказать, что эта идея была жизнеспособной, провалились, потому что Excel отчаянно ограничивает UDFS возможностью изменять другие ячейки, самих себя или что-либо еще, кроме простого возврата значения. Есть несколько примеров UDF, которые могут это сделать, но я не смог воспроизвести эти UDF в своей версии excel.

3. @Toddleson спасибо за ваш ответ. Я попытался использовать Application.Caller , но он возвращает мне диапазон, в котором был вызван UDF. Однако, поскольку цель состоит в том, чтобы использовать его внутри формулы [т. Е.: =ГИПЕРССЫЛКА(Dircel(A1),»Текст ссылки»)], когда я получаю значение de Application.Caller , я получаю «Текст ссылки», а не полный путь диапазона. Еще раз спасибо за вашу помощь!