我是VBA的新手,需要制作一个工作脚本。该脚本将查找目录并导入找到工作簿中新工作表的任何.txt文件。即如果有20个.txt文件,我最终会得到20个工作表。我在网上发现了一些完美的代码,完全符合我的要求。问题是,我真的不明白它是如何工作的。我从来没有使用过Dir函数,看起来循环集中于此,但我仍然对如何从一个文件循环到下一个文件感到困惑。如果有人可以帮助我理解,或者在代码中添加注释,那将非常有帮助。谢谢。
代码是:
Sub LoadFiles()
Dim idx As Integer
Dim fpath As String
Dim fname As String
Dim ws As Worksheet
idx = 0
fpath = "C:\MyFolderLocation"
fname = Dir(fpath)
While (Len(fname) > 0)
idx = idx + 1
Sheets.Add.Name = fname
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" _
& fpath & fname, Destination:=Range("A1"))
.Name = "a" & idx
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = ","
.TextFileColumnDataTypes = Array(1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
fname = Dir
End With
Wend
End Sub
答案 0 :(得分:5)
Dir函数返回一个目录中的文件名。
当您使用目录路径作为参数调用Dir()时,它将返回该目录中的第一个文件名。
当你在没有参数的情况下调用Dir()时,它将返回目录中的下一个文件名,直到没有更多文件为止,在这种情况下会返回空名称。
因此,为了处理目录中的所有文件,您需要一次Dir(路径),然后是Dir(),只要它返回一个名称。
如何测试是否返回姓名?
len(fname)>0
是一种方式,在这里他们使用
while *condition*
... do things
end while
其中len是另一个函数,它接受一个字符串作为参数并返回该字符串的长度。
所以“只要有文件”部分。这是通过循环结构实现的
While (Len(fname) > 0)
'...
fname=Dir
Wend
在这种情况下
{{1}}