ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wpxxsyzx

[分享] 遍历所有子文件夹枚举指定类型文件或文件夹的函数

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-4-11 07:52 | 显示全部楼层
谢谢分享,可以参考一下。

TA的精华主题

TA的得分主题

发表于 2013-4-22 15:24 | 显示全部楼层
感谢楼主分享,目前工作正遇到类似情景呢

TA的精华主题

TA的得分主题

发表于 2013-4-22 16:56 | 显示全部楼层
有个小错误需要纠正一下:

第5行:If Left(MuLu, 1) <> "\" Then MuLu = MuLu & "\"

正确的应该是Right:

If Right(MuLu, 1) <> "\" Then MuLu = MuLu & "\"


作用是,如果路径最后一个字符不是目录符号"\"就添一个"\"上去。

TA的精华主题

TA的得分主题

发表于 2013-4-22 20:55 | 显示全部楼层
Eutopian 发表于 2011-11-25 21:49
前段時間我也試著做了個找文件夾的過程(只是單單列出磁盤上所有normal屬性的文件夾, 不考慮檢索文件), 希望 ...

你的想法写成代码了么?

…………
我前几天写了一个FSO的,是用递归处理的,效果很不错。

但是FSO方法,比Dir方法要慢。

呵呵。

TA的精华主题

TA的得分主题

发表于 2013-4-22 20:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
veggieg 发表于 2012-2-13 20:42
我水平低下~~看不懂啊~~

哪位好心人讲解下吗 ^^

是每一句都看不懂,还是某一句、某几句看不懂?


…………如果没一句看懂的,那就算了。等有了些基础再说吧。

TA的精华主题

TA的得分主题

发表于 2013-4-22 22:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 香川群子 于 2013-4-22 22:26 编辑
cg1 发表于 2011-11-22 12:43
原因是文件中只要包含 非 GB2312 字符就出错。


正解!

需要容错处理。

Public Function ListFile(MuLu As String, Zi As Boolean, Optional LeiXing As String = "")
    Dim MyFile As String, ms As String
    Dim arr, brr, x
    Dim i As Integer
    Set d = CreateObject("Scripting.Dictionary")
    If Right(MuLu, 1) <> "\" Then MuLu = MuLu & "\"
    d.Add MuLu, ""
    i = 0
   
    On Error Resume Next '这里增加错误时继续的处理代码
    Do While i < d.Count
        brr = d.keys
        MyFile = Dir(brr(i), vbDirectory)
        Do While MyFile <> ""
            If MyFile <> "." And MyFile <> ".." Then
                If (GetAttr(brr(i) & MyFile) And vbDirectory) = vbDirectory Then
                    If Err.Number Then '这里增加文件名字符错误处理判断
                        Err.Clear '#52 文件名错误

                    Else
                        d.Add (brr(i) & MyFile & "\"), ""
                    End If
                End If
            End If
            MyFile = Dir
        Loop
        If Zi = False Then Exit Do
        i = i + 1
    Loop
    If LeiXing = "" Then
        ListFile = Application.Transpose(d.keys)
    Else
        For Each x In d.keys
            MyFile = Dir(x & LeiXing)
            Do While MyFile <> ""
                ms = ms & x & MyFile & ","
                MyFile = Dir
            Loop
            If Zi = False Then Exit For
        Next
        If ms = "" Then ms = "没有符合要求的文件,"
        ListFile = Application.Transpose(Split(ms, ","))
    End If
End Function

TA的精华主题

TA的得分主题

发表于 2013-4-23 07:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习,谢谢分享

TA的精华主题

TA的得分主题

发表于 2013-4-25 20:56 | 显示全部楼层
香川群子 发表于 2013-4-22 20:55
你的想法写成代码了么?

…………

當時正在學習到FOS對象, 在論壇上看到這個帖子, 一時也想試試, 於是也寫了一段代碼. 最初也嘗試過用遞歸的方法, 不過還是個新手, 不會用, 而且在處理不斷新發現的子文件夾的問題上有點混亂, 後來想來想去, 才想了這麽一個方法. 在碰到C盤上的一些windows禁止訪問的系統文件夾時會出錯, 一直沒有辦法解決, 最後祇有避開C盤了, 見附件, 請多多指點!

Folder Scan.rar

10.3 KB, 下载次数: 60

TA的精华主题

TA的得分主题

发表于 2013-4-26 08:26 | 显示全部楼层
本帖最后由 香川群子 于 2013-4-26 08:47 编辑
Eutopian 发表于 2013-4-25 20:56
當時正在學習到FOS對象, 在論壇上看到這個帖子, 一時也想試試, 於是也寫了一段代碼. 最初也嘗試過用遞歸的 ...


递归其实很简单。比一般代码过程更简单。

请看下面例子:
用FSO方法遍历指定路径下所有文件夹,查找文件名中含某个字符的文件。
  1. Dim s$, fNm$ '定义公共变量:关键词s和文件名结果fNm

  2. Sub FindFile()
  3.     s = InputBox("Input key word:", "Find Files", s) '输入要查找的文件名中的关键词
  4.     If s = "" Then Exit Sub
  5.     pth = InputBox("Confirm FileFolder Path:", "Find Files", ThisWorkbook.Path) '输入路径
  6.    
  7.     fNm = "": tms = Timer '文件名结果fNm变量的初始化
  8.     Call FindFileName(pth) '调用递归过程
  9.     MsgBox Format(Timer - tms, "0.000s ")
  10. '    Workbooks.Open filename:=fNm '打开这个文件或做其它事
  11.    
  12. End Sub

  13. Sub FindFileName(pth)
  14.     If fNm <> "" Then Exit Sub '找到以后就结束递归过程(如果要找到全部则这一句注释掉)
  15.    
  16.     Set fso = CreateObject("Scripting.FileSystemObject") '设置fso对象
  17.     Set fld = fso.GetFolder(pth) '设置fso对象的父文件夹fld
  18.     Set fsb = fld.SubFolders '设置fso对象文件夹下的子文件夹fsb
  19.     For Each fd In fsb '遍历所有子文件夹
  20.         For Each f In fd.Files '遍历每个子文件夹中的所有文件
  21.             If InStr(f.Name, s) Then fNm = fd.Path & "" & f.Name: Exit Sub
  22.             '找到符合关键词的文件后退出(或者可以存入数组内然后继续查找所有符合的文件)
  23.         Next
  24.         Call FindFileName(fd.Path) '该子文件夹遍历结束时,继续递归进入该文件夹的子文件夹搜寻……
  25.     Next
  26. End Sub
复制代码
呵呵,特别简单吧。

TA的精华主题

TA的得分主题

发表于 2013-4-26 08:54 | 显示全部楼层
Eutopian 发表于 2013-4-25 20:56
當時正在學習到FOS對象, 在論壇上看到這個帖子, 一時也想試試, 於是也寫了一段代碼. 最初也嘗試過用遞歸的 ...

下面是搜寻并列出所有符合条件的文件的递归代码:
  1. Public flist$(65535, 3), fc&, fs&, k&, s$

  2. Sub FileList()
  3.    
  4.     s = InputBox("Please input File's Ext type:", "Find Files", "xl")
  5.     If s = "" Then Exit Sub Else s = LCase(s) & "*"
  6.     pth = InputBox("Confirm FileFolder Path:", "Find Files", ThisWorkbook.Path)
  7.    
  8.     k = 0: fc = 0: fs = 0: tms = Timer
  9.     Set fso = CreateObject("Scripting.FileSystemObject")
  10.     Set fld = fso.GetFolder(pth)
  11.     t = 0
  12.     For Each f In fld.Files
  13.         n = InStrRev(f.Name, ".")
  14.         If n Then
  15.             x = LCase(Mid(f.Name, n + 1))
  16.             If x Like s Then
  17.                 t = 1
  18.                 flist(k, 0) = x
  19.                 flist(k, 1) = f.Name
  20.                 flist(k, 2) = fld.Name
  21.                 flist(k, 3) = fld.Path
  22.                 k = k + 1
  23.             End If
  24.         End If
  25.     Next
  26.     If t Then fs = fs + 1
  27.     fc = fc + 1
  28.     Call GetFolderFile(pth)
  29.    
  30.     [a1].CurrentRegion.Offset(1) = ""
  31.     If k Then [a2].Resize(k, 4) = flist
  32.     [b1] = "Check " & fc & " SubFolders Get " & k & " Files from " & fs & " Folders."
  33.     MsgBox Format(Timer - tms, "0.000s")
  34.    
  35. End Sub

  36. Function GetFolderFile(pth)
  37.     Set fso = CreateObject("Scripting.FileSystemObject")
  38.     Set fld = fso.GetFolder(pth)
  39.     Set fsb = fld.SubFolders
  40.     For Each fd In fsb
  41.         t = 0
  42.         For Each f In fd.Files
  43.             n = InStrRev(f.Name, ".")
  44.             If n Then
  45.                 x = LCase(Mid(f.Name, n + 1))
  46.                 If x Like s Then
  47.                     t = 1
  48.                     flist(k, 0) = x
  49.                     flist(k, 1) = f.Name
  50.                     flist(k, 2) = fd.Name
  51.                     flist(k, 3) = fd.Path
  52.                     k = k + 1
  53.                 End If
  54.             End If
  55.         Next
  56.         If t Then fs = fs + 1
  57.         fc = fc + 1: Call GetFolderFile(fd.Path)
  58.     Next
  59. End Function
复制代码
递归的做法其实是一样的。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 09:20 , Processed in 0.045229 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表