Передача массива из модуля в список пользовательских форм в VBA - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь передать предопределенный массив в модуле в список пользовательских форм.

Я назначил массив как общедоступную переменную внутри пользовательской формы и попытался назначить его из модуля.

Вот код для модуля

Sub TestList()

Dim ArrTest As Variant

'Code to populate the array would go here in real application

ArrTest = Array("A", "B", "C")
UserForm1.ListArray = ArrTest
UserForm1.Show

End Sub

А вот код для пользовательской формы

Public ListArray As Variant

Private Sub UserForm_Initialize()

    ListBox1.List = ListArray

End Sub

Когда я выполняю шаг по коду, пользовательская форма открывается, когда ондостигает назначения ListArray в модуле, однако в UserForm массив назначается пустым, встречает и встречает ошибку времени выполнения «381» при достижении генерации списка.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Тим дал вам объяснение, почему ваш код не работал вместе с возможным решением

Возможным решением, сохраняющим ваш код, будет установка массива в событии Userform Activate, которое запускается при *Метод 1004 *, следовательно, после инициализации пользовательской формы:

Private Sub UserForm_Activate() ' <- use 'Activate' event instead of 'Initialize'
    ListBox1.List = ListArray
End Sub

Более того, рекомендуется явно создавать экземпляры объектов Userform

Тим уже показал вам путь, а вот другой способ:

With New UserForm1 ' instantiate and reference a new object of your Userfom1 class
    .ListArray = ArrTest
    .Show
End With ' here the new instance gets disposed
0 голосов
/ 27 сентября 2019

Initialize вызывается, как только вы создаете экземпляр UserForm1 (в этом случае вы автоматически создаете этот экземпляр, просто ссылаясь на него).Таким образом, ваше назначение списка еще не произошло при запуске метода Initialize.

Лучше поместить такие вещи в метод Public в вашей форме и вызвать его явно.

'userform
Public Sub SetList(lst)
    Me.ListBox1.List = lst
End Sub


'regular module
Sub TestList()

    Dim ArrTest As Variant
    Dim frm As UserForm1

    ArrTest = Array("A", "B", "C")

    Set frm = New UserForm1
    frm.SetList ArrTest
    frm.Show

End Sub

См. Также: https://rubberduckvba.wordpress.com/2017/10/25/userform1-show/

...