Access VBA - 数据库打开一段时间后对子表单的引用消失

Posted

技术标签:

【中文标题】Access VBA - 数据库打开一段时间后对子表单的引用消失【英文标题】:Access VBA - Reference to Subform disappears after database has been open a while 【发布时间】:2016-09-22 14:16:19 【问题描述】:

我有一个 Microsoft Access 2013 数据库,其中包含一个带有隐藏子表单的表单。有一个用于搜索值的文本框和一个单击以进行搜索的按钮。表单上有一个隐藏的子表单,直到单击搜索按钮。单击该按钮后,子表单将变为可见并显示搜索结果。

此过程正常工作。然而,昨晚我让数据库保持打开状态,表单以初始状态显示,子表单隐藏。我输入了搜索值并单击了搜索,但出现“对象不存在”错误。我跟踪了 VBA 代码,但它在引用子表单的第一行失败:SubForm.Form.RecordSource = "(some sql text)"

我在一个论坛上读到,一段时间后 Access 可能会丢失对隐藏控件的引用。我认为这里就是这种情况,因为当我重新加载表单时,它工作正常。

这是一个可能会在一夜之间在用户计算机上保持打开状态的数据库,所以我想尽可能避免这个问题。我想知道是否有办法编写一些代码来检查子表单是否仍在内存中被引用,如果不是,请重新连接引用。不确定这在 VBA 中是否可行。比如:

If Not SubForm.IsLoaded Then
    SubForm.Reload
End If 
SubForm.Form.RecordSource = "(some sql text)"

VBA 中是否存在类似的东西...或者是否有其他方法可以解决这个问题?

【问题讨论】:

您的代码不清楚您是在引用实际表单还是为子表单设置的表单变量。 Subform 是您在代码中其他地方设置的变量以指向您的实际 form.subform 吗? 【参考方案1】:

这真的很奇怪,我从未见过这样的事情。然而,它正在发生在你身上。

一种粗略的方法是处理错误处理。当用户单击“搜索”按钮时,添加关闭、重新打开表单的错误处理,然后使用 OpenForm 方法中的 OpenArgs 数据应用搜索。内存中的粗略代码,但类似于:

Sub cmdSearch_Click()

Dim sSQL As String
sSQL = "MY SQL STRING WITH PARAMS"

On Error Goto SubForm_Lost_err

Subform.Form.Recordsource = sSQL 

Exit Sub

SubForm_Lost_err:

   DoCmd.Close acForm, Me.Name
   DoCmd.OpenForm "TheCurrentFormName", , , , , , sSQL 

End Sub

然后,如果 OpenArgs 传入,则添加 OnLoad 事件处理

Private Sub Form_Load()
If Nz(Me.OpenArgs, "") <> "" Then
    Subform.Form.Recordsource = Me.OpenArgs
    Me.ParamsTextBox = "TheParams" 'Cosmetic so it looks right.
End If
End Sub

我也会尝试以不同的方式处理表单。我不知道为什么它会失去手柄,但试试这样的事情:

Forms("MyForm").subform.form.recordsource = "The SQL"
Me!subform.form.recordsource  = "The SQL"
Screen.ActiveForm.subform.form.recordsource = "The SQL"

等等

【讨论】:

以上是关于Access VBA - 数据库打开一段时间后对子表单的引用消失的主要内容,如果未能解决你的问题,请参考以下文章

c#WinForm窗体限制只能打开一次

关于outlook 保存的.mag文件打开一次之后不能再次打开的问题

Ms Access 数据库可以在使用 vba 打开时创建自己的备份吗?

使用 MS Access VBA 更改标签的默认标题

Access 2007 拆分表单 VBA:打开时 acNewRec 可防止在表单中跳动 - 就像第一个字段未“选择”一样

MS Access 未打开时 DMax 功能不起作用