Excel VBA:从另一个工作表调用Worksheet_change

时间:2018-10-31 10:25:07

标签: excel vba excel-vba

假设我有一个包含两个工作表的工作簿:

Sheet1Sheet2

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子例程?

3 个答案:

答案 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_ChangeWorksheet_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_ChangeWorksheet_Calculate进行调用。 [推荐]

答案 2 :(得分:0)

在工作表中调用事件与在任何模块或对象中调用任何非明确的“私有” SubFunction一样。如果它们不是PublicFriend,则它们在不提及其停留位置的情况下不会提供对其功能,子项和属性的访问。

如果未使用关键字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")