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.
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.
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
Où 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