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