将变量 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
首先,这是我第一次 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