就声明一个可以被调用并且可以从任何地方保留信息的变量而言,这个问题似乎与我所寻找的完全一致。
我有一个用户表单,它以字符串形式提供项目编号和文件路径,还有另一个布尔值,用于确定是否选择了“确定”或“取消”按钮,以及当进程返回到子进程时如何继续。从我所做的研究来看,似乎表明最简单的方法是通过全局变量。虽然这可能是最简单的方法,但它是正确的方法吗?
我尝试将变量声明放在代码表顶部,位于 Sheet3 中第一个 sub/fun 之前,我的大部分代码都在这里,并且用于启动用户窗体的按钮单击代码也在这里。我还尝试将其放在 ThisWorkBook 中的代码顶部。我还尝试将其放在相关用户窗体的代码页顶部。
我只在一个地方声明它们。我不会同时在多个地方声明它们。
当我在 Sheet3 上声明时,在用户窗体代码中的子部分出现错误
相关代码:
Private Sub OKBtn_Click()
strPPTFilepath = PPTPath.text
strProjectNumber = ProjectNoTextBox.text
bCancelled = False
End Sub
当我在 ThisWorkBook 中声明它时,我得到:
导致错误的代码位于Sheet3中,如下所示:
Private Sub LoadPPT_Click()
Dim frm As PPT_Picker_Form
Dim wbPPT As Workbook
Dim wsPPT As Worksheet
Dim rngTopLeft As Range
Dim lngLastUsedRow As Long
Dim lngLastCo As Long
'Public strPPTFilepath As String
'Public strProjectNumber As String
Set frm = UserForms.Add(PPT_Picker_Form.Name)
frm.ListData = ThisWorkbook.Worksheets("Project Numbers").ListObjects("Project_Number_List").DataBodyRange
frm.show
Unload frm
If bCancelled Then '<----this is the undeclared variable
Exit Sub
End If
'Define PPT Table
Set wbPPT = Workbooks.Add(strPPTFilepath)
Set wsPPT = wbPPT.Worksheets("Fee Estimate")
'Find top left corner
With wsPPT.Cells
Set rngTopLeft = .Find("WBS Code", LookIn:=xlValues)
If rngTopLeft Is Nothing Then
'nothing found
'add a manual cell picker routine
End If
End With
'Find last row
'find Right edge
' strProjectNumber
End Sub
当我在用户表单代码区域中声明它时,我在相同的位置收到与上述相同的错误。
问题
将信息从表单传递到 Sheet3 上的子表单的正确方法是什么?
更新
天哪,我不敢相信我忘了显示声明变量的代码,所以这里是:
'set it so that all subs and functions require variables to be dimensioned
Option Explicit
'variable available across all modules?
Public strPPTFilepath As String
Public strProjectNumber As String
Public bCancelled As Boolean
您还可以在表单模块的顶部声明一个公共变量:
Public bCancelled As Boolean
这可以通过用户窗体中的代码进行设置,并通过调用代码读取:
这避免创建项目级全局变量。
您可以使用公共变量,以便脚本可以从 和工作表模块访问它
UserForm
。ThisWorkbook
公共变量应在标准模块中声明,而不是在其他模块中声明。在 VBA 编辑器(VBE)中
Insert -> Module
,在窗口中添加以下行Code
。Microsoft 文档: