使用VBA循环遍历文件夹中的文件?

使用VBA循环遍历文件夹中的文件?

我想使用以下方法循环遍历目录的文件VBA在Excel 2010中。

在循环中,我需要

  • 文件名
  • 格式化文件的日期。

我已经编写了以下代码,如果文件夹中没有超过50个文件,它可以正常工作,否则速度会慢得可笑(我需要它处理超过10000个文件的文件夹)。此代码的唯一问题是要查找的操作file.name需要非常长的时间。

工作但速度太慢的代码(每100个文件15秒):

Sub LoopThroughFiles()
   Dim MyObj As Object, MySource As Object, file As Variant
   Set MySource = MyObj.GetFolder("c:\testfolder\")
   For Each file In MySource.Files      If InStr(file.name, "test") > 0 Then
         MsgBox "found"
         Exit Sub
      End If
   Next fileEnd Sub

解决问题:

  1. 下面的解决方案已经解决了我的问题

    Dir

    以一种特定的方式(对于15000个文件使用20秒)和使用命令检查时间戳

    FileDateTime.

  2. 考虑到另一个答案,从下面的20秒减少到不到1秒。


潇湘沐
浏览 3562回答 4
4回答

天涯尽头无女友

Dir使用外卡,这样您就可以在添加过滤器的情况下做出很大的改变。test预先准备并避免对每个文件进行测试Sub LoopThroughFiles()     Dim StrFile As String     StrFile = Dir("c:\testfolder\*test*")     Do While Len(StrFile) > 0         Debug.Print StrFile         StrFile = Dir    LoopEnd Sub

湖上湖

迪尔看起来非常快。Sub&nbsp;LoopThroughFiles() &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;MyObj&nbsp;As&nbsp;Object,&nbsp;MySource&nbsp;As&nbsp;Object,&nbsp;file&nbsp;As&nbsp;Variant &nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;Dir("c:\testfolder\") &nbsp;&nbsp;&nbsp;While&nbsp;(file&nbsp;<>&nbsp;"") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;InStr(file,&nbsp;"test")&nbsp;>&nbsp;0&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox&nbsp;"found&nbsp;"&nbsp;&&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit&nbsp;Sub &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;Dir&nbsp;&nbsp;WendEnd&nbsp;Sub

慕容708150

Dir函数是可行的,但是问题是您不能使用Dir函数递归,如所述在这里,朝向底部.我处理这个问题的方法是使用Dir函数获取目标文件夹的所有子文件夹,并将它们加载到数组中,然后将数组传递给递归的函数。这是我写的一个类,它包括搜索过滤器的能力。(你必须原谅匈牙利的符号,这是在它风靡一时的时候写的。)Private&nbsp;m_asFilters()&nbsp;As&nbsp;StringPrivate&nbsp;m_asFiles&nbsp;As&nbsp;VariantPrivate&nbsp;m_lNext&nbsp;As&nbsp;LongPrivate&nbsp;m_lMax&nbsp;As&nbsp;LongPublic&nbsp;Function&nbsp; GetFileList(ByVal&nbsp;ParentDir&nbsp;As&nbsp;String,&nbsp;Optional&nbsp;ByVal&nbsp;sSearch&nbsp;As&nbsp;String,&nbsp;Optional&nbsp;ByVal&nbsp;Deep&nbsp;As&nbsp;Boolean&nbsp;=&nbsp;True)&nbsp;As&nbsp;Variant &nbsp;&nbsp;&nbsp;&nbsp;m_lNext&nbsp;=&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;m_lMax&nbsp;=&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;m_asFiles(0) &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Len(sSearch)&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_asFilters()&nbsp;=&nbsp;Split(sSearch,&nbsp;"|") &nbsp;&nbsp;&nbsp;&nbsp;Else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;m_asFilters(0) &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Deep&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;RecursiveAddFiles(ParentDir) &nbsp;&nbsp;&nbsp;&nbsp;Else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;AddFiles(ParentDir) &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;m_lNext&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;Preserve&nbsp;m_asFiles(m_lNext&nbsp;-&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetFileList&nbsp;=&nbsp;m_asFiles&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;IfEnd&nbsp;FunctionPrivate&nbsp;Sub&nbsp;RecursiveAddFiles(ByVal&nbsp;ParentDir&nbsp;As&nbsp;String) &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;asDirs()&nbsp;As&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;l&nbsp;As&nbsp;Long &nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;Error&nbsp;GoTo&nbsp;ErrRecursiveAddFiles&nbsp;&nbsp;&nbsp;&nbsp;'Add&nbsp;the&nbsp;files&nbsp;in&nbsp;'this'&nbsp;directory! &nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;AddFiles(ParentDir) &nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;asDirs(-1&nbsp;To&nbsp;-1) &nbsp;&nbsp;&nbsp;&nbsp;asDirs&nbsp;=&nbsp;GetDirList(ParentDir) &nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;l&nbsp;=&nbsp;0&nbsp;To&nbsp;UBound(asDirs) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;RecursiveAddFiles(asDirs(l)) &nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;l&nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;Error&nbsp;GoTo&nbsp;0Exit&nbsp;SubErrRecursiveAddFiles:End&nbsp;SubPrivate&nbsp;Function&nbsp;GetDirList(ByVal&nbsp;ParentDir&nbsp;As&nbsp;String)&nbsp;As&nbsp;String() &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;sDir&nbsp;As&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;asRet()&nbsp;As&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;l&nbsp;As&nbsp;Long &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;lMax&nbsp;As&nbsp;Long &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Right(ParentDir,&nbsp;1)&nbsp;<>&nbsp;"\"&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParentDir&nbsp;=&nbsp;ParentDir&nbsp;&&nbsp;"\" &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;sDir&nbsp;=&nbsp;Dir(ParentDir,&nbsp;vbDirectory&nbsp;Or&nbsp;vbHidden&nbsp;Or&nbsp;vbSystem) &nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;While&nbsp;Len(sDir) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;GetAttr(ParentDir&nbsp;&&nbsp;sDir)&nbsp;And&nbsp;vbDirectory&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Not&nbsp;(sDir&nbsp;=&nbsp;"."&nbsp;Or&nbsp;sDir&nbsp;=&nbsp;"..")&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;l&nbsp;>=&nbsp;lMax&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lMax&nbsp;=&nbsp;lMax&nbsp;+&nbsp;10 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;Preserve&nbsp;asRet(lMax) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asRet(l)&nbsp;=&nbsp;ParentDir&nbsp;&&nbsp;sDir &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;l&nbsp;+&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sDir&nbsp;=&nbsp;Dir&nbsp;&nbsp;&nbsp;&nbsp;Loop &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;l&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;Preserve&nbsp;asRet(l&nbsp;-&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetDirList&nbsp;=&nbsp;asRet() &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;IfEnd&nbsp;FunctionPrivate&nbsp;Sub&nbsp;AddFiles(ByVal&nbsp;ParentDir&nbsp;As&nbsp;String) &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;sFile&nbsp;As&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;l&nbsp;As&nbsp;Long &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Right(ParentDir,&nbsp;1)&nbsp;<>&nbsp;"\"&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParentDir&nbsp;=&nbsp;ParentDir&nbsp;&&nbsp;"\" &nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;l&nbsp;=&nbsp;0&nbsp;To&nbsp;UBound(m_asFilters) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sFile&nbsp;=&nbsp;Dir(ParentDir&nbsp;&&nbsp;"\"&nbsp;&&nbsp;m_asFilters(l),&nbsp;vbArchive&nbsp;Or&nbsp;vbHidden&nbsp;Or&nbsp;vbNormal&nbsp;Or&nbsp;vbReadOnly&nbsp;Or&nbsp;vbSystem) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;While&nbsp;Len(sFile) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Not&nbsp;(sFile&nbsp;=&nbsp;"."&nbsp;Or&nbsp;sFile&nbsp;=&nbsp;"..")&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;m_lNext&nbsp;>=&nbsp;m_lMax&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_lMax&nbsp;=&nbsp;m_lMax&nbsp;+&nbsp;100 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;Preserve&nbsp;m_asFiles(m_lMax) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_asFiles(m_lNext)&nbsp;=&nbsp;ParentDir&nbsp;&&nbsp;sFile &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_lNext&nbsp;=&nbsp;m_lNext&nbsp;+&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sFile&nbsp;=&nbsp;Dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop &nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;lEnd&nbsp;Sub
打开App,查看更多内容
随时随地看视频慕课网APP