2017-01-19 5 views
0

Eine Textdatei mit folgendem Inhalt:Textdatei Zeilenüberschriften zu Spalten in Excel

userId=10101 
givenname=Mark 
orclmaidenname=Visser 
[email protected] 

userID=10102 
givenname=Jan 
orclmaidenname=Klaassen 

userID=10104 
givenname=Jessica 
orclmaidenname=Host 
[email protected] 

Und so weiter.

Wie konvertiere ich diese TXT-Datei in ein Excel-Arbeitsblatt, wo die Zeilenüberschriften aus der Textdatei Spaltenüberschriften sind und die Zeilen aus der Excel-Tabelle mit den entsprechenden Werten aus der Textdatei gefüllt werden?

Die TXT-Datei hat mehr als 1000 Elemente, aber nicht alle Elemente haben die gleichen Zeilenüberschriften (zum Beispiel einige haben keine "Mail").

Das ist was ich bisher habe. Es zieht "uid", "givenname", "orclmaidenname" korrekt. Das Hinzufügen von "Mail" führt jedoch zu einem unerwarteten Ergebnis. Ich denke, weil nicht alle Artikel die Zeilenüberschrift "mail" enthalten.

Sub Frank() 

    Application.ScreenUpdating = False 

' Name current file 
    MyMacroFile = ActiveWorkbook.Name 
' Prompt for file 
    MyFile = Application.GetOpenFilename("All Files,*.*") 
    If MyFile = False Then 
     Exit Sub 
    End If 

' Open file 
    Workbooks.OpenText Filename:=MyFile, Origin:=xlWindows, StartRow:=1, _ 
     DataType:=xlFixedWidth, FieldInfo:=Array(0, 2) 
' Name text file 
    MyTextFile = ActiveWorkbook.Name 

' Find cell with "uid", "givenname", "orclmaidenname" 
    Do 
     Windows(MyTextFile).Activate 
'  Exit loop if can't find any matches 
     On Error GoTo Err_Fix 
      Cells.Find(What:="uid=", After:=ActiveCell, LookIn _ 
     :=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:= _ 
     xlNext, MatchCase:=False).Activate 
      Cells.Find(What:="givenname=", After:=ActiveCell, LookIn _ 
     :=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:= _ 
     xlNext, MatchCase:=False).Activate 
      Cells.Find(What:="orclmaidenname=", After:=ActiveCell, LookIn _ 
     :=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:= _ 
     xlNext, MatchCase:=False).Activate 
     On Error GoTo 0 
' Exit loop if starting search over form top 
     If ActiveCell.Row <= MyRow Then 
      Exit Do 
     End If 
' Get specific characters of selected rows 
     MyValue = Right(ActiveCell.Value, 6) 
     MyValue2 = Right(ActiveCell.Value, Len(ActiveCell.Value) - 10) 
     MyValue3 = Right(ActiveCell.Value, Len(ActiveCell.Value) - 15) 
     MyRow = ActiveCell.Row 
' Paste value in spreadsheet with macro in columns A, B and C 
     Windows(MyMacroFile).Activate 
     Range("A65536").End(xlUp).Offset(1, 0) = MyValue 
     Range("B65536").End(xlUp).Offset(1, 0) = MyValue2 
     Range("C65536").End(xlUp).Offset(1, 0) = MyValue3 
    Loop 

Err_Fix: 
    Windows(MyTextFile).Activate 
    ActiveWorkbook.Close 
    Application.ScreenUpdating = True 
    Exit Sub 

End Sub 

Irgendein Einblick?

+0

Was war dieses "unerwartete Ergebnis"? –

+0

Im Grunde hat es die ganze Tabelle gemischt. Spalten enthielten Werte aus verschiedenen Zeilen, die nicht mit dem Original übereinstimmten. – Grote

+0

Funktioniert das wirklich in Ordnung? Es scheint, als ob es nur eine Zelle mit 'orclmaidenname =' auswählt und dann Ihr anderes Arbeitsblatt mit Teilen seines Wertes füllt. –

Antwort

0

Entschuldigung, das stimmt nicht mit Ihrem Code überein, aber ich habe noch nie Textdateien mit VBA gelesen, also habe ich mich hier selbst unterrichtet. Dieser Code liest die Datei test.txt, die ich aus dem von Ihnen bereitgestellten Text kopiert habe. Solange die ersten drei Felder ausgefüllt sind, sollten Sie keine Fehler finden, aber ein fehlendes mail Feld ist kein Problem. Der Code funktioniert, indem nach der für jede Zeile nach der ersten Zeile und nach der Leerzeile in eine neue Zeile verschoben wird.

Option Explicit 

Sub test() 
    Dim fname As String 
    Dim txt As String 
    Dim rowID As Long 
    Dim colID As Long 
    Dim pos As Integer 

    fname = "H:\test.txt" 
    Open fname For Input As #1 

    rowID = 1 
    colID = 1 

    Do Until EOF(1) 
     Line Input #1, txt 
     If rowID = 1 And txt <> "" Then 
      pos = InStr(1, txt, "=") 
      Cells(rowID, colID).Value = Left(txt, pos - 1) 'Populate the field names 
      Cells(rowID + 1, colID).Value = Right(txt, Len(txt) - pos) 'Populate the second row (first row of data) 
      colID = colID + 1 
     ElseIf txt = "" Then 
      If rowID = 1 Then rowID = rowID + 1 'Increase the rowID by 1 since we have already populated the first row of data. 
      colID = 1  'Set the colID back to 1 for the new row 
      rowID = rowID + 1 'Move to a new row 
     Else 
      pos = InStr(1, txt, "=") 
      Cells(rowID, colID).Value = Right(txt, Len(txt) - pos) 'Print out everything after the "=" to the cell 
      colID = colID + 1 'Move to new column 
     End If 
    Loop 

    Close #1 

End Sub 
+0

Vielen Dank! Es scheint zu funktionieren. Nur wenn ein Element in der TXT-Datei fehlt, zum Beispiel "mail =", wird der nächste Wert in der Spalte "mail" angezeigt. Irgendwelche Gedanken, wie man das repariert? – Grote

+0

@Grote Sie könnten die 'if-Anweisungen' ändern, um etwas zu tun: Wenn alles, was von '' 'in der 'txt'-Variable übrig ist,' userID 'ist, dann' colID = 1' und dann weitermachen. –

Verwandte Themen