MS ACCESS---全部通过VBA刷新

Posted

技术标签:

【中文标题】MS ACCESS---全部通过VBA刷新【英文标题】:MS ACCESS---Refresh all via VBA 【发布时间】:2011-02-07 20:51:10 【问题描述】:

如何通过 vba 刷新所有内容? 我要刷新所有打开的表单...

【问题讨论】:

刷新什么?你的意思是重新查询?这似乎是一件不太可能的事情。 顺便说一句。如果他们确实充分地回答了您的问题,那么“接受”您之前问题的一些答案将是一种很好的形式。 【参考方案1】:

@CodeSlave 的回答可能没有满足您的需要,因为您需要的 VBA 方法是 requery,而不是刷新。刷新将显示对现有记录所做的更改,但只有重新查询才会显示新添加的记录。

这是一个更简洁的代码版本(把它放在一个模块中,这样你就可以从任何形式调用它):

Public Sub RequeryOpenForms()
    Dim f as Form

    For Each f In Access.Forms
        f.Requery
    Next
End Sub

注意:不幸的是,重新查询具有丢失当前选定记录的副作用。如果有很长的记录列表,这对于使用来说尤其令人沮丧,因为他们可能需要向下滚动很长一段距离才能找到他们之前查看的记录。

【讨论】:

嗯。我不喜欢这样的代码。两件事:1.在设计视图中打开的任何表单都会出错。 2. 为什么在没有记录源的情况下重新查询表单?后者不会产生任何影响或导致错误,但它会冒犯我的编程美学来做一些没有目的的事情。 谢谢,我们可以做些什么来避免在设计视图中出现任何表单的错误,以及如何将内容恢复到原始视图(我可以先添加书签吗?)而不是让表单显示重新查询之前的不同记录 你会检查表单的 CurrentView 属性(有一个枚举的可能性),看看它是否在设计视图中打开,而不是重新查询它是否是。如果要在requery后返回到原来的当前记录,那么你应该在requery之前保存PK值,然后使用FindFirst返回它。书签不会在重新查询后继续存在。【参考方案2】:

这样的事情呢?

Sub AllForms()
Dim obj As AccessObject
dim dbs As Object
Dim i As Integer
dim intFormCount as Integer

    Set dbs = Application.CurrentProject
    intFormCount  = dbs.AllForms.Count - 1

    For i = 0 To intFormCount
        If dbs.AllForms(i).isloaded = True Then
            dbs.AllForms(i).refresh
        End If
    Next
End Sub

【讨论】:

如果我将一条记录添加到一个表中,而访问该表的表单是打开的...我希望刚添加到表中的新记录在我去时可以在该表单中使用回到它...所以此时,我将一条记录添加到表中,转到表单(实际上是一个子表单)并按刷新以使该新记录在表单中可用...手动它可以工作。 ..上面的VBA没有:( refresh repaint requery - 正如@ToddOwen 所说,您可能想要重新查询而不是刷新。 我不明白您为什么要使用 AllForms 并检查 IsLoaded 属性,而不仅仅是使用 Forms 集合(其中仅包括加载的表单)。【参考方案3】:

在上面的评论中你说:

我想要刚刚添加的新记录 以该形式提供的表格 当我回到它时

您可能想要检查激活事件。但是,除非您知道记录已被添加,否则重新查询表单让我很困扰。我希望如果我需要这样做(实际上我从来没有这样做过——我的用户知道 Shift-F9 是相关的,但他们中的大多数人从不需要它),我会使用 OnActivate 事件并检查当前记录计数,并且仅在计数与当前记录集不匹配时才重新查询表单。

但是,我再次认为这是一件相当奇特的事情。一般来说,如果有太多的表单与您离开然后返回的打开的记录集放在一起,这可能是一个架构错误。当您远离它们时,它们可能应该完全关闭而不是保持打开状态。这减少了表句柄的数量,以及后端数据库上持有的锁的数量,如果管理不当,这两者都可能成为问题。

【讨论】:

是的。我也是这么看的。我想不出我需要重新查询所有打开的表格的场合。另外,我尽量避免打开一两个以上的表格。 @Christopher Robinson 我突然想到,您可能已经使用表格 B 向表格 A 添加了一条记录,并且当时可能错过了重新查询表格 A。 如果Form A/B架构已经到位,B应该用对话框开关打开,这样B关闭后可以重新查询A。

以上是关于MS ACCESS---全部通过VBA刷新的主要内容,如果未能解决你的问题,请参考以下文章

ms access 组合框刷新

MS Access 2013:通过 VBA 使用 MS Word 的语法检查

使用 ODBC 链接到 MySql 时,MS Access 表单不刷新

使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询

MS Access:导入规范无法通过 VBA

MS-Access 获取字段值,通过 VBA 函数运行,并发送到 SQL