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

添加记录后用TempVars跳转指定记录时出现2105错误求助

解决Access中"2105: 无法转到指定记录"错误的方案

我来帮你搞定这个问题!你遇到的2105错误核心原因有两个——一是获取新记录ID的时机不对,二是用错了跳转记录的方法,咱们一步步修正:

问题根源分析

  1. ID获取时机错误:你在.AddNew之后直接取!ID.Value,这时候记录还没执行.Update,自动编号的ID根本还没生成,存到TempVars里的是无效值。
  2. 跳转方法用错:DoCmd.GoToRecord的最后一个参数是相对于当前记录的偏移量,不是记录ID!你直接传ID进去,Access找不到对应偏移的记录,自然报错。
  3. 刷新方式不对:Refresh只会更新现有记录的显示,不会把新插入的记录加载到目标窗体的记录集里。

修正后的完整代码

Private Sub btnSave_Click()
    Dim rst As DAO.Recordset
    Dim targetFrm As Form
    
    ' 只打开需要的字段,提升效率(没必要全表加载)
    Set rst = CurrentDb.OpenRecordset("SELECT ID, Company, PartName FROM TblConsumables", dbOpenDynaset)
    
    ' 验证必填字段,用Exit Sub代替End(End会直接终止程序,太粗暴)
    If IsNull(Me.ConCompany) Or IsNull(Me.txtConName) Then
        MsgBox "Please complete all information before continuing.", vbExclamation
        Exit Sub
    End If
    
    With rst
        .AddNew
        !Company = Me.ConCompany.Value
        !PartName = Me.txtConName.Value
        .Update ' 先提交记录,让自动编号ID生成
        .Bookmark = .LastModified ' 定位到刚插入的那条记录
        TempVars!VarConAddID = !ID.Value ' 现在拿到的才是正确的新记录ID
    End With
    
    If IsOpen("frmConsumablesDetails") Then
        Set targetFrm = Forms!frmConsumablesDetails
        targetFrm.Requery ' 用Requery重新加载记录集,确保新记录被包含
        ' 用FindFirst定位到指定ID的记录,这才是按ID跳转的正确方式
        targetFrm.Recordset.FindFirst "ID = " & TempVars!VarConAddID
        
        ' 容错:如果没找到记录,提示用户
        If targetFrm.Recordset.NoMatch Then
            MsgBox "刚添加的记录未在目标窗体中找到,请检查记录源或重试。", vbInformation
        End If
        
        Call Closefrm("ConFrmAddNewConsumable")
    End If
    
    ' 清理对象,避免内存泄漏
    rst.Close
    Set rst = Nothing
    Set targetFrm = Nothing
End Sub

关键修改点说明

  • 延迟获取ID:必须在.Update之后,通过.Bookmark = .LastModified定位到新记录,再读取ID,这样拿到的是数据库生成的有效自动编号。
  • 替换跳转方法:放弃DoCmd.GoToRecord,改用窗体记录集的FindFirst方法,直接通过ID匹配记录,这是Access中按ID定位记录的标准做法。
  • 改用Requery:Requery会重新执行窗体的记录源查询,确保新插入的记录被加载到目标窗体中,而Refresh做不到这一点。
  • 更友好的退出方式:用Exit Sub代替End,避免直接终止整个程序的执行。

额外注意事项

  • 如果你的ID是文本类型,FindFirst的条件要加单引号:targetFrm.Recordset.FindFirst "ID = '" & TempVars!VarConAddID & "'"
  • 确保frmConsumablesDetails的记录源包含ID字段,否则FindFirst会报错“字段不存在”。
  • 如果目标窗体不一定处于打开状态,可以直接用DoCmd.OpenForm打开并定位:DoCmd.OpenForm "frmConsumablesDetails", , , "ID = " & TempVars!VarConAddID,这种方式更可靠。

内容的提问来源于stack exchange,提问作者Shadyjunior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:20:16