打开工作簿时 Power Query 刷新完成时如何卸载用户表单

问题描述 投票:0回答:1

背景

我有一本 Excel 工作簿,里面有大约 5 个强力查询。 它们被设置为在保存时卸载数据并在打开时刷新。这是通过强大的查询设置的,因为我被告知,如果从工作簿中剥离 VBA,工作簿基础知识仍然需要发挥作用。 不过,我仍然可以添加一些细节,以便在 VBA 存在并工作时使最终用户体验更好。

我创建了一个按钮,可以为用户刷新所有查询,并在更新时显示一条消息,完成后卸载,并替换为一个指示操作完成的消息框。

手动刷新的代码如下:

Private Sub Btn_Refresh_aLL_Click()
'********************************************************************************
'This sub refreshes all data links.  Does the same job as pressing refresh all
'in the data tab of the ribbon.  Set Userform1 Showmodal to False to all code
'to be continued to be processed.
'********************************************************************************
    
    UserForm1.Show
    ThisWorkbook.RefreshAll
    Unload UserForm1
    MsgBox "Database refresh complete"
    
End Sub

现在我已经设置了,它工作得非常好

ShowModal = False

问题

我想在 Workbook_Open 期间显示相同的用户表单,然后在刷新完成后将其卸载。 我不知道如何确定这种情况何时发生。 使用手动方法,刷新命令夹在 show 和 unload 之间。打开三明治时没有自动刷新的命令行。

我尝试过的事情

我在 Workbook_Open 中的消息框中扔了一个消息框,看看 Power Query Refresh 是在触发 Workbook_Open 之前还是之后发生,因为 Power Query Refresh 是在没有代码的情况下执行的。 不幸的是,在这种情况下,Workbook_Open 首先执行,并且消息框阻止 Power Query 刷新发生。

在搜索信息时,我遇到了 this Question,它似乎讨论了这个问题,但是来自 VBA 内发生的刷新调用。 我的情况可能有所不同,因为我正在处理 Power Query 中触发的自动过程。 这个问题也有点过时,根据我读到的内容,Power Query 和 VBA 之间的交互似乎已经改变。 如果我的问题的答案就在那个问题中,那么它超出了我的理解范围,我需要向我解释它。

Private Sub Workbook_Open()
    MsgBox "Wait for databases to load." & vbCr _
        & vbCr _
        & "Monitor progress in the bottom" & vbCr _
        & "right corner of the Excel status bar."
End Sub

问题

如何确定工作簿打开时在 Power Query 中触发的 Power Query 刷新何时完成,以便可以卸载 Workbook_Open 期间显示的用户表单。

更新

我的所有 Power Query 都设置了以下属性:

enter image description here

excel vba powerquery excel-365
1个回答
0
投票

使用这两个辅助子程序

Sub SetAllQueriesRefreshOnOpen(Optional setOn As Boolean = False)
'Sets the Refresh on open settings for all queries in the workbook
'setOn = True sets RefreshOnOpen to True
'As default PQ behaviour is to set this on, default behaviour for this function is to turn it off
    
    Dim objConnection As Object
    For Each objConnection In ThisWorkbook.Connections
        objConnection.OLEDBConnection.RefreshOnFileOpen = setOn
    Next
End Sub
Sub SetAllQueriesBackground(Optional setOn As Boolean = False)
'Sets the BackgroundQuery setting for all queries in the workbook
'setOn = True sets BackgroundQuery = True
'As default PQ behaviour is to set this on, default behaviour for this function is to turn it off

    Dim objConnection As Object
    For Each objConnection In ThisWorkbook.Connections
        objConnection.OLEDBConnection.BackgroundQuery = setOn
    Next

End Sub

在您的工作簿_打开子目录中

Private Sub Workbook_Open()

    SetAllQueriesRefreshOnOpen False
    SetAllQueriesBackground False

    UserForm1.Show
    ThisWorkbook.RefreshAll
    Unload UserForm1

    'This will ensure workbook works if VBA is stripped
    SetAllQueriesRefreshOnOpen True
    SetAllQueriesBackground True

    MsgBox "Database refresh complete"
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.