【问题标题】:Can someone explain how a While Loop using the Dir function works in VBA?有人可以解释使用 Dir 函数的 While 循环如何在 VBA 中工作吗?
【发布时间】:2016-05-04 15:06:00
【问题描述】:

我对 VBA 还很陌生,需要编写一个工作脚本。该脚本将在目录中查找并将找到的任何 .txt 文件导入到工作簿中的新工作表中。 IE。如果有 20 个 .txt 文件,我最终会得到 20 个工作表。我在网上找到了一些代码可以完美地做到这一点,完全符合我的要求。问题是,我真的不明白它是如何工作的。我从来没有使用过 Dir 函数,看起来循环专注于这个,但我仍然对它是如何从一个文件循环到下一个文件感到困惑。如果有人可以帮助我理解或将 cmets 添加到代码中,那将非常有帮助。谢谢。

代码是:

    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

结束子

【问题讨论】:

  • 直接从来源口 MSDN Dir 阅读该主题怎么样。然后用关于该主题的大量其他文章来补充它! ...我也是VTC,因为这个题外话是为了找教程。最后,欢迎来到 SO。请阅读How to Ask 以获得更好的帮助。 :)
  • 我会先查看 DIR 函数,看起来你正在拾取文件,然后当文件什么都没有时,即 len=0 停止。 While = while this is true 这样做。
  • 如果你不懂 C,它对你没有帮助——但在某些方面,VBA 中的 Dir 总是让我想起 C 中的 strtok()——它们被用于以大致相似的方式循环。

标签: vba excel


【解决方案1】:

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

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

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

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

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

所以出现了“只要有文件”部分。这是用循环结构实现的

while *condition*  
    ... do things  
end while 

在这种情况下

While (Len(fname) > 0)
    '...
    fname=Dir
Wend

【讨论】:

  • 谢谢,这很有意义。带参数和不带参数的函数调用让我大吃一惊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2011-09-12
相关资源
最近更新 更多