web-dev-qa-db-fra.com

Passer la variable du formulaire au module dans VBA

J'ai le bouton suivant sur un formulaire:

Private Sub CommandButton1_Click()
 Dim pass As String
 pass = UserForm1.TextBox1
 Unload UserForm1
End Sub

J'ai alors un module appelé Module1:

 Public Sub Login()

 ...

 UserForm1.Show
 driver.findElementByName("PASSWORD").SendKeys pass

 ...

End Sub

L'idée est que le mot de passe que les utilisateurs saisissent dans la zone de saisie sera attribué à la variable pass. Ce que j'ai du mal à faire, c'est de passer pass de UserForm1 dans le sous-menu Login de Module1.

J'aurais pensé ajouter quelque chose comme Module1.Login (pass) à mon formulaire avant de le décharger, mais cela ne semble rien passer. Toute aide serait très appréciée. Merci.

21
JimmyK

Ne déclarez pas la variable dans le formulaire utilisateur. Déclarez-le comme Public dans le module.

Public pass As String

Dans le Userform

Private Sub CommandButton1_Click()
    pass = UserForm1.TextBox1
    Unload UserForm1
End Sub

Dans le module

Public pass As String

Public Sub Login()
    '
    '~~> Rest of the code
    '
    UserForm1.Show
    driver.findElementByName("PASSWORD").SendKeys pass
    '
    '~~> Rest of the code
    '
End Sub

Vous pouvez également ajouter une vérification supplémentaire juste avant d'appeler le driver.find... ligne?

If Len(Trim(pass)) <> 0 Then

Cela garantira qu'aucune chaîne vierge n'est transmise.

31
Siddharth Rout

La réponse de Siddharth est Nice, mais repose sur des variables de portée mondiale. Il existe une meilleure méthode, plus conviviale pour la POO.

Un UserForm est un module de classe comme les autres - la seule différence est qu'il a un attribut caché VB_PredeclaredId Défini sur True, ce qui fait VB créer un global variable d'objet -scope nommée d'après la classe - c'est ainsi que vous pouvez écrire UserForm1.Show sans créer une nouvelle instance de la classe.

Éloignez-vous de cela et traitez votre formulaire comme un objet à la place - exposez les membres de Property Get Et retirez les contrôles du formulaire - le code appelant ne se soucie pas contrôles de toute façon:

Option Explicit
Private cancelling As Boolean

Public Property Get UserId() As String
    UserId = txtUserId.Text
End Property

Public Property Get Password() As String
    Password = txtPassword.Text
End Property

Public Property Get IsCancelled() As Boolean
    IsCancelled = cancelling
End Property

Private Sub OkButton_Click()
    Me.Hide
End Sub

Private Sub CancelButton_Click()
    cancelling = True
    Me.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = VbQueryClose.vbFormControlMenu Then
        cancelling = True
        Me.Hide
    End If
End Sub

Maintenant, le code appelant peut le faire (en supposant que l'UserForm a été nommé LoginPrompt):

With New LoginPrompt
    .Show vbModal
    If .IsCancelled Then Exit Sub
    DoSomething .UserId, .Password
End With

DoSomething serait une procédure qui nécessite les deux paramètres de chaîne:

Private Sub DoSomething(ByVal uid As String, ByVal pwd As String)
    'work with the parameter values, regardless of where they came from
End Sub
21
Mathieu Guindon