我已将用户表单插入到已包含一堆模块的项目中。通过使用用户表单中的代码,我已经验证我可以从组合框中返回值。
用户表单代码:
Public SelectedPacking As Integer
Private Sub CancelButton_Click()
UserForm1.Hide
End Sub
Private Sub OKButton_Click()
SelectedPacking = ComboBox1.ListIndex
Call DemoDialogOk
'Return list index value to cell C50
Worksheets("Inputs & Results").Range("C50") = SelectedPacking
Unload UserForm1
End Sub
我的问题是我无法将此值传递给模块中编写的任何宏。
模块代码:
Public Sub ShowComboBox()
UserForm1.Show
End Sub
Public Sub DemoDialogOk()
ival = SelectedPacking
'Return value of ival (list index value from combo box) to cell C17
Worksheets("Packed bed (Random)").Range("C17") = ival
End Sub
显然该模块包含更多有用的代码,但我已经注释掉了所有内容,试图找出我出错的地方。我一直在改变一些事情,但我仍然无法在C17单元格中出现任何内容,所以我认为我缺少一些基本的东西。
答案 0 :(得分:1)
我认为有两个选择:1)更改DemoDialogueOK以接受变量:
Public Sub DemoDialogOk(SelPack as integer)
' ival = SelectedPacking
Worksheets("Packed bed (Random)").Range("C17") = SelPack
End Sub
Private Sub OKButton_Click()
SelectedPacking = ComboBox1.ListIndex
Call DemoDialogOk(SelectedPacking)
...
End Sub
或选项二:完全限定使用形式的变量,即:
Public Sub DemoDialogOk()
ival = ufYourForm.SelectedPacking
...
End Sub
用户表单中的公共变量似乎不像模块级别那样“公开”......
答案 1 :(得分:0)
在Simon的回答之上,如果您愿意,可以传递整个用户表单。这将使您可以访问它的所有部分,如果您需要对所选的不同复选框进行一些验证,这将非常有用。
Sub inOurUserForm()
Call inADifferentModule(Me) 'Passes this userform
End Sub
Sub inADifferentModule(ourForm As UserForm1)
'Passed the form, and using it like a class (As whatever the form is called)
If ourForm.chkYes = True Then
'Do something
Else
'Do something else, like
ourForm.chkYes = False 'Because we are passing the object itself _
rather than a copy, at least in my understanding
End If
End Sub
并且您不一定需要传递用户表单,因为您可以将其作为对象来引用,例如。
UserForm1.chkYes
答案 2 :(得分:0)
一个非常简单的解决方案是在Userform中声明一个变量(在本例中为UserForm1)
GRANT ALL PRIVILEGES ON test_myproject.* TO 'myprojectuser'@'localhost' IDENTIFIED BY 'password';
此Pass将包含存储密码的字符串。存储密码后,您可以隐藏表单
Public Pass as string
在模块中,您可以打开Form as modal
Me.Hide
现在,在运行userform中的所有代码之后,可以在模块中检索密码 -
UserForm1.Show vbModal
然后您可以卸载隐藏的表单
UserForm1.Pass