【问题标题】:Auto-updating Power Query Connection via VBA通过 VBA 自动更新 Power Query 连接
【发布时间】:2016-08-22 12:39:40
【问题描述】:

我在 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 连接。有什么想法吗?

【问题讨论】:

  • 我不建议使用 RefreshAll 方法,永远不会!仅仅是因为,在我的工作簿中,我将有超过 300 个查询,如果我们不小心点击了全部刷新,计算机将会崩溃。您可以按查询的名称刷新查询,或者查询是否以某些字符开头。如果您像我一样组织查询并使用命名约定,则可以刷新查询“grp1_Qry_1”、“grp1_Qry_2”等,例如:刷新所有以“grp1_”开头的查询。比刷新所有查询要好得多。小提示 * 电源查询连接名称以“Query -”开头...查看我的答案 :)

标签: excel vba powerquery data-connections


【解决方案1】:

其实很简单,如果你检查你现有的连接,你可以看到电源查询连接名称是如何开始的,它们都是一样的,它们以“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 个字符(前 8 个字符)等于字符串“Query -”,那么...

  • 如果您知道查询的名称,请将 8 调整为一个数字,以指示查询名称中的字符数,然后使语句等于您的查询连接名称,而不是所有权力的开始查询连接(“查询 - ”)...

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

编码愉快:)

【讨论】:

    【解决方案2】:

    如果通过循环刷新所有连接,则无法控制发生的顺序。如果您需要控制序列,或者如果您只需要刷新几个 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
    

    【讨论】:

      【解决方案3】:

      由于您使用的是不同于 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/

      【讨论】:

      • 我都做了。这是行不通的。我什至把代码写成这样: Dim cn As WorkbookConnection For Each cn In ThisWorkbook.Connections cn.Refresh Next cn
      • 能否请您添加连接的其他选项卡的图片?
      • @Hila_DG 感谢您的回答!我刚刚添加了
      • (我不知道,但也许)尝试在 Sheet1 中命名数据区域(使其成为命名表),然后将连接从 SQL 更改为 Table?
      • 不要认为电源查询连接名称以那个开头,而只是“查询-”,也许这就是它不起作用的原因
      【解决方案4】:

      只是为了回应 James Heffer 的帖子,该帖子经过一些调整后对我有用。 如果您居住在非英语国家/地区,您的连接会更改名称。 您可以通过添加 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” 希望它可以帮助某人?

      【讨论】:

        【解决方案5】:

        你也可以试试这段代码

        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 格式:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-13
          相关资源
          最近更新 更多