调用表单中的一个子
我目前在我的工作簿中已经有了一个表格。 这个表单包含一个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的模块:
- “标准/程序”模块
- 类模块
“文档”模块(例如, ThisWorkbook
, Sheet1
等)只是特殊的类模块。 “UserForm”模块也是如此,这些模块基本上是具有默认实例和devise器的类。
类模块的成员在运行时不存在; 一个类只不过是一个对象的蓝图 – 所以你需要创build一个types的对象(类决定types),或使用现有的类。
ThisWorkbook
是Workbook
类的一个实例 ; Sheet1
是Worksheet
类的一个实例。 Chart1
是Chart
类的一个实例; UserForm1
是UserForm
类的一个实例 。 等等。
如果您创build一个新的类模块并将其称为Class1
,并添加一个公共过程:
Public Sub DoSomething() MsgBox "Something!" End Sub
那么为了调用DoSomething
你需要一个Class1
的实例 :
Dim foo As Class1 Set foo = New Class1 foo.DoSomething
如果DoSomething
在ThisWorkbook
模块中,那么可以通过使用它存在的对象限定方法名称来调用它,如注释和其他答案中所述:
ThisWorkbook.DoSomething
如果DoSomething
是在标准/过程模块中实现的 ,那么就没有对象,这个过程存在于全局范围内,你可以这样做:
DoSomething
然而程序模块的公共成员也暴露为macros ( Public 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"
。