visual tipos operador globales funcion div vba excel-vba module userform excel

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.