2016-03-30 13 views
1

Deneyimli bir VBA programcısı değilim, ancak bir basketbol takımını yönetebilen bir Excel Elektronik Tablosu oluşturmaya çalışıyorum.Farklı bir kullanıcı formunda bildirilen bir dizi başvuru

İçinde 'selectedPlayers' dizisini belirttiğim birincil kullanıcı formum var. Bu birincil kullanıcı formunun ikincil kullanıcı formu 'i' zamanlarını başlatan bir döngü vardır.

Birincil kullanıcı formunun 'i' ve 'selectedPlayers' ikincil listeden erişemedim. İlk kullanıcı biçiminde görünür olmayan bir metin kutusu oluşturarak, ikincisinden başvuru yapabileceğim bir geçici çözüm bulabildim.

Her ikisini de herkese açık olarak bildirmeyi denedim, ancak ikinci kullanıcı formundan onu arayamıyorum. İlk userform için kod

kısmı:

i = 0 
Do While Not i = Int(txtNumberPlayers) 
    frmGameDataSecondary.Show 
    i = i + 1 
Loop 

ikinci userform:

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 

cevap

0

Formlar Nesneler çeşitli müthiş insanlardan büyük bilgi ton ile başlayan gerçekten iyi bir iş parçacığı vardır ve benzeri tedavi edilebilir diğer herhangi bir Sınıf modülü. Bu, onlara özellik ekleyebileceğiniz anlamına gelir. Eğer bir formdan geri bilgi aktarmanız gerekiyorsa, yapmanız gereken tek şey, ona bir başvuru kapmak, daha sonra Unload yerine Hide olacaktır. Bir diyalog gibi davranın ve çağrı kodunun onun yaratılmasını ve imha etmesini sağlayın (kodunuzun modal olduğunu varsayalım). Böyle

şey: İlk UserForm

: İkinci 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 
0

Sen parent form iç özelliklerini ilan edebilir dışından dizi manipüle edecek . child form, parent referansına sahip olmak zorundadır, bu nedenle bu özellikleri çağırabilir. HTH

Veli formu

Option Explicit 

' I have not been able to access the primary userform's 
' 'i' and 'selectedPlayers' from the secondary one 
Private selectedPlayers As Variant 

Public Function GetMyArrayValue(index) As Variant 
    GetMyArrayValue = selectedPlayers(index) 
End Function 

Public Sub SetMyArrayValue(index, newValue) 
    selectedPlayers(index) = newValue 
End Sub 

Private Sub UserForm_Click() 
    Dim i 

    i = 0 
    Do While Not i = Int(txtNumberPlayers) 
     With New secondaryUserForm 
      Set .ParentForm = Me 
      .SetIndex = i 
      .Show 
     End With 
     i = i + 1 
    Loop 
End Sub 

Private Sub UserForm_Initialize() 
    selectedPlayers = Array("A", "B", "C") 
End Sub 

Çocuk formu

Option Explicit 

Private m_parent As primaryUserForm 
Private m_index As Integer 

Public Property Let SetIndex(ByVal vNewValue As Integer) 
    m_index = vNewValue 
End Property 

Public Property Set ParentForm(ByVal vNewValue As UserForm) 
    Set m_parent = vNewValue 
End Property 

Private Sub cmdDone_Click() 
    ' frmGameData.selectedPlayers(frmGameData.i) = lbxPlayer.Value 
    m_parent.SetMyArrayValue m_index, "lbxPlayer.Value" 
    Unload Me 
End Sub 
İlgili konular