如何判断Access子窗体是否加载?解决主窗体打开时的引用错误
Access子窗体加载引用错误的解决方法
问题根源
主窗体初始化阶段,你要访问的子窗体fzzzSubConditionalFormatCriteria还未完成加载,此时直接调用它的Form属性会触发无效引用错误;而切换记录时,子窗体已经加载完毕,代码就能正常执行。
核心解决思路:判断子窗体是否可访问
以下是两种可行的解决方案:
方案1:先判断子窗体加载状态再执行代码
在执行原有逻辑前,先检查子窗体控件的Form属性是否有效(即子窗体已加载),避免触发错误。
修改后的代码示例:
Dim targetSubForm As Control Set targetSubForm = Me.Parent.fzzzSubConditionalFormatCriteria ' 检查子窗体是否已完成加载 If Not targetSubForm.Form Is Nothing Then vrSQL = "SELECT zzAppObjectFields.AppObjectField, zzAppObjectFields.AppObjectFieldTypeID, zzAppObjectFields.AppObjectIDCmb " & _ "FROM zzAppObjectFields WHERE zzAppObjectFields.AppObjectFieldTypeID In (10,12) AND zzAppObjectFields.AppObjectID=" & Me.AppObjectID & " " & _ "ORDER BY zzAppObjectFields.AppObjectField;" targetSubForm.Form!uuulllAppObjectFieldIDCriteria.RowSource = vrSQL targetSubForm.Form!uuulllAppObjectFieldIDCriteria.Requery End If
也可以通过Access内置的窗体加载状态判断:
' 直接检查子窗体对应的源窗体是否已加载 If CurrentProject.AllForms("fzzzSubConditionalFormatCriteria").IsLoaded Then ' 执行原有代码逻辑 End If
方案2:避免在窗体打开时执行代码(最坏情况)
如果不需要在窗体初始化阶段执行这段代码,可将代码迁移到子窗体1的Current事件(切换记录时触发),或者主窗体的Activate事件(主窗体激活时触发,此时所有子窗体已加载)。
另一种延迟执行的方式是借助主窗体的Timer事件:
- 在主窗体的设计视图中,设置
TimerInterval属性为500(单位:毫秒,即0.5秒) - 在主窗体的
Timer事件中编写代码:
Private Sub Form_Timer() ' 关闭计时器,防止重复执行 Me.TimerInterval = 0 ' 执行原有代码逻辑 Dim vrSQL As String vrSQL = "SELECT zzAppObjectFields.AppObjectField, zzAppObjectFields.AppObjectFieldTypeID, zzAppObjectFields.AppObjectIDCmb " & _ "FROM zzAppObjectFields WHERE zzAppObjectFields.AppObjectFieldTypeID In (10,12) AND zzAppObjectFields.AppObjectID=" & Me.fzzzSubConditionalFormatCriteria.Parent.AppObjectID & " " & _ "ORDER BY zzAppObjectFields.AppObjectField;" Me.fzzzSubConditionalFormatCriteria.Form!uuulllAppObjectFieldIDCriteria.RowSource = vrSQL Me.fzzzSubConditionalFormatCriteria.Form!uuulllAppObjectFieldIDCriteria.Requery End Sub
内容的提问来源于stack exchange,提问作者Nata
相关产品推荐
相关产品推荐

