我的代码循环遍历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
时遇到的错误是类型不匹配。
答案 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