MS Access中Requery后DoCmd.GoToRecord失效问题求助
问题分析
你的代码出现定位失效的原因主要有三点:
DoCmd.GoToRecord默认作用于当前活动窗体,Requery后焦点大概率回到主窗体,导致定位操作被应用到主窗体而非子窗体- 子窗体
Requery后记录集尚未完全加载,直接执行定位会出现逻辑偏差 - 代码中取的是
details表的最大ID,但子窗体绑定的是table1,两者ID逻辑不匹配,导致计算的定位位置错误
修正方案
1. 修正子窗体代码
确保定位操作明确作用于子窗体本身,同时改用子窗体绑定的 table1 表来计算定位位置:
Public Sub Update_Goto() ' 重新查询子窗体记录集 Me.Requery ' 等待子窗体记录集加载完成 DoEvents Dim maxID As Long Dim targetID As Long ' 取子窗体绑定的table1的最大ID,而非details表 maxID = Nz(DMax("ID", "table1"), 0) If maxID <= 10 Then targetID = 1 Else ' 定位到倒数第10条记录的位置(ID连续时) targetID = maxID - 9 End If ' 明确指定操作对象为当前子窗体 DoCmd.GoToRecord ObjectType:=acDataForm, ObjectName:=Me.Name, Record:=acGoTo, Offset:=targetID End Sub
2. 修正主窗体调用逻辑
主窗体调用子窗体过程时,要通过主窗体上的子窗体控件(通常和子窗体对象名一致)来调用,确保操作的是当前嵌入主窗体的子窗体实例:
Private Sub Goto_Record() ' 假设主窗体上的子窗体控件名为overview_Form Me.overview_Form.Form.Update_Goto End Sub
兼容非连续ID的补充方案
如果 table1 的ID不是连续自增的,用ID计算定位位置会出错,此时可以改用记录集书签定位,兼容性更好:
Public Sub Update_Goto() Me.Requery DoEvents Dim rs As Recordset Set rs = Me.RecordsetClone If rs.RecordCount <= 10 Then rs.MoveFirst Else rs.MoveLast rs.MovePrevious 9 ' 从最后一条往前移9条,停在倒数第10条 End If ' 同步子窗体记录到定位的位置 Me.Bookmark = rs.Bookmark rs.Close Set rs = Nothing End Sub
内容的提问来源于stack exchange,提问作者mnish
相关产品推荐
相关产品推荐

