2014-01-10 3 views
0

Я написал макрос VBA для импорта многих текстовых файлов (из 1 папки) на отдельные листы в 1 книге Excel. Все файлы читаются в каждом отдельном листе просто отлично. Однако я вижу проблему размещения на местах. Заголовки в каждом текстовом файле одинаковы. Но сами значения полей иногда подталкиваются несколькими полями. Таким образом, не все значения полей выстраиваются под соответствующие заголовки. Может ли кто-нибудь предложить мне, почему это происходит? Я пробовал посмотреть, есть ли табуляция с разделителями табуляции или проблема с ограничением по каналам, но это, похоже, не проблема.Импорт нескольких текстовых файлов в отдельные листы Excel в 1 книге Excel с использованием VBA

Sub MultipleTextFilesIntoExcelSheets() 
    Dim i As Integer 'a counter to loop through the files in the folder 
    Dim fname As String, FullName As String 'fname is the name of the file, and FullName is the name of its path 
    Dim ws As Worksheet 'a workbook object for the workbook where the current macro is running 

i = 0 'seed the counter 

'get the name of the first text file 
fname = Dir("C:\dummy_path\*txt") 

'loop through the text files to put them onto separate sheets in the Excel book 
While (Len(fname) > 0) 
    'get the full path of the text file 
    FullName = "C:\dummy_path\" & fname 
    i = i + 1 'get ready for the next iteration 

    Set ws = ThisWorkbook.Sheets("Sheet" & i) 'the current sheet 

    With ws.QueryTables.Add(Connection:="TEXT;" & FullName, Destination:=ws.Range("A1")) 
     .Name = "a" & i 
     .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 = True 'we are using a tab-delimited file 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = False 
     .TextFileSpaceDelimiter = False 
     .TextFileOtherDelimiter = False 
     .TextFileColumnDataTypes = Array(1, 1, 1) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
     fname = Dir 
    End With 
Wend 

End Sub

+0

VBA обрабатывает букву «f» в качестве разделителя табуляции. Кто-нибудь знает, почему и как это исправить? – user3100444

+0

Любая идея, почему я получаю ошибку «Subscript out of range» при запуске этого кода? Он импортирует первый файл txt в тот же лист, что и моя кнопка макроса, затем ошибка в этой строке 'Set ws = ThisWorkbook.Sheets (« Sheet »& i)' –

+0

Просто нашел этот код, который работает очень хорошо, и метки каждый лист с именем файла txt [label-sheets-while-importing-multiple-text-files-excel-vba] (http://stackoverflow.com/questions/17891733/label-sheets-while-importing-multiple-text- files-excel-vba) –

ответ

0

.ConsecutiveDelimiter = False Изменение к .ConsecutiveDelimiter = True

НЕКОТОРЫЕ ПОДРОБНОСТИ: Это, вероятно, происходит из-за того, что там может быть больше, чем одна вкладка разграничении «столбцы». Изменение этого параметра позволит принимать несколько вкладок в качестве одного.

+0

Выполнение этого действия дает такой же эффект, но в противоположном направлении. Некоторые из моих полей не обязательно заполняются в текстовых файлах. Таким образом, установив последовательный разделитель как True, он выталкивает значения полей, которые после этих пустых полей попадают в неправильные поля. Должно быть что-то еще, что мне нужно изменить. – user3100444

+0

У меня тоже была такая проблема, единственный способ понять, как решить эту проблему, - использовать другой инструмент разграничения, а именно разделитель фиксированной ширины. Это позволит вам «вырезать новый столбец» для каждого символа x, y, z и т. Д. –

+0

И даже тогда это может быть неправильное решение проблемы. Еще одно решение, которое приходит на ум, - это реализовать макрос исправления, который будет вставлять/удалять пустые пространства в соответствии с предопределенными правилами. –

1

«лечение F в качестве разделителей» Проблема в том, что в этой строке:

.TextFileOtherDelimiter = False 

Удаление она делает работу VBA, как и ожидалось. Значение по умолчанию для TextFileOtherDelimiter должно быть «null», а не False, я думаю.

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