将变量 sheet 模块传递给 VBA 中的用户表单

Passing variable sheet module to user form in VBA

首先,这是我第一次 post 堆栈溢出,所以我希望我遵循了正确的程序。我在这个网站和其他网站上浏览了数十个 post,但我似乎无法推断出与我的类似情况的解决方案。我也尝试过使用调试线,但我无法查明问题所在,可能是因为我是 VBA 的新手。以上就是我的总结,希望对你有所帮助:

Sheet1 上的命令按钮引发 Yes/No/Cancel 消息框,我想要一种机制来记住随后的用户窗体和模块中的此选择,因此我将 boolNieuweOpdrachtgever 声明为 Public 变量,但是,在随后的形式中,Debug 行表明它根本不记得它的值。这是代码:

Public boolNieuweOpdrachtgever As Boolean
Public Sub nieuw_project_Click()

Dim nieuweOpdrachtgever As Variant

    nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel)
    Select Case nieuweOpdrachtgever
        Case vbYes
            boolNieuweOpdrachtgever = True
            Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever
            nieuweOpdrachtgeverForm.Show
        Case vbNo
            boolNieuweOpdrachtgever = False
            Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever
            nieuweOpdrachtForm.Show
        Case Else
            Exit Sub
    End Select

End Sub

例如,在 vbYes 的情况下,它经过一个工作表单,然后进入第二个表单,该表单具有基于 boolNieuweOpdrachtgever 的 IF 语句。然而,到那时它已经失去了它的价值。你能告诉我我做错了什么吗?

我试过你的代码,我想我知道你的问题。当您在表单中获取变量时,比如表单 nieuweOpdrachtgeverForm,那么您需要调用模块和变量,而不仅仅是变量。例如:我.Label1.Caption = Module1.boolNieuweOpdrachtgever

这是我用于按钮调用的 Sub(在 Module1 中)的代码:

Public boolNieuweOpdrachtgever As Boolean

Sub nieuw_project_Click()

Dim nieuweOpdrachtgever As Variant

    nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel)
    Select Case nieuweOpdrachtgever
        Case vbYes
            boolNieuweOpdrachtgever = True
            Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever
            nieuweOpdrachtgeverForm.Show
        Case vbNo
            boolNieuweOpdrachtgever = False
            Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever
            nieuweOpdrachtForm.Show
        Case Else
            Exit Sub
    End Select

End Sub

这是表格中的代码,我用来测试传递变量。请注意,我添加了一个名为 Label1 的标签,并将结果值放在标签中:

Private Sub UserForm_Initialize()

  Me.Label1.Caption = Module1.boolNieuweOpdrachtgever

End Sub

以下是选择是和否后表单上的结果:

我认为问题在于与工作表关联的代码与模块的类型不同。工作表代码无法设置 public 或全局变量。

我测试了不同的场景,解决方案是将所有代码放入工作表代码中,并将其放入单独的模块中,然后从触发代码的工作表事件中调用模块。

此时,模块声明了 public 变量,它可以作为 public 变量访问。

Sheet代码:

Private Sub SomeValue_Change()
    'What would have been your code, now moved to another module
    Call NewModule    
End Sub

模块代码:

Option Explicit
Public tempValue As String

Sub NewModule()
    'Code that was previously in the Worksheet Code
    tempValue = InputBox("Please input the public variable value.","Public Variable")

    'You can test it by calling it from here to simplify the process.
    Call TestValues
End Sub

其他代码:把它放在不同的模块中。请注意,根本没有变量声明。仅在包含 "NewModule" 的模块中。

Sub TestValues()

    MsgBox("The value from the public variable is :" & tempValue & ".")

End Sub

通过从模块而不是工作表代码中声明变量,可以在全局范围内捕获和访问该变量。从工作表代码中执行相同的操作失败。

Sjors - 我想知道我的回答是否有帮助(我没有看到已检查的支票),但我很高兴有帮助。为了回答您的最后一条评论,我添加了代码。第一位是 Module1 中的代码,第二位是 Sheet1 中的代码,另一位来自表格(根据我上面的回答)。我建议您将代码剪切并粘贴到您的项目中,然后逐步执行 (F8) 以查看它是如何工作的。这应该让您对如何在对象之间进行调用有一个很好的基本了解。

模块 1:

Public boolNieuweOpdrachtgever As Boolean

Sub nieuw_project_Click()

Dim nieuweOpdrachtgever As Variant
Dim strFromSheet1 As String

nieuweOpdrachtgever = MsgBox("Text", vbYesNoCancel)
Select Case nieuweOpdrachtgever
    Case vbYes
        boolNieuweOpdrachtgever = True
        Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever
        nieuweOpdrachtgeverForm.Show
    Case vbNo
        boolNieuweOpdrachtgever = False
        Debug.Print "In nieuw_project_Click() boolNieuweOpdrachtgever = " & boolNieuweOpdrachtgever
        nieuweOpdrachtForm.Show
    Case Else
        Exit Sub
End Select

Call Sheet1.setString

strFromSheet1 = Sheet1.strPublic

Call Sheet1.Test(strFromSheet1)


End Sub

工作表 1:

Public strPublic As String


Public Sub Test(ByVal strTest As String)

    MsgBox (strTest)

End Sub

Public Sub setString()

    strPublic = "Hello"

End Sub

其中一种形式的示例:

Private Sub UserForm_Initialize()

   Me.Label1.Caption = Module1.boolNieuweOpdrachtgever

End Sub