Set cMyListBox = Sheets("Resources & Process").arr(x) 'HERE IS THE ISSUE
Сначала объявите переменную Worksheet
для этого листа; свойство Workbook.Sheets
возвращает Object
, поэтому все эти вызовы членов неявно связаны с поздним связыванием, и вы кодируете с завязанными глазами без помощи компилятора.
Dim sheet As Worksheet
Set sheet = ActiveWorkbook.Worksheets("Resources & Process")
Обратите внимание на квалификатор ActiveWorkbook
: если вы используйте вместо этого указанный c Workbook
объект, используйте его. Но всегда учитывайте квалификацию вызовов Workbook
, иначе вы неявно ссылаетесь на то, чем является ActiveWorkbook
, и в конечном итоге это не будет ожидаемая книга.
Теперь, sheet.arr(x)
isn ' не будет работать, так как IntelliSense теперь показывает вам, когда вы набираете этот .
оператор точки: объект Worksheet
должен будет предоставить индексированное свойство с именем arr
, чтобы это работало.
Что вы хотите сделать, это получить OLEObject
с именем независимо от значения arr(x)
.
Вы получаете OLE-объекты из свойства Worksheet.OLEObjects
:
Dim oleControl As OLEObject
Set oleControl = sheet.OLEObjects(arr(x))
Если это удастся, вы нашли свой элемент управления MSForms - но он обернут в объект OLE, и теперь нам просто нужно развернуть его:
Set cMyListBox = oleControl.Object
Если это не удалось элемент управления MSForms несовместим с объявленным типом cMyListBox
. Но теперь вы получаете IntelliSense и проверку во время компиляции для вызовов участников против него: если вы наберете cMyListBox.
, и есть Activate
член, то вызов должен быть действительным во время выполнения.