excel - 在同一函数中创建和编辑 OLEObject 时出现编译器错误
问题描述
运行该函数时,它似乎在尝试添加项目之前没有创建 DropDown 菜单,因此它会遇到编译时错误:
找不到方法或数据成员
突出显示SomeNameToo
标识符。
如果我将两行“AddItem”放到另一个函数中,然后再运行,那么就没有问题了,这两行就被添加了。
有没有办法让它在运行以下代码之前创建对象?这为我节省了很多功能。
Sub hey()
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, Left:=0, Top:=0, Width:=100, Height:=20).Name = "SomeNameToo"
Sheet1.SomeNameToo.AddItem "Item 1"
Sheet1.SomeNameToo.AddItem "Item 2"
End Sub
解决方案
该对象在编译时不存在;SomeNameToo
编译代码时不存在,仅在OLEObjects.Add
方法执行后才存在。
该Add
方法返回对正在创建的对象的引用。
您正在访问该对象,一次 - 在这里:
.Name = "SomeNameToo"
...然后物体就在空中,在该程序的范围内没有任何东西可以抓住它。
声明一个OLEObject
变量来保存该引用:
Dim oleControl As OLEObject
Set oleControl = ActiveSheet.OLEObjects.Add(...)
然后使用该对象:
oleControl.Name = "SomeNameToo"
或者,使用With
块捕获返回的引用 - 然后您不需要局部变量:
With ActiveSheet.OLEObjects.Add(...)
.Name = "SomeNameToo"
End With
现在,您不能AddItem
针对该对象调用,因为 anOLEObject
不是 aComboBox
并且对方法一无所知AddItem
。您想使用包装的 MSFormsComboBox
控件 - 那是OLEObject.Object
:
With ActiveSheet.OLEObjects.Add(...)
.Name = "SomeNameToo"
With .Object
.AddItem "Item 1"
.AddItem "Item 2"
End With
End With
或者,使用局部变量:
Dim oleControl As OLEObject
Set oleControl = ActiveSheet.OLEObjects.Add(...)
oleControl.Name = "SomeNameToo"
Dim msFormsControl As MSForms.ComboBox
Set msFormsControl = oleControl.Name
msFormsControl.AddItem "Item 1"
msFormsControl.AddItem "Item 2"
请注意,如果没有局部变量,您将针对 进行编码Object
,这意味着所有内容都是后期绑定的,无法在编译时进行验证:错字将导致错误 438。
使用局部变量和声明的类型,一切都经过编译器验证,您可以在键入时获得IntelliSense协助。
推荐阅读
- swift - 查询具有多个值的字符串参数
- hibernate - JOIN期间子属性的Spring数据JPA @EntityGraph
- android - com.google.android.gms.maps.CameraUpdate 在空对象引用上
- django - 在高级自定义模板标签中获取请求上下文
- python - SQLALchemy:根据列键/名称获取行元素
- python - 不太常见的词显得更大 - Python中的WordCloud
- sql - 仅当所有连接行的条件都为真时才加入其他表
- javascript - React Native 无法访问 Cloud Firestore 后端
- angular - Angular 6:页脚(共享)组件中的 mat-toolbar 和 mat-toolbar-row 显示不正确(但没有任何错误)?
- python-2.7 - Flask 无法接收分块数据