首页 > 解决方案 > 我正在循环使用带有 activex 对象的工作表,我想设置对象的属性

问题描述

尝试更改选项按钮上的背景颜色也将执行复选框

这是代码

Set sht = Worksheets(1)
Dim objX As OLEObject

For i = 1 To sht.OLEObjects.Count
    If TypeName(sht.OLEObjects(i).Object) = "OptionButton" Then
        sht.OLEObjects(i).Object = False
        sht.OLEObjects(i).BackColor = &HFFFFFF
   End If
Next i

标签: excelvbaobject

解决方案


OLEObject.Object是您的 ActiveX 控件。问题是,它的类型是Object,所以任何针对它的成员调用都将是后期绑定的,这很烦人,因为你想要的是经过编译时验证的代码,除非你是受虐狂,否则你会想要智能感知/进行成员调用时的自动完成和参数快速信息。

声明一个MSForms.CheckBox对象变量(您希望它完全限定,因为它As CheckBox只会解析为Excel.CheckBox,而您不希望这样),并且由于您正在迭代对象集合,因此您希望为此使用For Each循环。

Dim oleObj As OLEObject
For Each oleObj In sht.OLEObjects
    If TypeOf oleObj.Object Is MSForms.CheckBox Then 
        Dim axCheckBox As MSForms.CheckBox
        Set axCheckBox = oleObj.Object
        axCheckBox.Value = False
        axCheckBox.BackColor = vbWhite

    ElseIf TypeOf oleObj.Object Is MSForms.OptionButton Then
        Dim axOptionButton As MSForms.OptionButton
        Set axOptionButton = oleObj.Object
        axOptionButton.Value = False
        axOptionButton.BackColor = vbWhite

    End If
Next

显然这有点多余,所以我们重构和提取方法:

Private Sub FormatActiveXOptionButton(ByVal axControl As MSForms.OptionButton)
    axControl.Value = False
    axControl.BackColor = vbWhite
End Sub

Private Sub FormatActiveXCheckBox(ByVal axControl As MSForms.CheckBox)
    axControl.Value = False
    axControl.BackColor = vbWhite
End Sub

现在循环看起来像这样:

Dim oleObj As OLEObject
For Each oleObj In sht.OLEObjects
    Select Case True
        Case TypeOf oleObj.Object Is MSForms.CheckBox
            FormatActiveXCheckBox oleObj.Object

        Case TypeOf oleObj.Object Is MSForms.OptionButton
            FormatActiveXOptionButton oleObj.Object

    End Select
Next

推荐阅读