2017-01-19 5 views
0

текстовый файл со следующим содержимым:Текстовые строки файла Заголовки столбцов в Excel

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

userID=10102 
givenname=Jan 
orclmaidenname=Klaassen 

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

И так далее.

Как преобразовать этот файл txt в рабочий лист excel, где заголовки строк из текстового файла будут заголовками столбцов, а строки из листа excel заполнены соответствующими значениями из текстового файла?

В файле txt содержится более 1000 элементов, но не все элементы имеют одинаковые заголовки строк (например, некоторые из них не имеют «почты»).

Это то, что у меня есть до сих пор. Он правильно нажимает «uid», «givenname», «orclmaidenname». Однако добавление «почты» приводит к неожиданному результату. Я думаю, потому что не все элементы содержат строку заголовка «почта».

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 

Любое понимание?

+0

Каков был этот «неожиданный результат»? –

+0

В основном, он смешивал всю таблицу вверх. Столбцы содержали значения из разных строк, которые не соответствовали оригиналу. – Grote

+0

Действительно ли это работает? Похоже, что он просто выбирает ячейку с 'orclmaidenname =', а затем заполняет ваш другой рабочий лист части своей стоимости. –

ответ

0

Извините, это не соответствует вашему коду, но я никогда не читал текстовые файлы с помощью VBA, поэтому я немного учился здесь. Этот код читает файл test.txt, который я скопировал из предоставленного вами текста. Пока заполняются первые три поля, вы не должны сталкиваться с ошибками, но недостающее поле mail не представляет проблемы. Код работает, беря что-нибудь после = для каждой строки после первой строки и перемещаясь в новую строку после пустой строки.

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

Спасибо! Кажется, он работает. Единственное, если элемент отсутствует в txt-файле, например «mail =», следующее значение отображается в столбце «mail». Любые мысли, как это исправить? – Grote

+0

@Grote. Вы можете изменить 'if-statements', чтобы сделать что-то вроде: Если все, что осталось от' = 'в переменной' txt', это 'userID', затем' colID = 1', а затем переместиться так. –

Смежные вопросы