Access窗体无法访问前序窗体Public变量WorkflowName运行报错
Access跨窗体调用Public变量运行报错修复
问题根因
- Access窗体的
!(Bang运算符)默认仅检索窗体的控件集合,不会识别窗体模块内声明的Public级模块变量,这也是调试监视能看到变量值、但代码调用报错的核心原因——运行时会把frmPrevious![WorkflowName]中的WorkflowName当做控件名称查找,找不到对应控件就触发运行错误。 - 现有代码存在两个稳定性隐患:
- 在Form_Load事件中通过
Screen.ActiveForm获取前序窗体的逻辑依赖焦点状态,窗体加载过程中如果发生焦点切换,拿到的对象会和预期不符。 - Form2通用声明段定义了同名模块级变量
Dim WorkflowName As String,和Form1的公共变量重名,后续编码极易出现取值混淆。
- 在Form_Load事件中通过
修复方法
快速修复
直接把调用语句的!替换为.运算符即可,.运算符会检索窗体模块的所有公共成员(包含Public变量、属性、公共方法):
' Form2 中btn_ToOutlook_Click事件内替换原有MsgBox代码 MsgBox frmPrevious.WorkflowName
同时建议删除Form2通用段声明的Dim WorkflowName As String避免重名冲突。
推荐稳定写法(不依赖焦点状态)
不建议通过Screen.ActiveForm获取前序窗体,优先用以下两种方式跨窗体传值,稳定性更高:
- OpenArgs传参(最推荐,窗体关闭也不影响取值)
如果打开Form2后Form1会关闭,必须用这种方式,因为窗体关闭后其公共变量会随模块释放:' Form1 打开窗体的代码修改为 Private Sub btn_CreditControlEmail_Click() WorkflowName = "Email to Credit Control" ' 直接把变量值通过OpenArgs参数传递给目标窗体 DoCmd.OpenForm "WorkFlow Email Preview", OpenArgs:=WorkflowName End Sub' Form2 直接读取OpenArgs取值,不需要声明frmPrevious变量、不需要Form_Load事件赋值 Private Sub btn_ToOutlook_Click() MsgBox Me.OpenArgs End Sub - Forms集合显式引用
如果需要操作Form1的多个公共成员,且打开Form2后Form1始终保持打开状态,可以直接通过Forms集合引用,无需依赖焦点:' Form2 中直接调用,不需要在Form_Load里获取Screen.ActiveForm Private Sub btn_ToOutlook_Click() MsgBox Forms("Form1").WorkflowName End Sub
内容的提问来源于stack exchange,提问作者want_to_be_calm
相关产品推荐
相关产品推荐

