【问题标题】:write One code for two controls? For example Two CommandButton为两个控件编写一个代码?例如两个命令按钮
【发布时间】:2018-06-08 22:07:15
【问题描述】:

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

问题来了,有什么方法可以只为所有这些编写一个代码?

如果答案是肯定的,我可以设置范围变量吗?例如:CommandButton1: range("A1").value = "Good", CommandButton2: range("A2").value = "Good"。

非常感谢您的回复。

【问题讨论】:

    标签: excel controls userform vba


    【解决方案1】:

    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

    【讨论】:

    • Hello Andy G 您的回答大大缩短了我在 excel vba 中的代码。谢谢。
    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 2022-01-19
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多