Выберите разные источники запроса вручную, используя vba - PullRequest
0 голосов
/ 17 января 2020

ОШИБКА ВРЕМЕНИ РАБОТЫ:

enter image description here

ВАРИАНТ ОТЛАДКИ:

enter image description here

ОШИБКА ЗАПРОСА ПОСЛЕ РАБОТЫ VBA:

enter image description here

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

Sub Import()
'
' Import Macro
'
    Dim fname As String
    fname = Application.GetOpenFilename("Text Files (*.txt), *.txt")


    ActiveWorkbook.Queries.Add Name:="Data", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(""" & fname & """),[Delimiter="" "", Columns=3, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""Changed Type"" = Table.TransformColumnTypes(Source,{{""Column1"", type text}, {""Column2"", type text}, {""Column3"", type text}})," & Chr(13) & "" & Chr(10) & "    #""Removed Columns"" = Table.Rem" & _
        "oveColumns(#""Changed Type"",{""Column2""})," & Chr(13) & "" & Chr(10) & "    #""Renamed Columns"" = Table.RenameColumns(#""Removed Columns"",{{""Column1"", ""HANDLE""}, {""Column3"", ""CIRCUIT""}})," & Chr(13) & "" & Chr(10) & "    #""Removed Top Rows"" = Table.Skip(#""Renamed Columns"",2)" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Removed Top Rows"""
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Data"";Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [Data]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Data"
        .REFRESH BackgroundQuery:=False
    End With
'
End Sub





1 Ответ

0 голосов
/ 18 января 2020

Чтобы ответить на ваш вопрос напрямую, ваш M-код синтаксически неверен. (На этом конкретном изображении вы разместили: https://i.stack.imgur.com/AI6ca.png.)

Чтобы исправить это, избавьтесь от первого ) в вызове Csv.Document. Другими словами:

Source = Csv.Document("someFilePath",[Delimiter=" ", Columns=3, Encoding=1252, QuoteStyle=QuoteStyle.None]),

вместо:

Source = Csv.Document("someFilePath"),[Delimiter=" ", Columns=3, Encoding=1252, QuoteStyle=QuoteStyle.None]),

Это должно по крайней мере решить синтаксическую ошибку.


Вместо вашего текущего подхода, это вместо этого может быть лучше:

  1. Измените запрос, чтобы найти путь к файлу из некоторого именованного диапазона (это можно сделать с помощью Excel.CurrentWorkbook() в Power Query и затем развернуть).
  2. Когда ваша подпрограмма VBA выполняется, запишите путь к файлу (который пользователь предоставляет через Application.GetOpenFilename) в указанный именованный диапазон.
  3. Refre sh запрос программно (как часть вашей подпрограммы VBA).
  4. Все остальное должно работать так же (поскольку путь к файлу по-прежнему динамический c).

Преимущество здесь в том, что вам не нужно манипулировать вашим M-кодом непосредственно в VBA, таким образом, нет такого же риска внесения синтаксических ошибок.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...