VBA多实例绑定表单无法获取当前记录ID的原因与解决方法咨询
问题根源
CurrentRecord是Access表单的内置属性,返回的是当前记录在表单记录集中的序号,不是你表中的主键ID值。你的每个表单实例的RecordSource都做了where id = X的过滤,记录集里永远只有1条记录,所以CurrentRecord返回值永远为1,和你要匹配的主键ID完全是两个概念。
正确实现方案
有两种常用方式可以准确匹配到目标表单:
方案1:直接读取表单绑定的主键字段值
适合允许用户在表单内切换多条记录的场景:
把RefreshForm函数中的判断条件替换为读取主键字段值即可,假设你的主键字段名为id:
' 原错误判断 ' If F.CurrentRecord = ID And F.Name = RForm Then F.Refresh ' 替换为 If F.Name = RForm And Nz(F!id, 0) = ID Then F.Refresh
如果主键字段名不是id,替换成你实际的字段名即可,也可以用更规范的写法:Nz(F.Recordset.Fields("你的主键字段名").Value, 0)
用Nz函数是为了避免表单记录为空时出现空值匹配错误。
方案2:创建实例时预存ID到表单Tag属性
适合你的场景:每个表单实例固定对应一条ID的记录,不需要切换记录的情况,性能更高也更稳定:
- 首先修改表单实例创建逻辑,新增一行把主键ID存入表单的
Tag属性:
Set frm = New Form_Name frm.RecordSource = "select * from Table_Name where id = " & ID frm.Tag = ID ' 新增此行,预存主键ID colForms.Add Item:=frm, Key:=frm.hwnd & "" mintForm = mintForm + 1 frm.SetFocus frm.Visible = True
- 再修改
RefreshForm的判断逻辑,直接匹配Tag属性即可:
If F.Name = RForm And CInt(F.Tag) = ID Then F.Refresh
修改后的完整RefreshForm示例(采用方案2)
Function RefreshForm(RForm As String, ID As Integer) If Developer = False Then On Error GoTo Fehler Dim F As Form On Error Resume Next For i = 1 To mintForm Set F = colForms(i) If F.Name = RForm And CInt(F.Tag) = ID Then F.Refresh End If Next i 'Error handling logic Done: Exit Function Fehler: RuntimeError "MultiInstance: RefreshForm", Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext, Err.LastDllError Err.Raise 1000, , "Folgefehler" End Function
内容的提问来源于stack exchange,提问作者Benjamin Krausse DB
相关产品推荐
相关产品推荐

