我在表格上有以下按钮:
Private Sub CommandButton1_Click()
Dim pass As String
pass = UserForm1.TextBox1
Unload UserForm1
End Sub
然后我有一个名为Module1的模块:
Public Sub Login()
...
UserForm1.Show
driver.findElementByName("PASSWORD").SendKeys pass
...
End Sub
这个想法是用户输入到输入框的任何密码都将被分配给变量pass
。然而,我遇到的麻烦是将pass
从UserForm1传递到Module1的Login子目录。
我想在我卸载它之前向我的表单添加Module1.Login (pass)
之类的东西会起作用,但是这似乎没有通过任何东西。任何帮助将非常感激。感谢。
答案 0 :(得分:30)
不要在userform中声明变量。在模块中将其声明为Public
。
Public pass As String
在Userform
中Private Sub CommandButton1_Click()
pass = UserForm1.TextBox1
Unload UserForm1
End Sub
在模块中
Public pass As String
Public Sub Login()
'
'~~> Rest of the code
'
UserForm1.Show
driver.findElementByName("PASSWORD").SendKeys pass
'
'~~> Rest of the code
'
End Sub
您可能还想在调用driver.find...
行之前添加其他检查?
If Len(Trim(pass)) <> 0 Then
这将确保不传递空字符串。
答案 1 :(得分:20)
Siddharth的答案很好,但依赖于全局范围的变量。这是一种更好,更友好的OOP方式。
UserForm是一个类模块,与其他任何类似 - 唯一的区别是它有一个隐藏的VB_PredeclaredId
属性设置为True
,这使得VB创建一个以类命名的全局范围对象变量 - 那就是如何在不创建类的新实例的情况下编写UserForm1.Show
。
远离此,并将您的表单视为对象 - 公开Property Get
成员并抽象出表单的控件 - 调用代码并不关心控件< / em>无论如何:
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
现在调用代码可以执行此操作(假设UserForm名为LoginPrompt
):
With New LoginPrompt
.Show vbModal
If .IsCancelled Then Exit Sub
DoSomething .UserId, .Password
End With
其中DoSomething
是一些需要两个字符串参数的过程:
Private Sub DoSomething(ByVal uid As String, ByVal pwd As String)
'work with the parameter values, regardless of where they came from
End Sub