Как вызвать функцию из другой конкретной книги в VBA?
Я хотел бы знать, есть ли способ вызвать функцию или метод VBA из другого указанного модуля рабочей книги, поскольку это возможно для конкретного рабочего листа без использования Application.Run
Для рабочего листа я могу позвонить, например:
ActiveSheet.MyTest()
если MyTest определен в модуле листа
Но я бы хотел вызвать функцию, которая определена в модуле
Я пробовал:
ActiveWorkbook.MyTestModule()
ActiveWorkbook.VBProject.VBComponents("MyModule").MyTestModule(myArg)
которые не работают, генерируя ошибку. Объект не поддерживает этот метод.
Я мог бы назвать
Application.Run(ActiveWorkbook.name & "!MyTestModule", myArg)
Но я не уверен в обработке ошибок Application.Run, и я бы нашел, что cleaner запускает непосредственно метод
Ответы
Ответ 1
В рабочей книге, с которой вы хотите позвонить (я назову это A), вы могли бы добавить ссылку на книгу, которую хотите вызвать (я назову это B) следующим образом:
- В рабочей книге A откройте окно Microsoft Visual Basic для приложений (например, нажав Alt + F11).
- Выберите "Инструменты", "Ссылки" .
- В появившемся диалоговом окне "Ссылки" выберите "Обзор".
- В появившемся диалоговом окне "Добавить ссылку" выберите "Файлы Microsoft Excel" из поля "Тип файла", выберите файл, который вы хотите вызвать (B), и выберите "Открыть".
- Выберите "ОК", чтобы закрыть диалоговое окно "Ссылки" .
В файле A вы должны иметь возможность вызывать общедоступные функции уровня модуля в файле B, как если бы они были в файле A. Чтобы разрешить конфликты именования, вы можете префиксные вызовы с помощью "Название проекта" для файла B как указанном на вкладке "Общие" диалогового окна "Свойства проекта" (доступной с помощью команды "Свойства" в меню "Microsoft Visual Basic для приложений" ). Например, если "Имя проекта" для файла B "VBAProjectB", вы можете вызвать функцию F из файла A, используя синтаксис VBAProjectB.F.
Ответ 2
Предполагая, что у вас есть 2 книги "Лист1" и "Лист2".
A PUBLIC в "Sheet2", называемом DisplayMessage.
В "Sheet1" вы можете сделать это:
Public Sub SetParametersInSheet2(sParam As String)
With Sheets("Sheet2")
.Range("B3").Value = sParam 'range in Sheet2
' --- calling function from another worksheet
.DisplayMessage "from here!"
End With
Конец Sub
Метод в "Sheet2":
Public Sub DisplayMessage(sMess As String)
Dim dCurrent As Date
Dim sFormattedMess As String
sFormattedMess = FormatDateTime(Now, vbLongTime) & ": " & sMess
Range("I2").Value = sFormattedMess
Конец Sub