VBA: заполнение элемента управления ListBox ActiveX на листе, а не в пользовательской форме

Я пытаюсь заполнить список (управление ActiveX). Этот список находится на листе с надписью «Информационная панель» моей книги, а не в пользовательской форме. Я хочу заполнить его диапазоном из листа с надписью «Данные».

Моя проблема в том, что если я заполню ее в процедуре открытия рабочей книги, я получаю сообщение об ошибке, когда рабочая книга открывается, что она «Не может выполняться в режиме приостановки». Однако активных точек останова нет.

Если я заполню его в процедуре активного события рабочего листа «Панель мониторинга», он не будет заполняться, когда рабочая книга открыта. Он заполняется только в том случае, если я нажимаю на другой рабочий лист, а затем возвращаюсь к рабочему листу панели инструментов, после чего он заполняется.

Есть ли лучший способ заполнить список, чтобы он всегда был заполнен и готов к работе? У меня есть много функций vLookup, связанных со списком, и если список не заполнен, остальная часть моего кода не будет работать.

Я опубликую свои коды, которые у меня есть до сих пор. Во-первых, когда я пытаюсь заполнить список с помощью даже процедуры workbook_open. Второй — через процедуру активации рабочего листа «Панель инструментов».

Private Sub Workbook_Open()
Dim strName As String
Dim blDone As Boolean
Dim cPlanets As MSForms.ListBox
Dim vArray As Variant
Dim shtData As Worksheet
Dim wkbSolarSystem As Workbook
Set wkbSolarSystem = Application.Workbooks("workbookname.xlsm")
Set shtData = wkbSolarSystem.Worksheets("Data")
Set cPlanets = wkbSolarSystem.Worksheets("Dashboard").lstPlanets

vArray = shtData.Range("Planets").value
cPlanets.List = vArray
cPlanets.ListIndex = 3


'input box message for user when workbook opens up
strName = InputBox("Hello! Please enter your name", "Welcome!")

'check if there is a name entered via loop and if statement
Do
    If Len(strName) = 0 Then
        'if no name entered, ask user again
        MsgBox ("Please enter a valid name to continue"), vbCritical, "Valid Name Required"
        'ask user to type in name again
        strName = InputBox("Hello! Please enter your name", "Welcome!")
    Else
        'display message with information for user
        MsgBox ("Hello, " & strName)
        blDone = True
    End If
'finish loop statement
Loop Until blDone = True

Этот следующий код - это тот, который у меня есть в процедуре активации рабочего листа кода Sheet3.

Private Sub Worksheet_Activate()
Dim shtData As Worksheet
Dim wkbSolarSystem As Workbook
Set wkbSolarSystem = Application.Workbooks("workbookname.xlsm")
Set shtData = wkbSolarSystem.Worksheets("Data")

lstPlanets.List = shtData.Range("Planets").value
lstPlanets.ListIndex = 3


End Sub

person Rosario    schedule 18.04.2016    source источник
comment
Вы пытались сделать общедоступную функцию на листе Dashboard, которая заполняет список, и вызывать эту функцию в Workbook_Open()?   -  person Doktor OSwaldo    schedule 18.04.2016
comment
Я тоже пробовал это, но он все равно не будет заполняться при открытии книги. Открытая функция addListsWorksheetActivate()   -  person Rosario    schedule 18.04.2016


Ответы (2)


Вы объявляете cPlanets как MSForms.ListBox, но в своем вопросе вы говорите, что работаете со списком ActiveX на листе. Таким образом, вы должны объявить cPlanets как объект, например:

Dim cPlanets As Object
Set cPlanets = wkbSolarSystem.Worksheets("Dashboard").lstPlanets
person Excel Developers    schedule 18.04.2016
comment
Спасибо, я изменил это на ваше предложение сейчас. Тем не менее, он все равно не заполнит его, если я наберу это в процедуре workbook_open, потому что при открытии он ошибается, думая, что находится в режиме останова, но в режиме останова нет никаких строк кода. - person Rosario; 18.04.2016

Я попробовал этот код на другом компьютере, и он работает. Похоже, проблема была в конфигурации компьютера. Код отлично работает на нескольких разных компьютерах.

person Rosario    schedule 20.04.2016