Excel 从VBA中的多个按钮调用同一个子节点

Excel 从VBA中的多个按钮调用同一个子节点,excel,vba,Excel,Vba,我在同一列但不同行的spreadhseet上有多个按钮(活动x)。这些按钮捕获活动的开始时间。 如果按下按钮1,则其旁边的单元格应按当前时间填充。 如果按下按钮2,则其旁边的单元格应按当前时间填充。等等 我用VBA编写了一个SUB,如下所示: Private Sub StartTimer_Click() Range("I4").Value = Now End Sub 我不想为每个按钮操作重复此代码。请告诉我如何使其成为动态的。创建一个标准模块,并将过程放在其中。 虽然可以在私有模块中共

我在同一列但不同行的spreadhseet上有多个按钮(活动x)。这些按钮捕获活动的开始时间。 如果按下按钮1,则其旁边的单元格应按当前时间填充。 如果按下按钮2,则其旁边的单元格应按当前时间填充。等等

我用VBA编写了一个SUB,如下所示:

Private Sub StartTimer_Click()
    Range("I4").Value = Now
End Sub

我不想为每个按钮操作重复此代码。请告诉我如何使其成为动态的。

创建一个标准模块,并将过程放在其中。

虽然可以在私有模块中共享过程,但最好将任何共享过程放在共享模块中

在VBA编辑器中,单击插入模块

粘贴到其中,并给它一个唯一的名称。使用您的示例,您可以执行以下操作:

Public Sub SetTimeValue()
    Range("I4").Value = Now 
End Sub
…然后从另一个公用存根调用此公用存根,如:

Private Sub StartTimer_Click()
    SetTimeValue
End Sub
…以及您需要调用代码的任何其他位置

我假设您关心的实际过程有不止一行代码,否则重复复制它并不是一个真正的问题


更多信息:
  • MSDN:
  • 办公室支助:
  • 奇普·皮尔森:
  • 电源预售表:
  • MVP:

创建一个标准模块,并将程序放在其中。

虽然可以在私有模块中共享过程,但最好将任何共享过程放在共享模块中

在VBA编辑器中,单击插入模块

粘贴到其中,并给它一个唯一的名称。使用您的示例,您可以执行以下操作:

Public Sub SetTimeValue()
    Range("I4").Value = Now 
End Sub
…然后从另一个公用存根调用此公用存根,如:

Private Sub StartTimer_Click()
    SetTimeValue
End Sub
…以及您需要调用代码的任何其他位置

我假设您关心的实际过程有不止一行代码,否则重复复制它并不是一个真正的问题


更多信息:
  • MSDN:
  • 办公室支助:
  • 奇普·皮尔森:
  • 电源预售表:
  • MVP:

    • 一个简单的WithEvents示例:

      在类(命名为clsButtons)中:

      在sheetcode(带按钮的代码)中:


      一个简单的WithEvents示例:

      在类(命名为clsButtons)中:

      在sheetcode(带按钮的代码)中:


      尝试用谷歌搜索“VBA控件数组”,如果这些确实是ActiveX按钮(与窗体按钮相反),则每个按钮都会有不同的事件处理程序,除非您使用。因此,如果您没有,因此您有多个处理程序,那么唯一的优化就是在所有处理程序中使用相同的代码,而不是略有不同的代码。为此,您只需要查找要从button对象更改的单元格。您可以按照EvR的建议,以按钮的名称对其进行编码,也可以使用按钮的
      TopLeftCell
      作为要偏移的地标。尝试通过谷歌搜索“VBA控件数组”如果这些确实是ActiveX按钮(与表单按钮相反),则每个按钮都会有不同的事件处理程序,除非您使用。因此,如果您没有,因此您有多个处理程序,那么唯一的优化就是在所有处理程序中使用相同的代码,而不是略有不同的代码。为此,您只需要查找要从button对象更改的单元格。您可以按照EvR的建议,以按钮的名称对其进行编码,也可以使用按钮的
      TopLeftCell
      作为要偏移的地标。感谢您的回复。问题是:我有多个按钮StartTimer1、StartTimer2、StartTimer3。。。。如何为每个按钮调用StartTimer\u Click()。每次通话时,手机都必须是不同的。在本例中:范围(“I4”).Value=Now。对于第二个按钮,它可以是范围(“I7”)。值=现在。对于第三个按钮,它可能是Range(“I10”).Value=Now如果它实际上只是一行代码(比如
      Range(“I4”).Value=Now
      ),那么您根本不需要任何其他过程。只需将这一行作为每个按钮的代码。更多信息请参见我提供的链接。最后一个链接可能对您特别有用。谢谢您的回复。问题是:我有多个按钮StartTimer1、StartTimer2、StartTimer3。。。。如何为每个按钮调用StartTimer\u Click()。每次通话时,手机都必须是不同的。在本例中:范围(“I4”).Value=Now。对于第二个按钮,它可以是范围(“I7”)。值=现在。对于第三个按钮,它可能是Range(“I10”).Value=Now如果它实际上只是一行代码(比如
      Range(“I4”).Value=Now
      ),那么您根本不需要任何其他过程。只需将这一行作为每个按钮的代码。更多信息请参见我提供的链接。最后一个链接可能对您特别有用。根据按钮推断要更改的单元格的另一种方法是使用按钮的
      TopLeftCell
      ,因为按钮总是在应该更改的单元格旁边。根据按钮推断要更改的单元格的另一种方法是使用按钮的
      TopLeftCell
      ,由于按钮总是在单元格旁边,因此它应该更改。