12

我在 myexcel.xlsx 中设置了 Power Query。我将其连接的属性设置为 thisthis

我写了如下的VBA代码

Sub UpdateData()
    Dim filename As String
    Dim wbResults As Workbook
   filename = "C:\myexcel.xlsx"
   Set wbResults = Workbooks.Open(filename)

   ActiveWorkbook.RefreshAll
   wbResults.Close savechanges:=True

End Sub

当我手动打开 myexcel.xslx 时,Power Query 连接会更新。但是通过 VBA 代码却没有。我应该补充一点,我使用老式的 Excel 连接对此进行了测试,并且通过 VBA 代码可以正常工作。但问题在于 Power Query 连接。有什么想法吗?

4

5 回答 5

14

这实际上是相当简单的,如果你检查你现有的连接,你可以看到电源查询连接名称是如何开始的,它们都是一样的,它们以“Query -”开头,然后是名称......我的项目,我写了这个有效的代码:

Sub RefreshQuery()
Dim con As WorkbookConnection
Dim Cname As String

For Each con In ActiveWorkbook.Connections
    If Left(con.name, 8) = "Query - " Then
    Cname = con.name
        With ActiveWorkbook.Connections(Cname).OLEDBConnection
            .BackgroundQuery = False  'or true, up to you
            .Refresh
        End With
    End If
Next
End Sub

这将刷新您所有的电源查询,但在代码中您可以看到它说:

If Left(con.name, 8) = "Query - " Then

这只是意味着如果连接的名称,从 LEFT 开始向 RIGHT 移动的前八个字符(前 8 个字符)等于字符串“Query -”,那么...

  • 如果您知道查询的名称,请将 8 调整为表示查询名称中字符数量的数字,然后使语句等于您的查询连接名称,而不是所有电源查询连接的开头( “询问 - ”)...

如果您有大量电源查询,我建议永远不要一次更新所有电源查询。您的计算机可能会崩溃,并且您的 Excel 可能没有自动保存。

快乐编码:)

于 2016-07-29T08:19:47.063 回答
6

如果通过循环刷新所有连接,则无法控制发生的顺序。如果您需要控制序列,或者如果您只需要刷新几个 Power Queries,这也是一个选项:

第一个函数刷新一个 Power Query。括号中函数的参数是在 Excel 的“查询和连接”窗格中可见的查询名称。请注意如何通过添加“Query -”作为前缀将其转换为连接名称。

然后,第二个函数使用第一个函数以特定顺序调用特定的 Power Queries,让您完全控制。

Public Sub RefreshSpecificPowerQuery(pqName As String)

Dim con As WorkbookConnection
Dim conName As String

conName = "Query - " & pqName

With ActiveWorkbook.Connections(conName).OLEDBConnection
    .BackgroundQuery = False    'or TRUE, as the case requires
    .Refresh
End With

End Sub
Public Sub RefreshListOfPowerQueries()

Call RefreshSpecificPowerQuery("pqMyFirstPowerQueryName")
Call RefreshSpecificPowerQuery("pqMySecondPowerQueryName")

End Sub
于 2019-11-27T17:42:23.327 回答
4

由于您使用的是与 Power Pivot 不同的 Power Query,因此您有两个选择:

  1. 文件打开时自动更新数据源 - ( http://www.excel2013.info/power-query/automatic-update/ )
  2. 编写一个 VBA 脚本来更新它

    For Each cn In ThisWorkbook.Connections If cn = "Power Query – Employee" Then cn.Refresh Next cn End Sub

从这里复制: https ://devinknightsql.com/category/power-query/

于 2016-04-28T01:32:57.047 回答
1

只是为了回应詹姆斯赫弗的帖子,该帖子经过一些调整后对我有用。如果您居住在非英语国家/地区,您的连接会更改名称。您可以通过添加 Debug.Print 命令来查看连接名称,如下所示

Sub RefreshQuery()
Dim con As WorkbookConnection
Dim Cname As String

For Each con In ActiveWorkbook.Connections
    Debug.Print con
    If Left(con.name, 8) = "Query - " Then
    Cname = con.name
        With ActiveWorkbook.Connections(Cname).OLEDBConnection
            .BackgroundQuery = False  'or true, up to you
            .Refresh
        End With
    End If
Next
End Sub

运行代码后,它将显示本地化名称。我的被​​称为“Forespørgsel – LevBonusData” 希望它可以帮助某人

于 2021-08-20T09:53:22.303 回答
0

您也可以尝试此代码

Sub auto_open()
    ActiveWorkbook.RefreshAll
    Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
    ThisWorkbook.Save
    ChDir "D:\Data"
    ActiveWorkbook.SaveAs Filename:="D:\Data\abc.txt", FileFormat:=xlText, CreateBackup:=False
    Application.Quit
End Sub

当您打开文件时,宏将自动运行,并且数据将被保存,最后一个文件也将保存为 TXT 格式:)

于 2019-05-02T12:32:08.573 回答