带有OLEDB的SQL字符串在VBA中给出错误1004

问题描述

我想通过VBA宏将文本文件导入到excel过滤器中。当我在sql字符串中使用LIKE运算符时,出现错误1004。 我已经尝试将*%用作通配符,并且将ALike而不是Like用作通配符,但是没有区别。

test_7.txt

946737295   9CE78280    FF  1   5   FF  FF  FF  FF  FF
946737295   9CE78280    C0  FF  0   0   0   0   FF  FF
946737295   9CE68082    C0  4   0   FF  FF  FF  FF  FF

,宏为:

Sub import_txt()

Dim input_path As String
input_path = "C:\test_7.txt"

Dim strsql As Variant
strsql = "SELECT * FROM [test_7]" & _
   " WHERE Column2 Like '*E7*' AND" & _
   " Column4='FF'"
   
    ActiveWorkbook.Queries.Add Name:="test_7",Formula:= _
    "let" & "    Origine = Csv.Document(File.Contents(""" & input_path & """),[Delimiter=""#(tab)"",Columns=10,Encoding=1252,QuoteStyle=QuoteStyle.None])," & "    #""Modifica tipo"" = Table.TransformColumnTypes(Origine,{{""Column1"",type text},{""Column2"",{""Colum" & _
    "n3"",{""Column4"",{""Column5"",{""Column6"",{""Column7"",{""Column8"",{""Column9"",{""Column10"",type text}})" & "in" & "    #""Modifica tipo"""
    
ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0,Source:= _
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=test_7;Extended Properties=""""" _,Destination:=Range("$A$1")).QueryTable
    .CommandType = xlCmdsql
    .CommandText = Array(strsql) 'Array("SELECT * FROM [test_7]")
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .ListObject.displayName = "test_7"
    .Refresh BackgroundQuery:=False
End With
End Sub

解决方法

SQL语句不能与Power Query提供程序一起很好地工作。但是您可以通过与查询关联的公式完全实现所需的功能。

请参见以下示例:

Sub readTxt()
Dim Wb As Workbook
Dim Ws As Worksheet
Dim Conn As WorkbookConnection
Dim mFormula As String
Dim query As WorkbookQuery

Set Wb = ActiveWorkbook
Set Ws = Wb.ActiveSheet

mFormula = "let " & _
    "Source = Csv.Document(File.Contents(""C:\Users\Loïc\Desktop\test\test.txt""),[Delimiter="";"",Encoding=65001,QuoteStyle=QuoteStyle.Csv])," & _
    "#""Step1"" = Table.SelectRows(Source,each Text.Contains([Column2],""E7"") and [Column3] = ""FF"")" & _
    "in #""Step1"""
    
Set query = Wb.Queries.Add("Test text",mFormula)

With Ws.ListObjects.Add(SourceType:=0,Source:= _
     "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & "Test text" & ";Extended Properties=""""",Destination:=Ws.Range("A1"),XlListObjectHasHeaders:=xlYes).QueryTable
     .CommandType = xlCmdSql
     .AdjustColumnWidth = False
     .ListObject.Name = "test"
     .CommandText = "SELECT * FROM [" & "Test text" & "]"
     .Refresh BackgroundQuery:=False
 End With
      
End Sub

您可能想要添加一些错误处理机制(以防文件已经打开等),并在不再需要时删除与文本文件的连接。

您将找到Microsoft的Power Query M公式语言here的文档。

使用VBA帮助您建立M公式的最后一个技巧:使用宏记录器!