用户表单无法将值传递给模块

时间:2013-08-30 00:02:03

标签: excel-vba vba excel

我已将用户表单插入到已包含一堆模块的项目中。通过使用用户表单中的代码,我已经验证我可以从组合框中返回值。

用户表单代码:

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单元格中出现任何内容,所以我认为我缺少一些基本的东西。

3 个答案:

答案 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