调用表单中的一个子

我目前在我的工作簿中已经有了一个表格。 这个表单包含一个button。 点击button,我想调用位于“ThisWorkbook”部分内的Sub。 我怎么能这样做呢?

表单中的button…

Sub CommandButton1_Click() Call Main("Test") End Sub 

需要在“ThisWorkbook”中调用的Sub

 Sub Main(DPass As String) msgbox Dpass End Sub 

这会给我一个编译错误: Sub or Function not defined 。 为什么会这样呢?

基本上有两种types的模块:

  • “标准/程序”模块
  • 类模块

“文档”模块(例如, ThisWorkbookSheet1等)只是特殊的类模块。 “UserForm”模块也是如此,这些模块基本上是具有默认实例和devise器的类。

类模块的成员在运行时不存在; 一个类只不过是一个对象蓝图 – 所以你需要创build一个types的对象(类决定types),或使用现有的类。

ThisWorkbookWorkbook类的一个实例 ; Sheet1Worksheet类的一个实例。 Chart1Chart类的一个实例; UserForm1UserForm类的一个实例 。 等等。

如果您创build一个新的类模块并将其称为Class1 ,并添加一个公共过程:

 Public Sub DoSomething() MsgBox "Something!" End Sub 

那么为了调用DoSomething你需要一个Class1实例

 Dim foo As Class1 Set foo = New Class1 foo.DoSomething 

如果DoSomethingThisWorkbook模块中,那么可以通过使用它存在的对象限定方法名称来调用它,如注释和其他答案中所述:

 ThisWorkbook.DoSomething 

如果DoSomething是在标准/过程模块中实现的 ,那么就没有对象,这个过程存在于全局范围内,你可以这样做:

 DoSomething 

然而程序模块的公共成员也暴露为macrosPublic Sub )和用户定义的函数Public Function ),你可能不想这样做。

如果您需要带有公共成员的程序模块,您只能从VBA代码中调用(而不是通过单击工作表上的button或在单元格中input公式),则可以在顶部指定Option Private Module

 Option Private Module Public Sub DoSomething() ' DoSomething is not exposed as a macro, ' but can be called from anywhere in the VBA project. End Sub 

把你的子文件放在一个模块中,而不是放在你的ThisWorkbook中,除非你必须出于某种原因,如果这样的话使用ThisWorkbook.Main "string"