运行该函数时,似乎在尝试添加项目之前未创建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
答案 0 :(得分:2)
该对象在编译时不存在;只有在执行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
,因为OLEObject
不是ComboBox
,并且对AddItem
方法一无所知。您要使用包装的MSForms ComboBox
控件-即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 的帮助。