Позволяет использовать UDF в одной открытой книге, но сделать его невидимым / непригодным / недоступным в другой книге - PullRequest
0 голосов
/ 30 августа 2018

У меня есть две довольно простые пользовательские функции в книге (Book 1), которые я также зарегистрировал в мастере функций. Все работает без проблем. Однако, когда у меня открыты две разные книги - Book 1 и Book 2 - я могу использовать один из двух UDF из Book 1 в Book 2. Book 2 не регистрирует их в мастере функций так же, как Book 1, но функции по-прежнему полностью функциональны.

Вот изображение того, как в настоящее время отображается каждая рабочая книга:

Книга 1 : emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; emsp; Книга 2 both workbook function wizards

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

EDIT:
Так что надстройка может даже не быть возможной. Тем не менее, есть ли другой способ атаковать это, чтобы единственная рабочая книга, которая может использовать функции, была Book 1?


Примечание: Option Private Module не работает, так как затем скрывает функции от пользователя в обеих книгах, но не дает Book 2 возможности использовать эту функцию. Моя конечная цель - сделать его видимым в Book 1, но невидимым и неиспользуемым в Book 2.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Это невозможно не только потому, что Function Wizard работает на уровне приложения, но и VBA-компиляция не зависит от вызывающей стороны. Например, давайте установим условный оператор компилятора

#If ActiveWorkbook = ThisWorkbook Then

 Public Function udf1()
  udf1 = "UDF1"
 End Function

#End If

это оценивается как True во время компиляции, и можно увидеть udf1 в обеих книгах. При вызове этой функции из book2 этот оператор оценивается как False. Однако эта функция по-прежнему доступна из обеих книг, потому что компиляция была выполнена в независимое время предыдущего вызывающего абонента, когда каждый модуль компилировался, и это утверждение каждый раз выполнялось.

Конечно #If ActiveWorkbook <>ThisWorkbook ... делает его недоступным для просмотра обоими.

0 голосов
/ 06 сентября 2018

Я не уверен, что вы можете сделать так, чтобы эта функция вообще не появлялась в другой книге. Все они находятся под одним и тем же Application, и поэтому они как бы связаны между собой.

Вы можете использовать Application.Caller, который будет содержать объект Range, который вызвал UDF:

 If Application.Caller.Parent.Parent.Name <> "Book1.xlsm" Then Exit Function

И, по сути, ничего не возвращает, что делает функцию бесполезной, и если вы поместите это высоко в своем коде (в качестве первой строки функции), оно будет использовать очень ограниченные ресурсы.

...