【问题标题】:Refresh Power Queries Then Pivot Tables刷新电源查询然后数据透视表
【发布时间】:2021-10-25 02:37:50
【问题描述】:

我正在尝试更新大约十几个 Power Queries,等到它们完成,然后刷新所有附加到它们的数据透视表。

我有这个 VBA 脚本,我已经在我正在努力解决的部分添加了注释:

Public Sub UpdatePowerQueries()

Application.DisplayAlerts = True

For Each Worksheet In ActiveWorkbook.Worksheets
Worksheet.Unprotect
Next Worksheet

'Start of trouble section
Dim StatusCheck As Long, Connection As WorkbookConnection, RefreshCheck As String, RefreshCheckLoop As Integer

On Error Resume Next
For Each Connection In ThisWorkbook.Connections
    StatusCheck = InStr(1, Connection.OLEDBConnection.Connection, "Provider=Microsoft.Mashup.OleDb.1", vbTextCompare)
    If Err.Number <> 0 Then
        Err.Clear
        Exit For
    End If
If StatusCheck > 0 Then Connection.OLEDBConnection.BackgroundQuery = False
If StatusCheck > 0 Then Connection.Refresh

RefreshCheckLoop = 1

While RefreshCheckLoop < 15
    RefreshCheck = Connection.OLEDBConnection.Refreshing
    If RefreshCheck = True Then Application.Wait (Now + TimeValue("00:00:01"))
    RefreshCheckLoop = RefreshCheckLoop + 1
Wend
Next Connection

DoEvents

ActiveWorkbook.RefreshAll
'End of trouble section

For Each Worksheet In ActiveWorkbook.Worksheets
    If Worksheet.Visible Then
        Worksheet.Activate
        Range("A1").Select
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
    End If
Next Worksheet
    
For Each Worksheet In ActiveWorkbook.Worksheets
Worksheet.Protect
Next Worksheet

Worksheets("Table Of Contents").Activate

ActiveWorkbook.Save

Application.DisplayAlerts = True

End Sub

在我读到的所有地方,它都说将 BackgroundQuery 设置为 false,它应该等到完成后再继续刷新数据透视表的下一部分,但我仍然收到烦人的黄色小三角形,告诉我“下载没有完成。”每个查询旁边。我已将所有电源查询设置为不通过“RefreshAll”命令更新。

我错过了什么吗?

【问题讨论】:

  • 我建议在移动到下一个之前检查它是否仍在刷新。 docs.microsoft.com/en-us/office/vba/api/… 然后是 DoEvents
  • 在循环中出现第一个错误时,您会跳出循环 - 出现错误的连接之后的其他连接呢?
  • @TimWilliams,他们都出错了......即使数据似乎正在刷新。
  • @Sorceri,我已经更新了上面的逻辑。我添加了一个循环来查看连接是否仍在刷新,然后在 Power Query 刷新之后和 RefreshAll 之前添加一个 DoEvents。我仍然有同样的黄色三角形。
  • 我的意思是,一旦您的For Each Connection In ThisWorkbook.Connections 循环中出现一个连接错误,您就会退出循环。除非每个工作簿只有一个连接?

标签: excel vba


【解决方案1】:

遵循@Sorceri 的建议。我几乎在代码的每一步都添加了 Do Events:

Public Sub UpdatePowerQueries()

Application.DisplayAlerts = False

For Each Worksheet In ActiveWorkbook.Worksheets
Worksheet.Unprotect
Next Worksheet

Dim StatusCheck As Long, Connection As WorkbookConnection, RefreshCheck As String, RefreshCheckLoop As Integer

On Error Resume Next
For Each Connection In ThisWorkbook.Connections
    StatusCheck = InStr(1, Connection.OLEDBConnection.Connection, "Provider=Microsoft.Mashup.OleDb.1", vbTextCompare)
    If Err.Number <> 0 Then
        Err.Clear
        Exit For
    End If
If StatusCheck > 0 Then Connection.OLEDBConnection.BackgroundQuery = False
If StatusCheck > 0 Then Connection.OLEDBConnection.MaintainConnection = False
If StatusCheck > 0 Then Connection.Refresh

RefreshCheckLoop = 1

While RefreshCheckLoop < 15
    RefreshCheck = Connection.OLEDBConnection.Refreshing
    If RefreshCheck = True Then Application.Wait (Now + TimeValue("00:00:01"))
    RefreshCheckLoop = RefreshCheckLoop + 1
Wend
Next Connection

DoEvents

ActiveWorkbook.RefreshAll

DoEvents

For Each Worksheet In ActiveWorkbook.Worksheets
    If Worksheet.Visible Then
        Worksheet.Activate
        Range("A1").Select
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
    End If
Next Worksheet
    
DoEvents

For Each Worksheet In ActiveWorkbook.Worksheets
Worksheet.Protect
Next Worksheet

DoEvents

Worksheets("Table Of Contents").Activate

DoEvents

ActiveWorkbook.Save

Application.DisplayAlerts = True

End Sub

这似乎有效,因为我已经运行了大约 10 次,但没有收到我烦人的黄色三角形。

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2018-12-30
    • 2016-01-11
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多