添加文件名时导入文本文件循环

时间:2015-09-16 15:04:58

标签: excel vba excel-vba filenames

我是Excel VBA的新手并遇到了一些问题。我正在创建一个宏,它将获取.dat文件(像.txt文件一样导入)并将文件名放在第一行,然后将第二行中的所有数据放在第二行。然后程序循环并再次启动该过程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 个答案:

答案 0 :(得分:0)

这将获得Row1中最后一个被占用的单元格的列号(如果行上没有任何内容,则为第一个单元格)

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

如果您开始在该位置填充内容,您将(除空行外)覆盖该单元格中的内容。

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

为您提供该行的第一个单元格(从右侧开始)。但这并不能解释导入文件中的内容,该文件有多列。如果导入的文件有3列,则需要进一步偏移...

答案 1 :(得分: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文件导入。