VBA: 将通用 OLEObject 分配给 CheckBox 变量

VBA: Assign a generic OLEObject to a CheckBox variable

我的代码循环遍历 Excel 工作簿中当前 sheet 中的所有现有 OLEObject。我希望它找到一个特定的(基于传递给 sub 的名称),它是 always 一个 CheckBox 并将其分配给 CheckBox 类型的变量。

注意:其他对象并非都是复选框,因此是通用的 OLEObject 类型。

调用 sub 的示例代码,显示名称示例:

HandleCheckBoxClick("chkAddSummary")

寻找这个特定对象的子:

Sub HandleCheckBoxClick(nm As String)

    Dim o As OLEObject
    Dim cb As CheckBox

    For Each o In Me.OLEObjects
        If o.name = nm Then
            Set cb = o
        End If
    Next o

End Sub

我在 Excel VBA: how to cast a generic control object into a ComboBox object? 发现了一个非常相似的问题,但它指的是表单控件(不是 ActiveX 控件)。我尝试了答案中给出的方法,看它是否可以在两种控件类型之间转移,但没有成功。

我想这样做的原因与我提到的问题的提问者相似 - 我不能将 CheckBox.Value 之类的方法与通用 OLEObject 变量一起使用。

我也尝试过使用 OLEObject.progID 方法来确保 o 是一个复选框对象。我在尝试 Set cb = o 时遇到的错误是类型不匹配。

我找不到(到目前为止)如何将它分配给 CheckBox,我找到了如何将它分配给 OLEObject 变量(如果对您有帮助的话)。

Sub HandleCheckBoxClick(nm As String)

Dim o           As OLEObject
Dim CB          As CheckBox
Dim oleObj      As OLEObject

' loop though all OLEObjects in "Sheet2" >> modify to your sheet name
For Each o In Sheets("Sheet2").OLEObjects
    If TypeName(o.Object) = "CheckBox" Then
        Debug.Print o.Name

        ' if you have more then 1 CheckBox
        If o.Name = nm Then
            Set oleObj = o
'            Set CB = o.Select
        End If
    End If
Next o

' just to test the options with OLEObject variable
With t
    t.Top = 100
    If t.Object.Value = True Then
        MsgBox "CheckBoX " & nm & " is selected"
    Else
        MsgBox "CheckBoX " & nm & " is not selected"
    End If
End With

End Sub

当声明为 MSForms.CheckBox 时,应该可以分配 o.Object.

Sub test()
    HandleCheckBoxClick "chkAddSummary"
End Sub

Sub HandleCheckBoxClick(nm As String)

    Dim o As OLEObject
    Dim CB As MSForms.CheckBox

    For Each o In Me.OLEObjects
        If o.Name = nm Then
            Set CB = o.Object
        End If
    Next o

End Sub

这对我获取复选框状态很有帮助

Dim checkBox1 As Object
Set checkBox1 = Sheet1.OLEObjects("CheckBox1").Object
MsgBox checkBox1.Value