operador - tipos de variables vba excel
Pasando variable de forma a módulo en VBA (2)
Tengo el siguiente botón en un formulario:
Private Sub CommandButton1_Click()
Dim pass As String
pass = UserForm1.TextBox1
Unload UserForm1
End Sub
Entonces tengo un módulo llamado Module1:
Public Sub Login()
...
UserForm1.Show
driver.findElementByName("PASSWORD").SendKeys pass
...
End Sub
La idea es cualquier contraseña que ingresen los usuarios en el cuadro de entrada que se asignará al pass
variable. Sin embargo, lo que tengo problemas para hacer es pasar el pass
de UserForm1 al sub de inicio de sesión del Module1.
Pensé que agregar algo como Module1.Login (pass)
a mi formulario antes de descargarlo funcionaría, sin embargo, eso no parece pasar nada. Cualquier ayuda sería muy apreciada. Gracias.
La respuesta de Siddharth es agradable, pero se basa en variables de ámbito global. Hay una manera mejor, más amigable para OOP.
Un UserForm es un módulo de clase como cualquier otro. La única diferencia es que tiene un atributo VB_PredeclaredId
oculto establecido en True
, lo que hace que VB cree una variable de objeto de alcance global llamada después de la clase. Así es como puede escribir UserForm1.Show
sin crear. Una nueva instancia de la clase.
Aléjese de esto y trate su formulario como un objeto en su lugar: exponga los miembros de Property Get
y abstraiga los controles del formulario. El código de llamada no se preocupa por los controles de todos modos
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
Ahora el código de llamada puede hacer esto (asumiendo que el UserForm fue nombrado LoginPrompt
):
With New LoginPrompt
.Show vbModal
If .IsCancelled Then Exit Sub
DoSomething .UserId, .Password
End With
Donde DoSomething
sería un procedimiento que requiere los dos parámetros de cadena:
Private Sub DoSomething(ByVal uid As String, ByVal pwd As String)
''work with the parameter values, regardless of where they came from
End Sub
No declarar la variable en el formulario de usuario. Declara como Public
en el módulo.
Public pass As String
En el formulario de usuario
Private Sub CommandButton1_Click()
pass = UserForm1.TextBox1
Unload UserForm1
End Sub
En el modulo
Public pass As String
Public Sub Login()
''
''~~> Rest of the code
''
UserForm1.Show
driver.findElementByName("PASSWORD").SendKeys pass
''
''~~> Rest of the code
''
End Sub
Es posible que también desee agregar una verificación adicional justo antes de llamar a la línea driver.find...
If Len(Trim(pass)) <> 0 Then
Esto asegurará que no se pase una cadena en blanco.