【问题标题】:Passing variable sheet module to user form in VBA在VBA中将可变工作表模块传递给用户表单
【发布时间】:2015-03-01 12:10:33
【问题描述】:

首先,这是我关于堆栈溢出的第一篇文章,所以我希望我遵循正确的程序。我已经浏览了这个网站和其他网站上的几十篇文章,但我似乎无法为我的类似案例推断出解决方案。我也尝试过使用调试行,但我无法查明问题,可能是因为我是 VBA 新手。简单说一下,希望对你有所帮助:

Sheet1 上的一个命令按钮会引发一个是/否/取消消息框,我想要一种机制来在随后的用户窗体和模块中记住这个选择,所以我将 boolNieuweOpdrachtgever 声明为公共变量,但是,在随后的表单中,调试行表明它根本不记得它的值。代码如下:

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 语句的表单。然而,到那时它已经失去了它的价值。你能告诉我我做错了什么吗?

【问题讨论】:

  • 它是否从 Select Case 中正确获取了它的值?
  • 是的,调试会这样建议。我找到了一种解决方法来让它工作,但是我仍然对如何将变量值从(Sheet)模块获取到 UserForm 感兴趣。

标签: excel vba variables userform


【解决方案1】:

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

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

此时,模块声明了公共变量,并且可以作为公共变量访问。

工作表代码:

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

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

【讨论】:

  • 听起来合乎逻辑,非常感谢。稍后我将尝试您和 Edward Bagby 的代码并发布结果。
【解决方案2】:

我试过你的代码,我想我知道你的问题。当您在表单中获取变量时,例如 nieuweOpdrachtgeverForm 表单,那么您需要调用模块和变量,而不仅仅是变量。例如:Me.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

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

【讨论】:

  • 感谢您的回答,听起来确实有道理。一个后续问题:您将如何引用 Sheet1 中的代码?你会使用 Sheet1 还是工作表的名称? (在您的示例中,我应该用什么替换 Module1?)
【解决方案3】:

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

【讨论】:

  • 您好,爱德华,感谢您精心制作的第二个回复。可悲的是,我周末一直很忙,又开始了正常的学习。我会尽快尝试您的代码并在此处发布结果。
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多