Как хранить и использовать функцию VBA на рабочем листе (не на рабочем столе) - PullRequest
0 голосов
/ 07 февраля 2019

Я продолжаю искать ответ на этот вопрос, но, похоже, мне не повезло.

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

Пользовательская функция должна вызываться изформула ячейки Excel

Вызов функции при сохранении в модуле кода работает нормально, однако перемещение ее в «модуль» объекта рабочего листа приводит к сбою.Возможно, этого и следовало ожидать.

Причина, по которой функция помещается в код листа, заключается в том, что она автоматически импортируется вместе с листом в новую рабочую книгу через папку шаблонов, а затем может использоваться остальными.рабочей книги.(это импорт через диалог Вставка> Новый лист

Так что мой вопрос в 2 раза, либо:

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

Как автоматизировать добавление модуля в новую рабочую книгу при добавлении листа из файла шаблона?

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

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете сделать это (это работает для меня):

Option Explicit

Private Sub Workbook_Open()

   ThisWorkbook.VBProject.VBComponents.Import "[PathtoDir]\MyMod.bas"

End Sub

Обязательно выполните следующие действия в Excel:

Security

0 голосов
/ 07 февраля 2019

К событиям ThisWorkbook рабочей книги, в которую импортируется лист, можно добавить следующее, настроить по своему усмотрению.У меня есть функция листа в Sheet1, называемая ns, она принимает два аргумента a и b, функция в Excel, которую я хочу использовать: MY_FUNCTION

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

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Dim vbp As VBProject
Dim vbm As VBComponent

Set vbp = Application.VBE.ActiveVBProject

Set vbm = vbp.VBComponents.Add(vbext_ct_StdModule)
vbm.Name = "MY_FUNCTION_MDL"

'   vbm.CodeModule.AddFromFile ""       '   <--- another way add from file

vbm.CodeModule.InsertLines 1, "Public Function MY_FUNCTION(a,b)"
vbm.CodeModule.InsertLines 2, "     MY_FUNCTION=sheet1.ns(a,b)"
vbm.CodeModule.InsertLines 3, "End Function"

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...