在同一函数中创建和编辑OLEObject时发生编译器错误

时间:2019-01-21 15:53:28

标签: excel vba activex

运行该函数时,似乎在尝试添加项目之前未创建DropDown菜单,因此遇到了编译时错误:

  

未找到方法或数据成员

突出显示SomeNameToo标识符。

screenshot of compile error

如果我将两行“ 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

1 个答案:

答案 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 的帮助。