假设我有一个包含两个工作表的工作簿:
Sheet1
和Sheet2
。
Worksheet_change
中有一个Sheet1
子项:
Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub
Worksheet_Calculate
中有一个Sheet2
:
Private Sub Worksheet_Calculate()
'Call Sheets("Sheet1").Worksheet_Change(Range("A1")) 'doesn't work
End Sub
如何在Sheet1
的{{1}}中调用Worksheet_Change
'a Worksheet_Calcalculate
子例程?
答案 0 :(得分:2)
您可以像这样使用Application.Run
…
Application.Run "Sheet1.Worksheet_Change", Range("A1")
请注意,Sheet1
是工作表的VBA名称,而不是选项卡上的名称。可以在工作表的属性窗口(在VB编辑器中)更改VBA名称。
或者将Worksheet_Change
中的代码移动到类似以下的模块中:
Public Sub MySpecificWorksheet_Change(ByVal Target As Range)
...
End Sub
并从Worksheet_Change
和Worksheet_Calculate
两者中调用
Private Sub Worksheet_Change(ByVal Target As Range)
MySpecificWorksheet_Change(ByVal Target As Range)
End Sub
Private Sub Worksheet_Calculate()
MySpecificWorksheet_Change(ByVal Target As Range)
End Sub
答案 1 :(得分:2)
要么:
Private Sub Worksheet_Change
更改为Friend Sub Worksheet_Change
。Private Sub Worksheet_Change
的功能移动到朋友/公共子目录中,并从Worksheet_Change
和Worksheet_Calculate
进行调用。 [推荐] 答案 2 :(得分:0)
在工作表中调用事件与在任何模块或对象中调用任何非明确的“私有” Sub
或Function
一样。如果它们不是Public
或Friend
,则它们在不提及其停留位置的情况下不会提供对其功能,子项和属性的访问。
如果未使用关键字Private
修改事件,则可以使用以下代码对其进行调用:
Sub TestMe
Sheet1.Worksheet_Change Range("A1")
End Sub
如果有人在事件开始时明确添加了Private
一词,那么它看起来像这样:
Private Sub Worksheet_Change(ByVal Target As Range)
,那么我们应该真正考虑不访问该事件。如果仍然需要访问,可以使用Application.Run
来完成。
Application.Run "Sheet1.Worksheet_Change", Sheet1.Range("A1")
Application.Run CStr(Worksheets(1).CodeName & ".Worksheet_Change"), Range("A1")