Arrays 引用以其他用户窗体声明的数组

Arrays 引用以其他用户窗体声明的数组,arrays,vba,excel,userform,Arrays,Vba,Excel,Userform,我不是一个经验丰富的VBA程序员,但我一直在尝试创建一个能够管理篮球队的Excel电子表格 在其中,我有一个主用户表单,其中声明了一个数组“selectedPlayers”。 此主用户表单有一个for循环,用于启动次用户表单“i”次 我无法从辅助用户窗体访问主用户窗体的“I”和“selectedPlayers”。 通过在第一个用户表单中创建一个不可见的文本框,我可以从第二个用户表单中引用该文本框,从而找到解决“I”问题的方法 我已经尝试将它们都声明为public,但是我无法从第二个userfor

我不是一个经验丰富的VBA程序员,但我一直在尝试创建一个能够管理篮球队的Excel电子表格

在其中,我有一个主用户表单,其中声明了一个数组“selectedPlayers”。 此主用户表单有一个for循环,用于启动次用户表单“i”次

我无法从辅助用户窗体访问主用户窗体的“I”和“selectedPlayers”。 通过在第一个用户表单中创建一个不可见的文本框,我可以从第二个用户表单中引用该文本框,从而找到解决“I”问题的方法

我已经尝试将它们都声明为public,但是我无法从第二个userform调用它

第一个userform的部分代码:

i = 0
Do While Not i = Int(txtNumberPlayers)
    frmGameDataSecondary.Show
    i = i + 1
Loop
Private Sub cmdDone_Click()
    frmGameData.selectedPlayers(frmGameData.i) = lbxPlayer.Value
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    With Me.lbxPlayer

    For Each LR In LO.ListRows
        exitSequence = False

        For k = 1 To Int(frmGameData.txtNumberPlayers)
            If frmGameData.selectedPlayers(k) = blablabla.Value Then
                exitSequence = True
            End If
        Next k

        If !exitSequence Then
            .AddItem blablabla.Value
        End If

    Next LR

    End With
End Sub
第二个用户表单:

i = 0
Do While Not i = Int(txtNumberPlayers)
    frmGameDataSecondary.Show
    i = i + 1
Loop
Private Sub cmdDone_Click()
    frmGameData.selectedPlayers(frmGameData.i) = lbxPlayer.Value
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    With Me.lbxPlayer

    For Each LR In LO.ListRows
        exitSequence = False

        For k = 1 To Int(frmGameData.txtNumberPlayers)
            If frmGameData.selectedPlayers(k) = blablabla.Value Then
                exitSequence = True
            End If
        Next k

        If !exitSequence Then
            .AddItem blablabla.Value
        End If

    Next LR

    End With
End Sub

主要的问题是,数组内容在sub完成后被清除

我也在胡思乱想这个想法,有一个非常好的帖子,我从很多很棒的人那里获得了大量的信息


VBA中的表单是对象,可以像处理任何其他类模块一样处理。这意味着您可以向其添加属性。如果需要从表单传回信息,只需获取对它的引用,然后
Hide
it,而不是
Unload
it。把它当作一个对话框,让调用代码处理它的创建和销毁(我从代码中假设它是模态的)

大概是这样的:

在第一个UserForm中:

For i = 0 To 1
    Dim second As frmGameDataSecondary
    Set second = New frmGameDataSecondary
    second.Show
    'Execution suspends until the second form is dismissed.
    selectedPlayers(i) = second.Player
    Unload second
Next i
Private mPlayer As String

'This is where your returned information goes.
Public Property Get Player() As String
    Player = mPlayer
End Property

Private Sub cmdDone_Click()
    mPlayer = lbxPlayer.Value
    'Control passes back to the caller, but the object still exists.
    Me.Hide
End Sub
在第二个用户表单中:

For i = 0 To 1
    Dim second As frmGameDataSecondary
    Set second = New frmGameDataSecondary
    second.Show
    'Execution suspends until the second form is dismissed.
    selectedPlayers(i) = second.Player
    Unload second
Next i
Private mPlayer As String

'This is where your returned information goes.
Public Property Get Player() As String
    Player = mPlayer
End Property

Private Sub cmdDone_Click()
    mPlayer = lbxPlayer.Value
    'Control passes back to the caller, but the object still exists.
    Me.Hide
End Sub

您可以在父窗体内部声明属性,该窗体将从外部操作数组。
子表单
需要引用父表单,以便调用此属性。嗯

父窗体

子窗体