Ошибка компилятора при создании и редактировании OLEObject в одной и той же функции - PullRequest
0 голосов
/ 21 января 2019

При запуске функции кажется, что она не создает меню 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 голосов
/ 21 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...