如何规避VBA运行时错误-2147352567(80020009):数据已被更改
解决Access中AfterUpdate事件修改控件值导致的运行时错误-2147352567
这个问题我之前帮不少人解决过,本质是Access的事件触发逻辑冲突导致的——你在AfterUpdate事件里修改控件值时,Access会误以为数据被外部篡改,从而抛出那个报错。下面给你两个靠谱的解决思路:
方法一:临时禁用事件触发
在修改控件值之前,先关闭AfterUpdate事件的绑定,修改完成后再重新启用,避免循环触发和状态冲突:
Private Sub Results_AfterUpdate() If IsNumeric(Me.Results) = False Then ' 先禁用AfterUpdate事件,防止重复触发 Me.Results.AfterUpdate = "" ' 转换为大写 Me.Results = UCase(Me.Results) ' 重新绑定事件过程 Me.Results.AfterUpdate = "[Event Procedure]" End If End Sub
方法二:改用BeforeUpdate事件(更推荐)
比起AfterUpdate,BeforeUpdate是在控件值即将保存到记录集之前触发的,这时候修改值不会触发额外的冲突,代码更简洁:
Private Sub Results_BeforeUpdate(Cancel As Integer) If IsNumeric(Me.Results) = False Then Me.Results = UCase(Me.Results) End If End Sub
简单解释下:AfterUpdate是值已经保存后才执行的,这时候你再改控件值,Access会检测到控件值和记录里的原始值不一致,就会抛出“数据已被更改”的错误;而BeforeUpdate是在保存前修改,相当于直接修改要保存的内容,自然不会有冲突。
内容的提问来源于stack exchange,提问作者Adam S.
相关产品推荐
相关产品推荐

