gpt4 book ai didi

vba - 全部刷新没有触发 QueryTable 的 BeforeRefresh 事件 - 为什么?

转载 作者:行者123 更新时间:2023-12-04 20:05:32 27 4
gpt4 key购买 nike

如标题所述:我发现单击功能区上的“全部刷新”按钮不会触发 QueryTable 的 BeforeRefresh 事件。为什么会这样?有没有办法改变这种行为?

奇怪的是,同一个QueryTable的AfterRefresh事件被完美触发了!

为了分析这种行为,我在两个工作表中创建了两个表:

  • 名为 Source 的简单未链接表
  • 表名为 Destination链接到 Source table 。连接是使用 Microsoft Query 和 Excel 文件作为数据源创建的。

  • 然后,我创建了 TestClass如下:
    Option Explicit

    Private WithEvents qt As QueryTable

    Public Sub Init(pQt As QueryTable)
    Set qt = pQt
    End Sub

    Private Sub qt_BeforeRefresh(Cancel As Boolean)
    MsgBox "BeforeRefresh"
    End Sub

    Private Sub qt_AfterRefresh(ByVal Success As Boolean)
    MsgBox "AfterRefresh"
    End Sub

    最后,我创建、初始化并存储了 TestClass 的实例。 .

    右击 Destination表并选择“刷新”会得到预期的结果:MsgBox 显示两次,确认刷新前和刷新后事件均已触发。

    但是,单击功能区上的“全部刷新”会导致仅显示一个 MsgBox:AfterRefresh 一个。

    我准备了一个最小的 Excel 文件来重现所描述的行为。可在此处下载: RefreshAllNotTriggeringBeforeRefresh.xlsm

    编辑 1 : 回复 Rik Sportel's question如何 TestClass正在创建和初始化实例。

    这是 ThisWorkbook 的相关部分目的:
    Option Explicit

    Private Destination As New TestClass

    Private Sub Workbook_Open()
    Destination.Init WS_Destination.ListObjects("Destination").QueryTable
    End Sub

    在哪里 WS_Destination(Name) 的值包含 Destination 的工作表的属性 table 。

    可以看到, Destination是私有(private)字段,但是垃圾回收器好像不在乎:我可以右键刷新 Destination表任意多次,并且之前和之后的 MsgBoxes 总是弹出。然而, Refresh All 永远不会(甚至一次)触发 BeforeRefresh 事件,但总是触发 AfterRefresh 事件。

    最佳答案

    Option Explicit
    Public tc as TestClass
    Sub Test()
    Set tc = New TestClass
    tc.Init Worksheets("SomeSheet").ListObjects(1).QueryTable
    End Sub
  • 只有在您使用 中的刷新选项时才会触发 BeforeRefresh。表选项卡 Excel GUI。当您使用这个时,两个事件都会适本地触发。
  • 当您使用 中的刷新选项时查询 Excel GUI 的选项卡,只有第二个事件触发。

  • 原因是QueryTable 使用 Query 刷新选项时触发此 BeforeRefresh 事件,是因为您实际上并没有刷新 QueryTable 本身,而是底层 Query。
  • BeforeRefresh 事件在 的任何刷新之前发生。查询表 . Here
  • AfterRefresh 事件发生在 之后。查询 完成或取消。 Here

  • 当你这样做时:
    Option Explicit
    Public tc as TestClass
    Sub Test()
    Set tc = New TestClass
    tc.Init Worksheets("SomeSheet").ListObjects(1).QueryTable
    Worksheets("SomeSheet").ListObjects(1).QueryTable.Refresh
    End Sub

    您会看到这两个事件都正确触发。

    编辑: RefreshAll 实际上刷新工作簿中的查询,而不是查询表。同样的答案也适用。

    简而言之:它的行为符合预期。

    关于vba - 全部刷新没有触发 QueryTable 的 BeforeRefresh 事件 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44531126/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com