Можно сказать, какая рабочая тетрадь под названием функция в дополнении Excel (XLA)

StackOverflow https://stackoverflow.com/questions/4901148

Вопрос

Я хочу написать небольшую функцию ведения журнала в надстройке Excel, которую я буду вызывать из множества разных книг.Я хотел бы иметь возможность просто вызвать его, передав только текст журнала, а сама функция журнала могла бы обрабатывать метку времени, имя книги и т. Д.

Однако я не могу использовать ThisWorkbook или ActiveWorkbook, чтобы определить, какая книга была ответственна за вызов, так как Thisworkbook вернет ссылку на саму надстройку, а код VBA выполняется в книге, отличной от книги с активным фокусом.в Excel может сделать вызов, но ActiveWorkbook вернет тот, который имеет фокус в окне.

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

То, что я пытаюсь сделать, невозможно?

Обновить

По мнению> 1 человека, это фактически невозможно.Если кто-то знает какой-нибудь умный обходной путь, сообщите об этом.

Это было полезно?

Решение

Хорошо, поэтому, внимательно прочитав вопрос, я попробую еще раз ...

Итак, чтобы сформулировать проблему:

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

Как уже говорилось, это невозможно (это тот же вопрос, что и доступ к стеку вызовов из кода: что, насколько мне известно, невозможно)

Однако вы можете почти получить то, что хотите, вот так

Объявите функцию журнала следующим образом:

родовое слово

Тогда где бы вы ни вызывали саб, используйте

родовое слово

Не так хорошо, как ничего не передавать, но, по крайней мере, всегда одно и то же

Другие советы

Чтобы получить имя вызывающей книги, используйте

родовое слово

Application.Caller возвращает информацию о том, как был вызван Visual Basic.При вызове из пользовательской функции, введенной в одну ячейку, возвращается объект Range, указывающий эту ячейку

Получив ссылку на ячейку, .Worksheet.Parent.Name дает вам имя книги

Обратите внимание, что Application.Caller будет возвращать другие данные в зависимости от того, как вызывается ваша функция (подробности см. в справке VBA)

в функции надстройки, вызываемой рабочей литой Excel, введенный вызов функции, я обнаружил, что «Application.caller.parent.name» дает имя листа (имя вкладка, не номер листа).

У меня была такая же проблема при кодировании пользовательской функции.Функция работает хорошо, но каждый раз, когда вычисляется или активируется другая книга, все ячейки, использующие эту функцию, возвращаются к #value.Работа с несколькими файлами по этой формуле может быть очень неприятной.

Чтобы получить книгу, которую я использовал:

родовое слово

Это должно работать, если ваша функция находится в ячейке.

Слишком поздно для исходного сообщения, но может помочь другим!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top