Excel 通过VBA自动更新电源查询连接

Excel 通过VBA自动更新电源查询连接,excel,vba,powerquery,data-connections,Excel,Vba,Powerquery,Data Connections,我在myexcel.xlsx中设置了电源查询。我将其连接的属性设置为 和 我编写了一个VBA代码,如下所示 Sub UpdateData() Dim filename As String Dim wbResults As Workbook filename = "C:\myexcel.xlsx" Set wbResults = Workbooks.Open(filename) ActiveWorkbook.RefreshAll wbResults.Clo

我在myexcel.xlsx中设置了电源查询。我将其连接的属性设置为 和

我编写了一个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时,电源查询连接将更新。但通过VBA代码,它不会。我应该补充一点,我用一个老式的Excel连接测试了它,通过VBA代码它工作得很好。但问题在于电源查询连接。有什么想法吗?

因为您使用的是与Power Pivot不同的Power Query,所以有两个选项:

  • 文件打开时自动更新数据源-()
  • 编写用于更新的VBA脚本

    
    对于此工作簿中的每个cn.Connections
    如果cn=“Power Query–Employee”,则cn.Refresh
    下一个cn
    端接头
    

  • 从这里复制:

    这其实相当简单,如果您查看现有的连接,您可以看到power query连接名称是如何开始的,它们都是以“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
    
    这将刷新所有power查询,但在代码中您可以看到它显示:

    If Left(con.name, 8) = "Query - " Then
    
    这只是意味着如果连接的名称,从左开始向右移动的前八个字符(前8个字符)等于字符串“Query-”,那么

    • 如果您知道查询的名称,请将8调整为一个数字,该数字将指示查询名称中的字符数,然后使语句等于查询连接名称,而不是所有电源查询连接的开始(“查询-”)
    如果你有大量的电力查询,我建议不要一次更新所有的电力查询。您的计算机可能会崩溃,并且您的excel可能没有自动保存


    快乐编码:)

    您也可以尝试此代码

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

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

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

    然后,第二个函数使用第一个函数按特定顺序调用特定的电源查询,从而为您提供完全控制

    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
    

    我两者都做过。它不起作用。我甚至写了这样的代码:Dim cn作为工作簿中每个cn的WorkbookConnection.Connections cn.刷新下一个cn您能添加连接的另一个选项卡的图片吗?@Hila_DG谢谢您的回答!我刚刚添加了(我不知道,但可能)尝试在Sheet1中命名数据区域(使其成为命名表),然后将连接从SQL更改为table?不要认为power query连接名称以该名称开头,而只是“query-”,可能这就是它不起作用的原因我不建议使用RefreshAll方法,永远!只是因为,在我的工作簿中,我将有300多个查询,如果我们意外地点击“全部刷新”,计算机将崩溃。您可以按查询的名称刷新查询,或者如果查询以某些字符开头,则可以刷新查询。如果您像我一样组织查询并使用命名约定,您可以刷新查询“grp1_Qry_1”、“grp1_Qry_2”等,例如:刷新所有以“grp1_”开头的查询。比刷新所有查询要好得多。小提示*电源查询连接名称以“Query-”开头。。。见我的答案:)
    Public Sub RefreshListOfPowerQueries()
    
    Call RefreshSpecificPowerQuery("pqMyFirstPowerQueryName")
    Call RefreshSpecificPowerQuery("pqMySecondPowerQueryName")
    
    End Sub