excel - 我正在循环使用带有 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
解决方案
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
推荐阅读
- javascript - 从js发送到firebase时出现JSON字符集问题
- python-3.x - 如何根据条件 pd.Dataframe 获取行名和列名
- python - Python:Parse String for Tags 将其划分为子字符串以填充 json 文件
- html - 贝宝订阅设置
- javascript - 未捕获的类型错误:firebase.messaging 不是函数
- java - 使用 Amazon SQS 的多个消费者
- regex - 查找两个字符之间的正则表达式
- ef-core-2.2 - 递归引用模型中的两个外键
- php - Travis CI 上的 Symfony 单元测试失败
- html - 仅更改一个 Bootstrap 3 工具提示的大小