Excel 如何使用当前工作表VBA中的代码触发单独工作表中的代码运行

Excel 如何使用当前工作表VBA中的代码触发单独工作表中的代码运行,excel,vba,Excel,Vba,我这里有这个代码,它周围的代码做什么并不重要,它运行正常。但是,在突出显示的点上,我需要触发我指向的“SCP状态付款中心”表中的代码,以便在低于该点的代码之前触发运行。我不想只是放在另一个按钮或其他东西,我只想让它点击代码中的那个点,然后在另一张表中运行代码。我还没能在谷歌上找到我需要的东西,而且我是新手,所以我不知道该怎么办。谢谢 VBE的项目资源管理器使您很难判断/猜测您打算调用什么特定的过程('s Code Explorer深入到过程级节点会有帮助!注意:我是这个开源项目的管理员之一),但

我这里有这个代码,它周围的代码做什么并不重要,它运行正常。但是,在突出显示的点上,我需要触发我指向的“SCP状态付款中心”表中的代码,以便在低于该点的代码之前触发运行。我不想只是放在另一个按钮或其他东西,我只想让它点击代码中的那个点,然后在另一张表中运行代码。我还没能在谷歌上找到我需要的东西,而且我是新手,所以我不知道该怎么办。谢谢

VBE的项目资源管理器使您很难判断/猜测您打算调用什么特定的过程('s Code Explorer深入到过程级节点会有帮助!注意:我是这个开源项目的管理员之一),但无论如何,看起来您需要调用位于
Sheet1
文档模块中的过程

假设您的过程如下所示:

Public Sub DoSomething()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    DoSomething
End Sub

Public Sub DoSomething()
    ' do stuff
End Sub
然后,您可以在项目中的任何位置执行以下操作:

Sheet1.DoSomething
这与您执行此操作时没有任何不同:

MsgBox "hello, world"
这是调用位于标准库函数中的公共/全局作用域函数,其完全限定名为:

VBA.Interaction.MsgBox "hello, world"
现在,如果您的过程如下所示:

Public Sub DoSomething()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    DoSomething
End Sub

Public Sub DoSomething()
    ' do stuff
End Sub
然后您就有了一个问题:它是
Private
,是一个事件处理程序。可以将事件处理程序设置为公共的,并如上所述调用,但是更好的做法是将主体拉入单独的过程中,如下所示:

Public Sub DoSomething()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    DoSomething
End Sub

Public Sub DoSomething()
    ' do stuff
End Sub
这样你就不用管事件处理程序了。工作表事件处理程序是由Excel调用的,而不是用户代码;例如,
CommandButton1\u Click
处理程序也是如此:它们应该是
Private
,由MSForms库调用,而不是由用户代码调用。让它成为在事件处理程序之外实现逻辑的习惯(并让它们调用逻辑),这是一个很好的习惯。VBE的Project Explorer使您很难判断/猜测要调用什么特定过程('s Code Explorer深入到过程级节点在这里会有所帮助!注意:我是这个开源项目的管理员之一),但无论如何,看起来您需要调用位于Sheet1文档模块中的过程

假设您的过程如下所示:

Public Sub DoSomething()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    DoSomething
End Sub

Public Sub DoSomething()
    ' do stuff
End Sub
然后,您可以在项目中的任何位置执行以下操作:

Sheet1.DoSomething
这与您执行此操作时没有任何不同:

MsgBox "hello, world"
这是调用位于标准库函数中的公共/全局作用域函数,其完全限定名为:

VBA.Interaction.MsgBox "hello, world"
现在,如果您的过程如下所示:

Public Sub DoSomething()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    DoSomething
End Sub

Public Sub DoSomething()
    ' do stuff
End Sub
然后您会遇到一个问题:它是
私有的
,并且是一个事件处理程序。可以将事件处理程序设置为
公共的
,并按上述方式调用,但是更好的做法是将主体拉入一个单独的过程中,如下所示:

Public Sub DoSomething()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    ' do stuff
End Sub
Private Sub Worksheet_Change()
    DoSomething
End Sub

Public Sub DoSomething()
    ' do stuff
End Sub

这样你就不用管事件处理程序了。工作表事件处理程序是由Excel调用的,而不是由用户代码调用的;这同样适用于例如
CommandButton1\u Click
处理程序:它们是
Private
,由MSForms库调用,而不是由用户代码调用。这使它成为在事件处理程序之外实现逻辑的习惯(让他们调用逻辑),这是一个很好的习惯。如果它不在事件中,您可以像调用任何其他子例程或函数一样调用它(parameter1,parameter2…)。如果它在事件中,请将其放入子例程或函数中,并让事件以其他子例程可以调用的方式调用该子例程或函数。只要在子例程前面加上对象名,您就可以从工作表对象中调用公共子例程。
Sheet1.subroutiname()
会起作用,因为
Sub
Function
在项目中是隐式的
Public
,除非另有规定,所以不需要添加前缀。也就是说,对于最佳实践,它可能应该在模块中。@TateGarringer为什么将它放在模块中是最佳实践?工作表是类,它背后的用户代码基本上形成了一个附加的接口-
Sheet1
是一个
工作表
,它实现了由用户代码定义的接口,因此定义
公共子
基本上就是扩展类。我通常尝试从许多其他工作表/模块调用通用代码它位于泛型模块中,而不是仅用于更干净代码的对象。这样,我就不会在每次调用后指定对象名称。它只是看起来更好。@TateGarringer-我认为关键在于“泛型代码”,我同意它可能属于一个模块。但是,如果它特定于工作表,我通常希望它显式地绑定到工作表。如果它不在事件中,您可以像调用任何其他子或函数一样调用它
子例程名称(参数1,参数2…)
。如果它在事件中,请将其放入子例程或函数中,并让事件以其他子例程可以调用的方式调用该子例程或函数。只要在子例程前面加上对象名,您就可以从工作表对象中调用公共子例程。
Sheet1.subroutiname()
会起作用,因为
Sub
Function
在项目中是隐式的
Public
,除非另有规定,所以不需要添加前缀。也就是说,对于最佳实践,它可能应该在模块中。@TateGarringer为什么将它放在模块中是最佳实践?工作表是类,它背后的用户代码基本上形成了一个附加的接口-
Sheet1
是一个
工作表
,它实现了由用户代码定义的接口,因此定义
公共子
基本上就是扩展类。我通常尝试从许多其他工作表/模块调用通用代码s位于通用模块中,而不是仅用于cle的对象中