使用 VBA 更新 Excel 中的查询

Update queries in Excel using VBA

我使用来自 Teradata 的连接将查询 (Query1) 加载到 Excel 。通常当我想更新查询时,我必须右键单击它并选择编辑。

进入 Power Query 编辑器 后,我可以打开 Source 并编辑 SQL script 里面更新查询。

问题是如何使用 VBA 编辑此 SQL 脚本?

在尝试使用 宏记录器 时,我只能使用

刷新查询
ActiveWorkbook.Connections("Query - Query1").OLEDBConnection.Refresh

尝试编辑 CommandText 也失败了。这是查询的属性。

ActiveWorkbook.Connections("Query - Query1").OLEDBConnection.Refresh

首先,将 ActiveWorkbook 替换为 ThisWorkbook,因为您打算使用 那个 特定工作簿(托管您的 VBA代码),而不是 当前处于活动状态的任何工作簿

.Refresh 是您要修改的 OLEDB 连接的 方法:您已经拥有对要修改其命令文本的连接的引用 - 全部您需要的是针对它调用 .Refresh 以外的方法,即 try 输入该点并查看该对象必须提供的内容。

您可以通过 CommandText 属性 为 OLEDBConnection 对象获取 命令文本 - 尝试在 立即窗格 (Ctrl+G) 并查看是否得到相同的输出:

?ThisWorkbook.Connections("Query - Query1").OLEDBConnection.CommandText
SELECT * FROM [Query1]

只需分配给那个属性:

Dim oledb As OLEDBConnection
Set oledb = ThisWorkbook.Connections("Query - Query1").OLEDBConnection
oledb.CommandText = "SomeOtherTable"
oledb.Refresh

首先我们得到查询的公式:

Debug.Print ThisWorkbook.Queries.Item("Query1").Formula

我们需要这样做的原因是因为公式字符串包含一些关于我们的数据库连接的额外信息,而不仅仅是 sql 查询本身。它可能看起来像这样:

let Source = Teradata.Database("tdprod1.ov.de", [HierarchicalNavigation=true, Query="SELECT week, revenue FROM table1"]); in Source

为了更新查询,我们将 ThisWorkbook.Queries.Item("Query1").Formula 设置为新的公式字符串。在处理 VBA 中的双引号时也要小心。这是我使用的脚本:

' Update the query Query1 using the provided parameters
Sub UpdateQuery1()

' string to represent a single double quote for VBA string
Const vbDoubleQuote As String = """"

Dim oledb As OLEDBConnection
Dim queryFormula As String

' get the connection
Set oledb = ThisWorkbook.Connections("Query - Query1").OLEDBConnection

' the new formula of the query
Let queryFormula = _
"let " & _
    "Source = Teradata.Database(" & vbDoubleQuote & "tdprod1.ov.de" & vbDoubleQuote & ", [HierarchicalNavigation=true, Query=" & vbDoubleQuote & _
    "SELECT #(lf)a.kw MOD 100 AS KW, #(lf)a.r_Category2_ID AS Category_ID,#(lf)a.r_category3_ID AS Subcategory_ID,#(lf)#(lf)a.vt_p_j AS VP_Jahr,#(lf)a.vt_p_p AS ..." & _
"in Source"

' update the formula of the query
Let ThisWorkbook.Queries.Item("Query1").Formula = queryFormula

' refresh the connection
oledb.Refresh

End Sub