2015-09-16 3 views
0

Я новичок в Excel VBA и имею некоторые проблемы. Я создаю макрос, который возьмет файл .dat (импорт, такой как .txt-файл) и помещает имя файла в первую строку, а затем все данные под ним, начиная с строки 2. Затем программа завершает цикл и снова запускает процесс 3 строк (данные имеют много строк, но всего 3 столбца).Импорт текстового файла при добавлении имени файла

В настоящее время мой макрос корректно поместит импортированные данные, но имя файла неправильно закодировано. Он будет вводить имя файла в A1, петли вводят имя файла в D3, одновременно удаляя имя файла из A1. Я не могу понять, что происходит не так.

Sub ImportDataFiles() 
'call out variables 
Dim fName As String, LastCol As Long, fileName As String, fso As Object 

'loop start 
BEGINNING: 
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column 
fName = Application.GetOpenFilename("All Files, *.dat") 
Set fso = CreateObject("Scripting.FileSystemObject") 
fileName = fso.GetFilename(fName) 
'fileName is just the file name from the path 
Range(Cells(1, LastCol).Address).Value = fileName 
If fName = "False" Then Exit Sub 
     'Imports data from text file 
     With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fName, _ 
      Destination:=Cells(2, LastCol)) 
       .TextFileStartRow = 30 
       .TextFileParseType = xlDelimited 
       .TextFileConsecutiveDelimiter = True 
       .TextFileTabDelimiter = False 
       .TextFileSemicolonDelimiter = True 
       .TextFileCommaDelimiter = False 
       .TextFileSpaceDelimiter = False 
       .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, _ 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _ 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _ 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
       .Refresh BackgroundQuery:=False 
       'loop end 
       If MsgBox("Do you want to do it again?", vbYesNo) = vbYes Then GoTo BEGINNING 
    End With 
End Sub 
+0

Вам нужно добавить что-то в 'LastCol', иначе вы собираетесь перезаписывать предыдущие значения ... –

+0

Также кажется, что используется' End (xlToLeft) .Columns' вместо 'End (xlUp) .Rows', вы собираетесь выравнивать данные текстового файла бок о бок, а не складывать друг над другом. Обычно данные и отчеты обрабатываются в длинных нешироких форматах. См. Примечание Бруина здесь (http://www.rondebruin.nl/win/s9/win005.htm). – Parfait

+0

@ Тим-Уильямс, не могли бы вы объяснить больше? Вы предлагаете бессмысленное приращение, потому что LastCol будет выравниваться с импортом данных. – IrishThunder23

ответ

0

Это будет получить номер столбца последнего занимали ячейку в Row1 (или первую ячейку, если нет ничего на строке)

LastCol = Cells(1, Columns.Count).End(xlToLeft).Column 

Если начать заполнение контента на этой позиции вы (за исключением случая пустой строки) перезаписать содержимое в этой ячейке.

LastCol = Cells(1, Columns.Count).End(xlToLeft).Column + 1 

Дает первый пустую ячейку [справа] на этой строке. Но это не учитывает содержимое импортированного файла, имеющего несколько столбцов. Если ваш импортированный файл имеет 3 столбца, вам необходимо дополнительно отложить ...

0

Чтобы изменить формат от широкого до длинного, просто измените LastCol на LastRow с изменениями в следующие четыре строки кода.

Dim ... LastRow As Long, ... 

LastRow = Cells(Rows.Count, 1).End(xlUp).Row 
... 
Range(Cells(LastRow + 1, 1).Address).Value = fileName 
... 
    Destination:=Cells(LastRow + 2, 1)) 

Это также устраняет вашу переписку с FileName и позволяет продолжить работу с последующим импортом файла .dat.

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