我是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
答案 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文件导入。