使用VBA将查询数据加载到工作表中

Load query data into worksheet with VBA

提问人:martin_hansson 提问时间:7/18/2023 更新时间:7/18/2023 访问量:270

问:

我正在尝试自动化我的同事们正在做的流程。该过程今天是手动的,他们有一个旧的 VBA 宏,该宏错误地格式化了文件,当我修复此问题时,我认为我可以自动执行他们所做的其他一些步骤。今天的步骤是:

  1. 打开一个新的 excel 文件
  2. 转到数据 -> 从文件中获取数据 -> 从文本/CSV
  3. 选择文件
  4. 选择 1252:西欧 (Windows),分隔符分号
  5. 负荷
  6. 运行宏
  7. 另存为使用 utf-8 编码的 csv

我已经设法修复了每个步骤,但是在导入csv数据时遇到问题。我已设法将连接添加到正确的文件,但工作表中没有显示任何数据,即使数据在Power Query编辑器中正确显示也是如此。我尝试搜索如何“加载”数据,但我无法弄清楚。

我当前用于创建连接的代码:

Sub formatCSV()

    'Import data from csv
    Dim workbook As workbook
    Dim filePath As String
    Dim importFormula As String
    
    'Set file path
    filePath = ""
    
    Set workbook = ActiveWorkbook
    
    importFormula = _
    "let " & _
        "Source = Csv.Document(File.Contents(""" & filePath & """), [Delimiter = "";"", Columns=30, Encoding=1252, QuoteStyle=QuoteStyle.Csv]), " & _
        "#""Promoted Headers"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]) " & _
    "in " & _
        "Source"
    
    workbook.Queries.Add Name:="Query1", Formula:=importFormula

End Sub

感谢所有的帮助!

Excel VBA CSV PowerQuery

评论

0赞 JohnM 7/18/2023
是指向实际文件吗?filePath
1赞 horseyride 7/18/2023
右键单击 powerquery 查询名称并加载到...。或者你想在VBA中做那部分?

答:

1赞 Szymon Pecuch 7/18/2023 #1

您可以尝试 Sub 它需要两个参数:查询名称和目标工作表作为对象。它在 A1 单元格上加载数据。

您可以在 sub 的 aed 中添加到您的代码中进行尝试:

LoadQuery "Query1", ActiveSheet

子代码:

Private Sub LoadQuery(ByVal QueryName As String, ByVal LoadDataSheet As Worksheet)

With LoadDataSheet.ListObjects.Add(SourceType:=0, Source:= _
                                 "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & QueryName & ";Extended Properties=""""", _
                                 Destination:=LoadDataSheet.Range("$A$1")).QueryTable
    .CommandType = xlCmdSql
    .CommandText = Array("SELECT * FROM [" & QueryName & "]")

    .RowNumbers = False
    .FillAdjacentFormulas = False
    '.PreserveFormatting = False
    .RefreshOnFileOpen = False
    .BackgroundQuery = False
    .RefreshStyle = xlOverwriteCells
    .SavePassword = False
    .SaveData = False
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    '.PreserveColumnInfo = True
    .ListObject.DisplayName = "Table_" & QueryName
    .Refresh BackgroundQuery:=False

End With

''Additionally you can unlink data from Power Query and unlist - transform ListObject to data in cells
'With LoadDataSheet.ListObjects.Item("Table" & QueryName)
'    .Unlink
'    .Unlist
'End With


End Sub