确定VBA中的Control X复选框名称

时间:2017-06-19 01:53:50

标签: excel-vba checkbox activex vba excel

有人能告诉我确定controlX复选框名称的语法是什么? 我有大约4个复选框,这可能会增长,所以我想要一种动态传递复选框名称的方法,而不是写相同的执行4-9次。

我的目的是将复选框名称作为变量传递,因此我不必为每个复选框重复以下代码。此外,有谁知道如何将命名范围引用到特定的复选框?我到目前为止的代码是:

Sub CheckBox1_Click()

Application.ScreenUpdating = False

Dim strCheck As String
strCheck = CheckBox1.Value

If strCheck = True Then

    Range("RevAssp_CCV").Select
    Selection.EntireRow.Hidden = False

   Else
    Range("RevAssp_CCV").Select
    Selection.EntireRow.Hidden = True


End If

End Sub

提前致谢

1 个答案:

答案 0 :(得分:0)

最简单的方法是创建一个自定义包装类,创建所述类的对象数组,然后挂钩到那里的事件。 然后,您可以(例如)检查标题并将NamedRange.EntireRow的“隐藏”设置为等于该值(例如,检查是不可见的,未检查是否可见)

最基本的实现如下:

CustomCheckBox类模块:

Private WithEvents p_chkBox As MSForms.checkbox
Public Property Let box(value As MSForms.checkbox)
    Set p_chkBox = value
End Property
Public Property Get box() As MSForms.checkbox
    Set box = p_chkBox
End Property
Private Sub p_chkBox_Click()
    Range(p_chkBox.Caption).EntireRow.Hidden = p_chkBox.value
End Sub

在常规模块中:

Public cCheckBox() As CustomCheckBox
Sub Test()
Dim ws As Worksheet
Dim oleObj As OLEObject
Dim i As Integer
i = 0
For Each ws In ThisWorkbook.Worksheets
    For Each oleObj In ws.OLEObjects
        If TypeName(oleObj.Object) = "CheckBox" Then
            ReDim Preserve cCheckBox(0 To i)
            Set cCheckBox(i) = New CustomCheckBox
            cCheckBox(i).box = oleObj.Object
            i = i + 1
        End If
    Next oleObj
Next ws
End Sub

常规模块将所有复选框放入1个数组中,这是一个公共变量,因此即使代码运行后它也可用。您还可以将此代码作为Private Sub Workbook_Open放在工作簿模块中,以确保在所有情况下都能正确初始化复选框。

请记住,如果Checkbox标题的命名范围不存在,则会抛出错误。

回到你的例子,你现在可以在你的工作表上添加两个复选框,并将第一个的标题设置为“RevAssp_CCV”,将第二个标题设置为你想要切换的任何其他命名范围。