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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:50:30