UserForm 变量范围:将 2D 数组值从 userform2 传输到 userform1

UserForm variable scope: transfer 2D array values from userform2 to userform1

我在两个用户窗体之间传输二维数组时遇到问题。

当我单击 userform1 中的 CommandButton 时,它将打开 userform2。然后我单击 userform2 中的 CommandButton 以创建二维数组。在此之后我终止 userform2 并想将我的二维数组转移到 userform1.

我最好的尝试是在 userform1 单击事件中调用一个函数。我把这个函数放到了 userform2 模块中。但是我的 userform2 的函数在 userform2 中看不到另一个 subs 的二维数组。 Private Sub userform_terminate() 可以看到这个在 Private Sub CommandButton1_Click() 中创建的二维数组,但我的函数看不到。

用户表单 1:

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

用户表单2:

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

我想将 myArrayuserform2 转回主窗体 userform1

主要问题是userform2.get2dArrayuserform2模块中没有看到私有变量myArray

使 myArray 全局化也是不可能的。

在标准模块(而不是用户窗体)中使用 public 函数,该函数采用可选参数(您的二维数组)。

然后将参数作为 static variable 存储在函数中。下次调用该函数时,如果参数丢失,则 return 存储的静态变量。这是示例:

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