代码之家  ›  专栏  ›  技术社区  ›  kan

为两个控件编写一个代码?例如,双命令按钮

  •  0
  • kan  · 技术社区  · 7 年前

    在我的用户表单中,有CommandButton1、2、3、4、5、6。。。。。。。。,他们都做同样的任务,例如: Range("A1").value = "Good" 。

    问题来了,我有没有办法只为所有这些代码编写一个代码?

    如果答案是肯定的,我可以使范围变为变量吗?例如:CommandButton1:范围(“A1”)。value=“良好”,命令按钮2:范围(“A2”)。value=“好”

    非常感谢您的回复。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andy G    7 年前

    VBA没有复杂的事件模型。相反,您可以创建并调用公共子过程,传递子过程确定其结果所需的特定参数:

    Private Sub CommandButton1_Click()
        Call Clicker("A1")
    End Sub
    
    Private Sub CommandButton2_Click()
        Call Clicker("A2")
    End Sub
    
    Private Sub Clicker(sRange As String)
        'MsgBox sRange
        Range(sRange).Value = "Good"
    End Sub
    

    参数不必是字符串,它可以是 Range .

    或者可以将值“A1”等作为表单的属性存储和检索(而不是将其作为参数传递)。

    一种可能的替代方法是检查 ActiveControl 然后相应地采取行动:

    Private Sub Clicker()
        MsgBox ActiveControl.Name
        'do something according to the name
    End Sub
    

    我不喜欢这一点,更喜欢第一种选择,因为值很可能特定于单击的按钮(并且按钮名称可能会更改)。也可以在没有激活相关按钮的情况下调用代码。

    第三种选择是创建自己的自定义类和事件模型,这需要进行一些研究。


    下面是一个使用UserForm的自定义属性的示例:

    Private sCellOfInterest As String
    
    Private Property Get CellOfInterest() As String
        CellOfInterest = sCellOfInterest
    End Property
    
    Private Property Let CellOfInterest(ByVal sRange As String)
        sCellOfInterest = sRange
    End Property
    
    
    Private Sub CommandButton1_Click()
        CellOfInterest = "A1"
        Call Clicker2
    End Sub
    
    Private Sub CommandButton2_Click()
        CellOfInterest = "A2"
        Call Clicker2
    End Sub
    
    
    Private Sub Clicker2()
        MsgBox CellOfInterest
    End Sub
    

    同样,属性可以是对象而不是字符串 Property Set 将使用而不是 Property Let .