使用VBA更新Excel中的查询

cpjpxq1n  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(253)

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

进入Power Query Editor后,我可以打开Source并在其中编辑SQL脚本以更新查询。

问题是如何使用VBA编辑此SQL脚本
在尝试使用宏记录器时,我只能使用

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

尝试编辑CommandText也失败。以下是查询的属性。

9jyewag0

9jyewag01#

首先,我们使用以下公式获得查询的公式:

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
xdnvmnnf

xdnvmnnf2#

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

相关问题