2016-06-07 77 views
0

我正在使用ADO查询文本文件以将数据导入Excel。ADO文本文件查询 - 通过逗号分隔的结果

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=" & filePath & ";" & _ 
     "Extended Properties='text';" 

rs.Open "SELECT * FROM " & fileName, cn 

wsImport.Range("A1").CopyFromRecordset rs 

我正面临的问题是查询结果被拆分,用逗号作为分隔符。这意味着当我将数据写入工作表时,它会跨越多个列输出。

我已经确认它在查询阶段被拆分,而不是在将数据写入工作表阶段。当我希望在创建的记录集的第一个字段(允许将数据写入工作表的A列)中访问所有数据时,我必须使用rs.Fields(0)rs.Fields(1)访问某些数据行。

任何人都可以澄清我如何查询文本文件,而不是任何分隔符分裂数据?

我也试过在扩展属性中使用下面的内容。

Extended Properties='text;HDR=Yes;FMT=Delimited'; 

Extended Properties='text;HDR=Yes;FMT=FixedLength'; 
+0

你需要创建一个schema.ini文件,但我真的不能明白为什么你会使用ADO的一切都在这里,而不仅仅是阅读的文本文件转换成一个变量,分裂成一个数组在每个换行符,然后将数组放入工作表中。 – Rory

+0

感谢您的输入@Rory。如果你能提供一个如何工作的例子,很高兴考虑你的建议?我一直以这种方式处理文本文件,假设它是从文本文件和Excel中获取数据的最快方法。 –

回答

2

这里是阅读的文本文件一个简单的例子:

Sub foo(filePath As String) 
    Dim sDataIn      As String 
    Dim sDataTemp()     As String 
    Dim sDataOut()     As String 
    Dim n       As Long 

    Open filePath For Binary As #1 
    sDataIn = Space$(LOF(1)) 
    Get #1, , sDataIn 
    Close #1 
    sDataTemp() = Split(sDataIn, vbNewLine) 
    ReDim sDataOut(1 To UBound(sDataTemp) + 1, 1 To 1) 
    For n = LBound(sDataTemp) To UBound(sDataTemp) 
     sDataOut(n + 1, 1) = sDataTemp(n) 
    Next n 
    ActiveSheet.Range("A1").Resize(UBound(sDataOut), 1) = sDataOut 
End Sub 
+0

这真棒 - 这看起来像一个更简洁的方式处理文本文件。谢谢!你如何将'DataIn'变量设置为空格(文本文件的长度相同),而不是直接将文本文件数据分配给变量? –

+0

在二进制模式下,读取的字节数等于已经在变量中的字符数。 – Rory

+0

有道理 - 谢谢解释,非常感谢。祝你有美好的一天。 –

0

如果您打开宏录制,让它记录你做所有的步骤之一时间要导入一个文件,你应该有你的答案。

我只是试过了,得到了这个。

Sub Macro1() 
' 
' Macro1 Macro 
' 
' Keyboard Shortcut: Ctrl+s 
' 
    With ActiveSheet.QueryTables.Add(Connection:= _ 
     "TEXT;C:\Users\your_path_here\test.txt", Destination:=Range("$A$1")) 
     .CommandType = 0 
     .Name = "test" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 437 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = False 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = False 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(1) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
    End With 
End Sub