首页 > 解决方案 > 在同一函数中创建和编辑 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

标签: excelvbaactivex

解决方案


该对象在编译时不存在;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协助。


推荐阅读