无法在Access表单中复刻快速访问工具栏‘全部刷新’按钮功能
Access主表单自动刷新子表单数据的解决方案
嘿,我碰到过一模一样的Access表单刷新问题!让我来给你捋捋怎么解决——
首先得搞清楚为什么你的Got Focus宏、Repaint甚至Requery都没起作用:
- Got Focus事件触发时机不对:当你关闭独立编辑表单时,主表单可能根本没失去焦点(比如独立表单是弹出式窗口,主表单一直在后台),所以这个事件根本没被触发。
- Repaint不解决数据更新问题:Repaint只是重绘表单界面,不会重新从数据库获取最新数据,数据变更后它完全没用。
- Requery的对象可能错了:如果只给主表单调用Requery,而子表单的数据源需要单独刷新,那得针对性地给子表单的Form对象调用Requery,而不是子表单控件本身。
下面给你两个最靠谱的解决方案:
方案1:关闭独立表单时主动刷新主表单/子表单
这是最及时的方法——在独立编辑表单的Close事件里添加VBA代码,直接通知主表单刷新数据,不用等用户手动操作。
打开你的独立表单,进入设计视图,打开VBA编辑器,添加这段代码(记得替换成你的表单名称):
Private Sub Form_Close() ' 先检查主表单是否处于打开状态 If CurrentProject.AllForms("你的主表单名称").IsLoaded Then ' 如果你只需要刷新子表单,用这行(替换子表单控件的名称) Forms("你的主表单名称").Controls("子表单控件名称").Form.Requery ' 如果你需要刷新整个主表单,用这行 ' Forms("你的主表单名称").Requery End If End Sub
这样用户关闭独立表单的瞬间,主表单的子表单就会自动加载最新数据,完全不用手动点刷新。
方案2:用Activate事件替代Got Focus
如果还是希望主表单在成为活动窗口时自动刷新,别用Got Focus,改用Activate事件——这个事件每次表单成为当前活动窗口都会触发,比Got Focus更可靠。
打开主表单的设计视图,进入VBA编辑器,添加这段代码:
Private Sub Form_Activate() ' 刷新子表单(替换子表单控件名称) Me.Controls("子表单控件名称").Form.Requery ' 或者刷新整个主表单 ' Me.Requery End Sub
这里要注意:一定要调用子表单控件.Form.Requery,而不是只调用子表单控件.Requery——后者只会刷新子表单控件本身,不会重新查询数据源获取最新数据。
最后补充一句:快速访问工具栏的“全部刷新”其实是调用了Application.RefreshDatabaseWindow,它会刷新整个数据库窗口的对象列表,但对表单数据来说,针对性的Requery效率更高也更精准。
内容的提问来源于stack exchange,提问作者Isaac Reefman
相关产品推荐
相关产品推荐

