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
我的代码循环遍历 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