2016-08-03 16 views
0

Ich habe mehrere TXT-Dateien in einem Ordner, die Tabulator-getrennt sind. Jede dieser Dateien hat eine Spalte namens EngagementId, die unabhängig von der Anzahl der Datensätze den gleichen Wert hat. Es ändert sich jedoch für jede TXT-Datei, die ich erfassen möchte.Lese nur einen Datensatz von mehreren Textdateien in Excel mit VBA

  1. Ich versuche, den Dateinamen in der ersten Zeile zu erhalten. Die GetFileNames() funktioniert für die (wie in den Kommentaren darauf hingewiesen)

Sub GetFileNames() 
    Dim sPath As String 
    Dim sFile As String 
    Dim iRow As Integer 
    Dim iCol As Integer 
    Dim splitFile As Variant 

    'specify directory to use - must end in "\" 
    sPath = ActiveWorkbook.Path 
    iRow = 0 
    sFile = Dir(sPath & "\Individual Reports\") 
    Do While sFile <> "" 
     iRow = iRow + 1 
     splitFile = Split(sFile, ".txt") 
     For iCol = 0 To UBound(splitFile) 
      Sheet1.Cells(iRow, iCol + 1) = splitFile(iCol) 
     Next iCol 
     sFile = Dir  ' Get next filename 
    Loop 
End Sub 

eine Spalte Jede dieser txt-Dateien haben (die in jedem der Textdateien in der 13. Position ist), "EngagementId" genannt. Ich möchte nur die erste "Engagement Id" ziehen, die aus der 2. Zeile stammt (da die erste Zeile Header enthält).

Sub Extractrec() 
    Dim filename As String, nextrow As Long, MyFolder As String 
    Dim MyFile As String, text As String, textline As String 

    MyFolder = ActiveWorkbook.Path 
    MyFile = Dir(MyFolder & "\Individual Reports\*.txt") 

    Do While MyFile <> "" 
     Open (MyFolder & MyFile) For Input As #1 
     Do Until EOF(1) 
      Line Input #1, LineFromFile 
      LineItems = Split(LineFromFile, "\t") 'second loop text is already stored 
                '-> see reset text 
      Sheet1.Cells(iRow, iCol + 2).Value = LineItems(13, 2) 
     Loop 
     Close #1 

    Loop 
+1

Was ist das Problem? Ich bin nicht sicher, dass "\ t" in vba funktioniert, ich würde vbtab constant verwenden. – Jules

+0

Was zeigen Sie uns - haben Sie Code, der nicht so funktioniert, wie Sie es wollen - was spuckt er jetzt aus - und wie sollte sich das ändern? Beispieldaten helfen - sind diese zwei separaten Funktionen, die von woanders aufgerufen werden? – dbmitch

+1

'Sheet1.Cells (iRow, iCol + 2) .Value = LineItems (13, 2)' wird ein Index außerhalb des Bereichsfehler sein - 'Split' gibt ein eindimensionales Array zurück. – Comintern

Antwort

0

Da Sie nur die zweite Zeile jeder Datei benötigen, brauchen Sie nicht zu Schleife, lesen Sie die erste Zeile lesen und verwirft nur dann und spalteten die zweiten:

Open (MyFolder & MyFile) For Input As #1 'MyFolder & MyFile won't be the correct name (probably should be MyFolder & "\Individual Reports\" & MyFile) 
    Line Input #1, LineFromFile 'line to discard 
    Line Input #1, LineFromFile 'line to use 
    LineItems = Split(LineFromFile, vbTab) 
    Sheet1.Cells(someplace).Value = LineItems(13) ' replace some place with the correct value that we don't know 
    Close #1 
+0

Vielen Dank Vincent. Es funktioniert, aber gibt es eine Möglichkeit, den Prozess zu beschleunigen? Es hängt jedes Mal, wenn ich versuche, das Skript auszuführen. – Sharath

1

Die Verwendung eines ADODB.Recordset zur Abfrage wäre vielseitiger.


Sub Example() 
    On Error Resume Next 
    Dim rs As Object, f As Object, conn As Object 
    Dim FolderPath As String, FileName As String, FilterString As String 
    FolderPath = "C:\Users\best buy\Downloads\stackoverfow\Sample Data File\" 
    FileName = "example.csv" 
    FilterString = "WHERE EngagementId = 20" 

    Set rs = getDataset(FolderPath, FileName, FilterString) 

    Do While Not rs.BOF And Not rs.EOF 
     Debug.Print rs.Fields("EngagementId") 
     Debug.Print rs.Fields("Company") 
     Debug.Print rs.Fields("City") 
     Debug.Print rs.Fields("State") 

     rs.MoveNext 
    Loop 

    Set conn = rs.ActiveConnection 
    rs.Close 
    conn.Close 
    Set rs = Nothing 
    Set conn = Nothing 
End Sub 

Function getDataset(FolderPath As String, FileName As String, FilterString As String) As Object 
    Dim conn As Object, rs As Object 
    Set conn = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 
    conn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FolderPath & ";" & _ 
      "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""") 
    rs.ActiveConnection = conn 
    rs.Source = "SELECT * FROM " & FileName & " " & FilterString 
    rs.Open 
    Set getDataset = rs 
End Function 
+0

Danke Thomas. Aber ich glaube nicht, dass dies meine Frage beantwortet. Ich bin ein Anfänger in der VBA-Codierung. Alles, was ich versuche, ist, durch mehrere Textdateien in einem Ordner zu gehen und den Namen der Datei und einen Datensatz "EngagementId" aus Zeile 2 oder irgendeiner Zeile herauszuziehen, da alle Werte für EngagmentId für eine Textdatei gehen gleich sein. Ich habe ungefähr 13 Spalten in meiner Textdatei. – Sharath