2016-06-15 3 views
2

У меня есть код, который конвертирует файлы в папку из .txt (с разделителем «|») в xslx, Но код отлично работает для некоторых файлов (когда я открываю его в excel) другие ошибаются, когда я пытаюсь импортировать ручку вручную вручную с помощью ленты excel (Получить внешние данные -> из текста), файлы верны.VBA Преобразование текстового файла разделителя в Excel

Это мой код:

Sub tgr() 

    Const txtFldrPath As String = "C:\...\txtFiles"  
    Const xlsFldrPath As String = "C:\excelFiles"  

    Dim CurrentFile As String: CurrentFile = Dir(txtFldrPath & "\" & "*.txt") 
    Dim strLine() As String 
    Dim LineIndex As Long 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 
    While CurrentFile <> vbNullString 
     LineIndex = 0 
     Close #1 
     Open txtFldrPath & "\" & CurrentFile For Input As #1 
     While Not EOF(1) 
      LineIndex = LineIndex + 1 
      ReDim Preserve strLine(1 To LineIndex) 
      Line Input #1, strLine(LineIndex) 
     Wend 
     Close #1 

     With ActiveSheet.Range("A1").Resize(LineIndex, 1) 
      .Value = WorksheetFunction.Transpose(strLine) 
      .TextToColumns Other:=True, OtherChar:="|" 
     End With 

     ActiveSheet.UsedRange.EntireColumn.AutoFit 
     ActiveSheet.Copy 
     ActiveWorkbook.SaveAs xlsFldrPath & "\" & Replace(CurrentFile, ".txt", ".xlsx"), xlOpenXMLWorkbook 
     ActiveWorkbook.Close False 
     ActiveSheet.UsedRange.ClearContents 

     CurrentFile = Dir 
    Wend 
    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 
End Sub 

enter image description here эта картина показывает результат в Excel и исходный файл .txt

+1

И ошибка -doesn't открыть файл? Не ограничивает это? Размер лимита не совпадает? Синтаксис кажется мне правильным. – Sgdva

+0

@ Срдва, я добавляю картинку. – BKChedlia

+0

Являются ли «неправильные» файлы из другого источника? –

ответ

2

Прежде всего, у вас плохие данные. Существует знак табуляции между Всего обязательств и 30,619,676.00 в AI060616.txt. Excel не любит вкладки в содержимое ячейки. На самом деле, символ табуляции является разделителем по умолчанию по команде TextToColumns и это выливается в два столбца данных, когда массив занесена в.

Open txtFldrPath & "\" & CurrentFile For Input As #1 
    While Not EOF(1) 
     LineIndex = LineIndex + 1 
     ReDim Preserve strLine(1 To LineIndex) 
     Line Input #1, strLine(LineIndex) 
     'STRIP TABS OUT AND REPLACE WITH A SPACE!!!!! 
     strLine(LineIndex) = Replace(strLine(LineIndex), Chr(9), Chr(32)) 
    Wend 
    Close #1 

Далее Range.TextToColumns method «помнит» все настройки, которые были использованы в последний раз, когда он проходил; неважно, было ли это пользователем на hte-листе или через VBA. Вам нужно гораздо больше параметров, чем вы поставили, чтобы гарантировать, что он будет работать так, как вы хотите.

With ActiveSheet.Range("A1").Resize(LineIndex, 1) 
     .Value = WorksheetFunction.Transpose(strLine) 
     'DEFINE THE OPERATION FULLY!!!! 
     .TextToColumns Destination:=.Cells(1), DataType:=xlDelimited, _ 
         TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _ 
         Tab:=False, Semicolon:=False, Comma:=False, Space:=False, _ 
         Other:=True, OtherChar:="|" 
    End With 

import_TXT

+0

Спасибо @Jeeped, он решил мою проблему ... – BKChedlia

+0

@BKChedlia не забудьте проверить зеленый знак, чтобы принять ответ! – Sgdva

1

Хотя я не понимаю решение/проблемы пока, кажется, что это решается, если применить метод .TextToColumns дважды:

With ActiveSheet.Range("A1").Resize(LineIndex, 1) 
    .Value = WorksheetFunction.Transpose(strLine) 
    .TextToColumns Other:=True, OtherChar:="|" 
    .TextToColumns Other:=True, OtherChar:="|" 
End With 

может быть кто-то может прояснить, почему это , Хотя это не та должность, которую я обычно предоставляю, приведенное выше должно дать вам обходной путь, в то время как кто-то другой придумает лучшее решение (включая объяснение).

+0

Это не проблема, проблема в том, что «сырые» данные имеют 2 столбца, excel не может разграничить, когда исходные данные имеют 2 столбца. – Sgdva

+0

Даже решение является обходным, данные скомпрометированы, вероятно, лучшим решением было бы исправить «необработанные» данные, поэтому разграничение может работать исправно. – Sgdva

1

Файл AI150616 имеет в графе «B» данные 30,619,676.00 Net worth = ZAR 83,456,466.00 Hence, final required BG should be (63,503,915.82)
enter image description here Ограничитель работает только с одной колонкой. Должно ли это быть допустимым? Если нет, может потребоваться другая процедура, чтобы проверить правильность данных, если да, добавьте ее, иначе предупредите, что пользовательские данные были каким-то образом скомпрометированы.

+1

Проблема с файлом ... Клиент отправляет данные в БД, и мы извлекаем данные в .txt, я не видел, что в данных есть некоторая вкладка, а извлечение производится по трубам ... в любом случае, решение выше решило проблему. спасибо всем – BKChedlia

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