Обновление запросов в Excel с использованием VBA - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть запрос ( Query1 ), загруженный в Excel с использованием соединения из Teradata . Обычно, когда я хочу обновить запрос, я должен щелкнуть его правой кнопкой мыши и выбрать «Изменить».

enter image description here

Оказавшись в Редакторе запросов мощности , я могу открыть Источник и отредактировать SQL скрипт внутри для обновления запроса.

enter image description here

Вопрос в том, как я могу отредактировать этот SQL скрипт , используя VBA ?

При попытке использовать Macro Recorder , я могу только повторно sh запрос, используя

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

Попытка отредактировать CommandText также не смогли. Вот свойства запроса.

enter image description here

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020
ActiveWorkbook.Connections("Query - Query1").OLEDBConnection.Refresh

Сначала замените ActiveWorkbook на ThisWorkbook, поскольку вы хотите работать с этой специфицированной c книгой (той, в которой размещен ваш код VBA) а не независимо от того, какая книга активна в данный момент .

.Refresh - это метод соединения OLEDB, который вы хотите изменить: у вас уже есть ссылка на Соединение, для которого вы хотите изменить текст команды - все, что вам нужно, это вызвать для него метод, отличный от .Refresh, то есть попытаться набрать эту точку и посмотреть, что этот объект может предложить.

Вы можете получить текст команды для этого OLEDBConnection объекта через его свойство CommandText - попробуйте ввести его в ближайшей панели (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
0 голосов
/ 14 февраля 2020

Сначала мы получаем формулу запроса, используя:

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
...