Подтвердить что ты не робот

Как вызвать функцию из другой конкретной книги в VBA?

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

Для рабочего листа я могу позвонить, например:

ActiveSheet.MyTest() 

если MyTest определен в модуле листа

Но я бы хотел вызвать функцию, которая определена в модуле

Я пробовал:

ActiveWorkbook.MyTestModule()
ActiveWorkbook.VBProject.VBComponents("MyModule").MyTestModule(myArg)

которые не работают, генерируя ошибку. Объект не поддерживает этот метод.

Я мог бы назвать

Application.Run(ActiveWorkbook.name & "!MyTestModule", myArg)

Но я не уверен в обработке ошибок Application.Run, и я бы нашел, что cleaner запускает непосредственно метод

4b9b3361

Ответ 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