有人可以解释使用Dir函数的While循环在VBA中如何工作吗?

1 excel vba excel-vba

我是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
Run Code Online (Sandbox Code Playgroud)

结束子

小智 5

Dir函数一次返回一个目录中的文件名。

当您使用目录路径作为参数调用Dir()时,它将返回该目录的第一个文件名。

当您不带参数调用Dir()时,它将返回目录中的下一个文件名,直到没有更多文件为止,在这种情况下,将返回空名称。

因此,为了处理目录中的所有文件,您只需要一次Dir(path),然后再加上Dir(),只要它返回一个名称即可。

您如何测试是否返回名称?
fname>""
这是一种方法,在这里他们使用
len(fname)>0
len是另一个函数,该函数将字符串作为参数并返回该字符串的长度。

因此出现了“只要有文件”部分。通过循环结构实现

while *condition*  
    ... do things  
end while 
Run Code Online (Sandbox Code Playgroud)

在这种情况下

While (Len(fname) > 0)
    '...
    fname=Dir
Wend
Run Code Online (Sandbox Code Playgroud)