You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access窗体无法访问前序窗体Public变量WorkflowName运行报错

Access跨窗体调用Public变量运行报错修复

问题根因

  • Access窗体的!(Bang运算符)默认仅检索窗体的控件集合,不会识别窗体模块内声明的Public级模块变量,这也是调试监视能看到变量值、但代码调用报错的核心原因——运行时会把frmPrevious![WorkflowName]中的WorkflowName当做控件名称查找,找不到对应控件就触发运行错误。
  • 现有代码存在两个稳定性隐患:
    • 在Form_Load事件中通过Screen.ActiveForm获取前序窗体的逻辑依赖焦点状态,窗体加载过程中如果发生焦点切换,拿到的对象会和预期不符。
    • Form2通用声明段定义了同名模块级变量Dim WorkflowName As String,和Form1的公共变量重名,后续编码极易出现取值混淆。

修复方法

快速修复

直接把调用语句的!替换为.运算符即可,.运算符会检索窗体模块的所有公共成员(包含Public变量、属性、公共方法):

' Form2 中btn_ToOutlook_Click事件内替换原有MsgBox代码
MsgBox frmPrevious.WorkflowName

同时建议删除Form2通用段声明的Dim WorkflowName As String避免重名冲突。

推荐稳定写法(不依赖焦点状态)

不建议通过Screen.ActiveForm获取前序窗体,优先用以下两种方式跨窗体传值,稳定性更高:

  1. 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
    
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:48:12