2016-06-07 73 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