Объект не существует во время компиляции; 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 , чтобы помочь при вводе.