16

Вопрос по vba, excel – Как вызвать функцию из другой конкретной книги в VBA?

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

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

ActiveSheet.MyTest() 

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

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

Я старался :

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

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

Я мог позвонить

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

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

  • Примечание. Для этого не используйте «VBAProject». как имя, или это будет конфликтовать.

    от
  • рабочая книга не совпадает с рабочей таблицей

    от
  • Единственные ответы даны - использовать Application.Run, чего я стараюсь избегать. Или я должен предположить, что это невозможно?

    от Gutti
  • stackoverflow.com/search?q=application.run+%5Bexcel%5D

    от Fionnuala
  • 0

    Кстати

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

    ' In workbook ABC, project name Library
    
    Public Type Book_Data
       Title As String
       Pub_Date As Date
       Pub_City As String
    End Type
    
    ' In workbook DEF (after a ref to Library)
    Dim Book_Info As Library.Book_Data
    
    Book_Info.Title = "War and Peace"
    Debug.Print Book_Info.Title
    

  • -2

    Предполагая, что у вас есть две книги &

    quot; Sheet1 & quot; и «Sheet2».

    PUBLIC метод в "Sheet2" называетсяDisplayMessage.

    In & quot; Sheet1 & quot; вы можете сделать это:

    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
    

    End 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
    

    End Sub

  • 21

    В книге

    из которой вы хотите позвонить (я назову это А), вы можете добавить ссылку на книгу, к которой хотите позвонить (я назову это Б), следующим образом:

    In workbook A, open the Microsoft Visual Basic for Applications window (for example, by pressing Alt+F11). Select Tools, References. In the References dialog that appears, choose Browse. In the Add Reference dialog that appears, choose Microsoft Excel Files from the Files of type box, select the file that you want to call (B), and choose Open. Choose OK to close the References dialog.

    В файле A вы должны иметь возможность вызывать общедоступные функции уровня модуля в файле B, как если бы они были в файле A. Чтобы разрешить любые конфликты имен, вы можете добавлять префиксы к вызовам через & quot; Имя проекта & quot; для файла B, как указано на вкладке «Общие» диалогового окна «Свойства проекта» (доступно через команду «Свойства» в меню «Инструменты Microsoft Visual Basic для приложений»). Например, если & quot; Имя проекта & quot; для файла B было "VBAProjectB", можно вызвать функцию F из файла A, используя синтаксис VBAProjectB.F.