在同一函数中创建和编辑 OLEObject 时出现编译器错误
Compiler Error when creating and editing OLEObject in same function
当 运行 启用该函数时,它似乎在尝试添加项目之前没有创建 DropDown 菜单,因此它 运行 进入了编译时错误:
Method or data member not found
突出显示 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
方法 returns 对正在创建的对象的引用。
您正在访问该对象,一次 - 此处:
.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 的帮助。
当 运行 启用该函数时,它似乎在尝试添加项目之前没有创建 DropDown 菜单,因此它 运行 进入了编译时错误:
Method or data member not found
突出显示 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
方法 returns 对正在创建的对象的引用。
您正在访问该对象,一次 - 此处:
.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 的帮助。