【发布时间】:2015-09-16 15:04:57
【问题描述】:
我是 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
【问题讨论】:
-
您需要在
LastCol中添加一些内容,否则您将继续覆盖之前的值... -
似乎也使用
End(xlToLeft).Columns而不是End(xlUp).Rows,您打算并排对齐文本文件数据,而不是彼此堆叠。通常,数据和报告以长而不宽的格式处理。见Bruin's note here。 -
@Tim-Williams,你能解释更多吗?您是否建议一个无意义的增量,因为 LastCol 将与数据导入保持一致。
-
@Parfait,我尝试用 End(xlUp).Rows 替换,但它似乎没有编译。