如何从VBA中的另一个特定工作簿调用函数?

时间:2012-04-04 13:49:09

标签: vba excel

我想知道是否有办法从另一个指定的工作簿模块调用VBA函数或方法,因为可以在不使用Application.Run的情况下对特定工作表进行调用

对于我可以打电话的工作表,例如:

ActiveSheet.MyTest() 

如果MyTest在工作表模块中定义

但我想调用一个在模块中定义的函数

我试过了:

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

无法生成错误对象不支持此方法

我可以打电话

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

但我不确定Application.Run的错误处理,我会发现直接运行方法更清洁

2 个答案:

答案 0 :(得分:21)

在您要调用的工作簿中(我将其称为A),您可以添加对要调用的工作簿的引用(我将称之为B),如下所示:

  1. 在工作簿A中,打开Microsoft Visual Basic for Applications窗口(例如,按 Alt + F11 )。
  2. 选择工具,参考。
  3. 在出现的“参考”对话框中,选择“浏览”。
  4. 在出现的“添加引用”对话框中,从“文件类型”框中选择“Microsoft Excel文件”,选择要调用的文件(B),然后选择“打开”。
  5. 选择“确定”关闭“引用”对话框。
  6. 在文件A中,您应该能够在文件B中调用公共模块级函数,就像它们在文件A中一样。要解决任何命名冲突,您可以通过文件B的“项目名称”为调用添加前缀为在“项目属性”对话框的“常规”选项卡中指定(可通过“Microsoft Visual Basic for Applications工具”菜单中的“属性”命令访问)。例如,如果文件B的“项目名称”是“VBAProjectB”,则可以使用语法VBAProjectB.F从文件A调用函数F.

答案 1 :(得分: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