我有一个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中是否存在类似的内容......或者解决此问题的方法有何不同?
答案 0 :(得分:0)
这真的很奇怪,我从未见过这样的事情。然而,它正在发生在你身上。
一种粗略的方法是处理错误处理。当用户单击“搜索”按钮时,添加关闭的错误处理,重新打开表单,然后使用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
然后,添加OnLoad事件以处理OpenArgs是否传入
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"
等