Oda*_*lim 2 excel vba excel-vba
我有两个模块,Module1和Module2。
在第1单元中:
Private Function myCheck() As Boolean
if [Operation] = [Something] then
myCheck = True
Else
myCheck = False
End if
End Sub
Run Code Online (Sandbox Code Playgroud)
在Module2中,我想在模块1中运行myCheck子,然后执行另一项操作:
Private Sub Execute()
[Operation 1]
If myCheck = True Then
[Operation 2]
Else
[Operation 3]
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
这是行不通的。如果我将私有功能myCheck放在同一模块中,那么它将起作用。是否有一种特殊的方法可以从另一个模块调用子或函数?
在模块1中使用选项专用模块,然后在模块2中使用:
为一个子 ; 使用其中的模块限定您要调用的内容,如下所示:
Module1.myCheck()
Run Code Online (Sandbox Code Playgroud)
为私人子公司;使用Application.Run并使用其所在的模块限定要调用的内容,如下所示:
Application.Run ("Module1.myCheck")
Run Code Online (Sandbox Code Playgroud)
使用“专用模块”会将其隐藏在“开发人员”>“宏”列表中。
进一步阅读:-)
通读下面代码中的注释,以了解什么有效和无效。要自己确认行为,请执行以下操作:创建一个新的Excel,打开“开发人员”>“ Visual Basic”,插入3个模块。将以下代码块复制到相关模块中。
'In Module1
Option Explicit
Sub ScopeTrials()
'NOTES:
' Only NormalSubIn_NormalModule shows in Developer > Macros.
' As the default without a keyword is Public I have called
' these "Normal". I.e. you can use Public or Nothing wherever
' Normal is.
' A line commented out shows what doesn't work.
NormalSubIn_NormalModule
Call NormalSubIn_NormalModule
Application.Run ("NormalSubIn_NormalModule") 'Not recommended!
NormalSubIn_PrivateModule
Call NormalSubIn_PrivateModule
Application.Run ("NormalSubIn_PrivateModule") 'Not recommended!
'PrivateSubIn_NormalModule
'Call PrivateSubIn_NormalModule
'Module2.PrivateSubIn_NormalModule
'Call Module2.PrivateSubIn_NormalModule
Application.Run ("PrivateSubIn_NormalModule") 'Fails with duplicates! See Explanation
Application.Run ("Module2.PrivateSubIn_NormalModule")
'PrivateSubIn_PrivateModule
'Call PrivateSubIn_PrivateModule
'Module3.PrivateSubIn_PrivateModule
'Call Module3.PrivateSubIn_PrivateModule
Application.Run ("PrivateSubIn_PrivateModule") 'Fails with duplicates! See Explanation
Application.Run ("Module3.PrivateSubIn_PrivateModule")
'Explanation: if there is an identical sub in another Private Module, then this fails
'with Runtime Error 1004 (Macro not available or Macros Disabled), which is Misleading
'as the duplication and/or nonspecified module is the problem.
'I.e. always specify module!
'Also, this only fails when the line is actually run. I.e. Compile check doesn't find this
'when starting to Run the code.
End Sub
Run Code Online (Sandbox Code Playgroud)
'In Module2
Option Explicit
Sub NormalSubIn_NormalModule() 'only THIS sub shows in Developer > Macros
MsgBox "NormalSubIn_NormalModule"
End Sub
Private Sub PrivateSubIn_NormalModule()
MsgBox "PrivateSubIn_NormalModule"
End Sub
Run Code Online (Sandbox Code Playgroud)
'In Module3
Option Explicit
Option Private Module
Sub NormalSubIn_PrivateModule()
MsgBox "NormalSubIn_PrivateModule"
End Sub
Private Sub PrivateSubIn_PrivateModule()
MsgBox "PrivateSubIn_PrivateModule"
End Sub
Run Code Online (Sandbox Code Playgroud)
您可以使用Application.Run以下方法来执行此操作:
Application.Run "Module1.myCheck"
Run Code Online (Sandbox Code Playgroud)
如果用户显示宏对话框 (Alt+F8),则宏将对用户保持“不可见”状态,因为它仍然是私有的。
编辑#1
第二种选择是引入一个虚拟变量作为 中的可选参数Sub,如下所示:
Public Sub notVisible(Optional dummyVal As Byte)
MsgBox "Im not visible because I take a parameter, but I can be called normally."
End Sub
Run Code Online (Sandbox Code Playgroud)
这也将在宏对话框 (Alt+F8) 中隐藏宏,但现在可以按通常的方式调用它。
| 归档时间: |
|
| 查看次数: |
7101 次 |
| 最近记录: |