Область действия переменной UserForm: передача значений 2D-массива из userform2 в userform1 - PullRequest
0 голосов
/ 23 января 2019

У меня проблема с передачей 2D-массива между двумя пользовательскими формами.

Когда я нажимаю CommandButton в userform1, он открывает userform2.Затем я нажимаю CommandButton в userform2 для создания 2D-массива.После этого я завершаю userform2 и хочу перевести мой 2D-массив в userform1.

Моя лучшая попытка - вызвать функцию в userform1 событии click.Я поместил эту функцию в модуль userform2.Но моя userform2 функция не видит двумерный массив из других подпрограмм в userform2.Private Sub userform_terminate() может видеть этот 2D-массив, созданный в Private Sub CommandButton1_Click(), но моя функция этого не делает.

userform1:

Private Sub CommandButton1_Click()
    dim results()     
    results = userform2.get2dArray()
End Sub

userform2:

Private myArray()

Private Sub CommandButton1_Click()
    ReDim myArray(1 To 2, 1 To 2)
    myArray(1, 1) = "arg1"
    myArray(2, 1) = "arg2"
    myArray(1, 2) = "arg3"
    myArray(2, 2) = "arg4"
End Sub

Private Sub userform_terminate() 
   'here i can see every args in myArray
   ...
end sub

Function get2dArray() 
    'that function I called from userform1

    userform2.show vbModal
    get2dArray = myArray 'but myArray is empty
End Function

Я хочу перевести myArray из userform2 обратно в основную форму userform1.

Основная проблема в том, что userform2.get2dArray не видит приватную переменную myArray в userform2 модуле.

Сделать глобальным myArray также невозможно.

1 Ответ

0 голосов
/ 23 января 2019

Используйте общедоступную функцию в стандартном модуле (не в пользовательской форме), который принимает необязательный параметр (ваш 2D-массив).

Параметр затем сохраняется в функции как статическая переменная .При следующем вызове функции, если параметр отсутствует, вернуть возвращенную статическую переменную.Вот пример:

Public Function store2DArray(Optional my2DArray As Variant) As Variant
    Static storedArray As Variant

    If IsMissing(my2DArray) Then
        store2DArray = storedArray
    Else
        storedArray = my2DArray
    End If
End Function

Тогда для хранения массива будет использоваться следующее:

Sub Userform2Button1_Click()
     store2DArray myArray
End Sub

Вот как вы получите массив:

Sub Userform1Button2_Click()
    myArray = store2DArray
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...