在同一函数中创建和编辑 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 的帮助。