Как автоматизировать запрос мощности в VBA?

У меня есть данные в листе 1. Обычно я перехожу к запросу на мощность и выполняю свои преобразования, затем закрываю и загружаю на существующий лист 2.

Я хотел бы автоматизировать это с помощью VBA, где я могу просто запустить свой запрос мощности автоматически и заполнить преобразование на лист 2.

Макро-рекордер, похоже, не позволяет мне записывать шаги. И об этом мало что известно.

Попытка простейшего кода:

Sub LoadToWorksheetOnly()

'Sub LoadToWorksheetOnly(query As WorkbookQuery, currentSheet As Worksheet)
    ' The usual VBA code to create ListObject with a Query Table
    ' The interface is not new, but looks how simple is the conneciton string of Power Query:
    ' "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & query.Name

    query = Sheets("Sheet6").Range("A1").value 'here is where my query from power query is. I put the text from power query avanced editor in another sheet cell.
    currentSheet = ActiveSheet.Name
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & query.Name _
        , Destination:=Sheets("target").Range("$A$1")).QueryTable
        .CommandType = xlCmdDefault
        .CommandText = Array("SELECT * FROM [" & query.Name & "]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .Refresh BackgroundQuery:=False
    End With

End Sub

Вот моя проблема при попытке загрузить на новый лист вручную.

enter image description here

Ответ 1

WIP:

Так как написать это, чтобы быть достаточным? Суть в том, что вы должны настроить свой запрос, используя встроенные инструменты, а не VBA. Вы загружаете свои данные с помощью соответствующего метода, который может быть из файла, зацикливая файлы в папке, сети, базе данных... список можно продолжить. Вы можете импортировать из внешних источников, а также загружать из внутренних. Посмотрите здесь для получения дополнительной информации о загрузке из внешних источников.

Как только вы защитите свой источник и загрузите его, вам будет представлен редактор запросов, в котором вы сможете выполнить свои шаги преобразования.

Дело в том, что когда вы выполняете свои действия с использованием пользовательского интерфейса, М-код пишется в фоновом режиме и формирует основу для повторного использования запроса, если вы не меняете исходный формат или местоположение.

В вашем случае, когда вы выполнили свои шаги и получили запрос, который хотите, затем закройте и загрузите на sheet2.

На этом шаге при первой настройке вы выберете лист 2 в качестве места закрытия и загрузите пункт назначения:

Close and load

NB. Когда вы выбираете существующий лист, убедитесь, что лист 2 уже существует, и вы можете вручную редактировать лист 2! перед предложенным диапазоном.


У вас возникают проблемы, потому что вы продолжаете пытаться воссоздать все это с помощью кода.

Не. Установите его с помощью пользовательского интерфейса и загрузите в sheet2. С этого момента либо откройте редактор запросов, чтобы отредактировать шаги и/или обновить запрос, чтобы загрузить существующий лист2 с новыми/обновленными данными.


Некоторые из доступных методов обновления вашего запроса:

Запрос будет обновляться с помощью VBA/Обновление вручную на листе, в котором он находится (Sheet2), или на саму книгу, например, Sheet2.Calculate, ThisWorkbook.RefreshAll, вручную нажимая кнопку обновления книги на вкладке данных (все это на самом деле перебор )

Refresh all tab

Более целенаправленные методы:

VBA для таблицы запросов на листе 2:

ThisWorkbook.Worksheets("Sheet2").ListObjects(1).QueryTable.Refresh BackgroundQuery:=False   

Измените вышеуказанное на соответствующую таблицу и т.д.

Щелкните правой кнопкой мыши на самой таблице запросов и выберите "Обновить":

Refresh

Нажмите кнопку обновления в окне запросов к рабочей книге справа для рассматриваемого запроса (значок с зелеными кружевными стрелками).

Refresh


Кен Тянет путь VBA (незначительное редактирование от меня)

Option Explicit
Public Sub UpdatePowerQueries()
    ' Macro to update my Power Query script(s)

    Dim lTest As Long, cn As WorkbookConnection
    On Error Resume Next
    For Each cn In ThisWorkbook.Connections
        lTest = InStr(1, cn.OLEDBConnection.Connection, "Provider=Microsoft.Mashup.OleDb.1", vbTextCompare)
        If Err.Number <> 0 Then
            Err.Clear
            Exit For
        End If
        If lTest > 0 Then cn.Refresh
    Next cn
    On Error GoTo 0
End Sub

Не должно быть никакой реальной необходимости выполнять всю эту работу через VBA. У вас могут быть некоторые хитрые манипуляции с данными, которые вам удобнее делать с VBA, а затем иметь PowerQuery для доступа к обработанным данным в качестве источника. Вы можете запустить весь лот, запустив подпрограмму, которая вызывает процедуру обработки, а затем использует один из перечисленных выше методов команд VBA. Есть больше методов, и я добавлю их, когда у меня будет больше времени.


Расчеты:

Если у вас есть расчеты, которые зависят от вывода PowerQuery, у вас есть 4 очевидных немедленных варианта:

  1. Добавьте эти вычисления, где это возможно, в PowerQuery. Он поддерживает вычисляемые столбцы, пользовательские функции и многое другое.
  2. Добавьте выходные данные PowerQuery в модель данных и используйте модель данных для выполнения вычислений, включая вычисляемые поля. Это также даст вам доступ к функциям временной разведки.
  3. Используйте VBA, чтобы добавить вычисления в соответствующие области на листе 2, если диапазон изменяется при обновлении.
  4. Если диапазон не меняется при обновлении, просто уберите ваши формулы.

Ответ 2

Я не согласен с предпосылкой вышеуказанного ответа; VBA абсолютно подходит для автоматизации PowerQuery и особенно эффективен для повторяющейся работы. Хитрость заключается в том, чтобы сначала создать запрос, который вам нужен в PowerQuery, а затем использовать расширенный редактор для захвата M. Скопируйте его и сохраните либо в ячейке рабочей книги, либо в отдельном текстовом файле.

Метод подробно описан Гилом Равивом. Для удобства я храню свой M в текстовых файлах вместо рабочей книги и загружаю его:

Function LoadTextFile(FullFileName As String) As String
  With CreateObject("Scripting.FileSystemObject")
    LoadTextFile = .OpenTextFile(FullFileName, 1).readall
  End With 
End Function

Приятная вещь в текстовых файлах заключается в том, что они не зависят от Excel и могут использоваться во многих рабочих книгах.

Вот немного М:

let
// load the reference file (variables are shown in capitals;  
// variable values are replaced with strings from the excel control workbook)
    Source = Excel.Workbook(File.Contents(PATH_AND_NAME), null, true),
    ImportSheet = Source{[Item=SHEET_NAME,Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(ImportSheet),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"ACCOUNT", type text}})
in
    #"Changed Type"