Импорт текстового файла Loop при добавлении имени файла

Я новичок в 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

2 ответа

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

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

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

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

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

Чтобы изменить формат с широкого на длинный, просто измените 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.

Другие вопросы по тегам