专为易于使用而设计的 Microsoft 关系数据库管理系统系列。
注:此回复已自动翻译。因此,它可能包含语法错误或表达尴尬。
你好 @何尧
我尝试重现这个问题,但在我的测试中无法触发相同的错误。根据你的描述,这里有一些可能有帮助的建议。
我认为原因很可能是事务冲突。
在使用“全部替换”时,Access 可能会在内部锁定记录并批量处理更新(类似事务)。与此同时,你的 Form_Current() 事件不断强制 SubForm2 刷新其 RecordSource,这就导致了冲突。因此,Access 会报错 2074:事务中不支持的操作。
另外,我觉得不可能用 Access 表单对象来引用这个对话框。内置的“查找和替换”窗口是 Office 的内部对话框(更像是一个命令栏/UI 元素),而不是标准的 Access 表单。因此,它不属于 Forms 集合,这也是为什么 Application.Screen.ActiveForm.Name 仍然返回底层的表单(例如 Form1)的原因。
而且,因为这个对话框不是作为标准的 Access 对象暴露的,它也不提供任何 VBA 事件。没有原生事件(比如 OnClick 或 BeforeUpdate)可以让你检测到“全部替换”按钮何时被执行。
既然你提到替换操作仍然可以成功完成,一个方法就是忽略这个特定错误,以避免打扰用户。这可以保持你当前的结构不变,并防止不必要的错误提示。
Err_Sign:
If Err.Number = 2074 Then
Resume Next
Else
MsgBox "Err.Number=" & Err.Number & " :" & Err.Description
End If
另一种方法是在刷新子表单之前引入一个短暂的延迟,这样 Access 就有时间完成批量更新。
像这样修改你的 Form_Current():
Private Sub Form_Current()
On Error GoTo Err_Sign
Me.TimerInterval = 100 ' Delay ~0.1s
Exit Sub
Err_Sign:
MsgBox "Err.Number=" & Err.Number & " :" & Err.Description
End Sub
然后把逻辑移到 Form_Timer 事件里:
Private Sub Form_Timer()
Me.TimerInterval = 0
Dim S(0) As String
S(0) = "SELECT Table2.* FROM Table2 WHERE Table2.Field2 = '" & Me.Field1 & "'"
Me.Parent.Form("SubForm2").Form.RecordSource = S(0)
End Sub
这让 Access 在触发子表单更新之前,有一个短暂的等待时间来完成内部操作。
如果这还不能解决问题,随时提出反馈。
注意:如果您希望收到本帖相关的邮件通知,请按照我们文档中的步骤启用电子邮件通知。