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

时间:2016-09-08 12:10:53

标签: vba checkbox activex controls ole

我的代码循环遍历Excel工作簿中当前工作表中的所有现有OLEObject。我希望它找到一个特定的(基于传递给sub的名称)总是一个CheckBox并将其分配给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时遇到的错误是类型不匹配。

3 个答案:

答案 0 :(得分:1)

当声明为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

答案 1 :(得分:0)

我无法找到(到目前为止)如何将其分配给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

答案 2 :(得分:0)

这对我有用以获取复选框状态

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