曼城足球论坛技术论坛

找回密码
收费注册

QQ登录

只需一步,快速开始

EH搜刮
足球 Home精品图文教程库
足球 2016函数公式学习大典 制造核心竞争力的职场宝典
曼城足球论坛出品 - VBA代码宝收费下载
你的足球 2010实战技巧学习锦囊 足球 VBA经典代码履行指南
观察: 91469 | 回复: 339
打印 上一主题 下一主题

[分享] 跟我学 【喜迎2015立春】遍历文件夹(含子文件夹)格式 ABC

[复制链接]

TA的精华主题

TA的得分主题

跳转到指定楼层
1
揭晓于 2015-2-4 08:53 | 只看该作者 | 只看大图 回帖奖励 | 倒序浏览 | 阅读形式
本帖已被收录到知识树中,索引项: 文件操作和FSO
本帖末了由 香川群子 于 2015-2-5 09:37 编辑

遍历文件夹内全数文件、
遍历文件夹内全数指定类型的文件、
遍历文件夹内全数指定称号的文件、

遍历文件夹内全数子文件夹、

遍历文件夹以及全数子文件夹内全数文件、
遍历文件夹以及全数子文件夹内全数指定类型的文件、
遍历文件夹以及全数子文件夹内全数指定称号的文件、

…………
下面的要求,是一个永恒的话题。
尤其是新手VBA初学者。

…………
EH论坛中搜刮一下。
也早已有热心的高手。

做法基本上有2大类:
① 经典Dir
② FSO
即 Scripting.FileSystemObject 的【文件体系对象】脚本格式。

一开始可能Dir格式较为普遍,但随着程度的进步。

我会在本帖详细介绍这二种格式、并且是适合初学者的、按部就班的格式。,足球论坛哪个火。
以便行家迅速掌握。

末了。

由于有这个特征,我的这个【遍历子文件夹格式】的帖子,所以我觉得只身开帖是有必要的。
补充:由于Application.FileSearch格式仅能用于2003版,足球论坛哪个火。以后的版本不再能运用此格式。



代码介绍完毕,初步总结一下:
① Dos Dir 格式最快,但是只能提取全部文件、文件夹名后输入到作事表。足球论坛哪个火。
② VBA Dir 格式较量容易学习、理解。(简单的Do 循环即可) 但中央需要占定划分文档和文件夹。007足球论坛
③ FSO格式 是分析性能最好的。 其实掌握基本概念以后格外好用。 递归、字典、数组 三个格式的代码。


对本帖有任何题目或要求。




评分

参与人数 65 财富 +180 鲜花 +128 技术 +2 收起 理由
积少成多 + 2 太壮大了
anabas + 2 太壮大了
qsj2278 + 2 优秀作品
liyanghu + 2
chr + 2 优秀作品

观察全部评分

TA的精华主题

TA的得分主题

2
楼主 | 揭晓于 2015-2-4 09:14 | 只看该作者
首先要介绍,在VBA代码运行以后。

① 微软足球 VBA 默许选择文件夹的Dialog对话框
  1. Sub ListFilesTest()
  2. With Application.FileDialog(msoFileDialogFolderPicker) '运行后出现圭臬的选择文件夹对话框
  3. If .Show Then myPath = .SelectedItems(1) Else Exit Sub '如选中则前往=-1 / 铲除未选则前往=0
  4. End With
  5. If Right(myPath, 1) <> "" Then myPath = myPath & ""
  6. '前往的是选中标的目的文件夹的绝对途径,但除了当地C盘、D盘会以"C:"形式前往外,此外途径无""需要自身增加
  7. End Sub
复制代码
② 视窗浏览器界面选择标的目的文件夹
  1. Sub ListFilesTest()
  2. Set myFolder = CreateObject("Shell.Application").BrowseForFolder(0, "GetFolder", 0)
  3. If Not myFolder Is Nothing Then myPath$ = myFolder.Items.Item.Path Else MsgBox "Folder not Selected": Exit Sub
  4. If Right(myPath, 1) <> "" Then myPath = myPath & ""
  5. '异样前往的是选中标的目的文件夹的绝对途径,但除了当地C盘、D盘会以"C:"形式前往外,此外途径无""需要增加

  6. End Sub
复制代码
…………
这两种选择标的目的文件夹的格式。
格式-1 默许Dialog对话框左侧栏有桌面、我的文档等快捷方式。,足球交流吧。
优点是。
差池是,借使有多层子文件夹。

与此相对、格式-2 是浏览器形式。
因此也有很多人特别可爱这一种的。


…………
因此,这两种格式你可爱哪一种都可以。

呵呵。这是本帖第一宝。

评分

参与人数 6 鲜花 +12 收起 理由
vivid_ck + 2 优秀作品
ghinc + 2 优秀作品
pengs14 + 2 优秀作品
hcy1185 + 2 我可爱!运行代码弹出选择盘符或文件夹的窗.
shanchuan + 2 优秀作品

观察全部评分

TA的精华主题

TA的得分主题

3
揭晓于 2015-2-4 09:22 | 只看该作者
香川群子 揭晓于 2015-2-4 09:14
首先要介绍,在VBA代码运行以后,调用【标的目的文件夹】的格式:

① 微软足球 VBA 默许选择文件夹的Dialog ...

香川老师的作品都是精品。固然不懂VBA,先保藏了。

TA的精华主题

TA的得分主题

4
楼主 | 揭晓于 2015-2-4 09:32 | 只看该作者
接上去。

由简到繁地介绍:

一、仅列出标的目的文件夹中全数文件。(不包括 子文件夹、不包括子文件夹中的文件),007足球论坛。
  1. Sub ListFilesTest()
  2. With Application.FileDialog(msoFileDialogFolderPicker)
  3. If .Show Then myPath$ = .SelectedItems(1) Else Exit Sub
  4. End With
  5. If Right(myPath, 1) <> "" Then myPath = myPath & ""
  6. '以上选择标的目的文件夹以获得途径myPath

  7. MsgBox ListFiles(myPath) '调用FSO的ListFiles过程前往标的目的文件夹下的全数文件名

  8. End Sub

  9. Function ListFiles(myPath$)
  10. Set fso = CreateObject("Scripting.FileSystemObject") '掀开FSO脚本、建立FSO对象实例
  11. For Each f In fso.GetFolder(myPath).Files '用FSO格式遍历指定文件夹内全数文件
  12. i = i + 1: s = s & vbCr & f.Name '逐一列出文件名并统计文件个数 i
  13. Next
  14. ListFiles = i & " Files:" & s '前往全数文件名的合并字符串
  15. End Function
复制代码
本代码只是一个简单的示例,行家理解以后。
实行对指定标的目的文件夹内全数文件的遍历。

…………怎么样?特别容易、特别简单吧?

知识介绍:
Set fso = CreateObject("Scripting.FileSystemObject"),足球交流论坛。
建立FSO 即【文件体系对象】的实例。

这以后。

For Each f In fso.GetFolder(myPath).Files
'用FSO格式遍历指定文件夹内全数文件

fso.GetFolder(myPath) 是指对付途径myPath。球迷007足球论坛。
然后,对付这个指定的标的目的文件夹。
完好的部门为: fso.GetFolder(myPath).Files

然后。
经过议定For……Each循环就可以遍历其中每一个文件了。

具体地,For Each f In 中的f变量。
循环中。

评分

参与人数 3 鲜花 +7 收起 理由
aoe1981 + 3 优秀作品
Pan嗯嗯 + 2 太壮大了
autumnalRain + 2 优秀作品

观察全部评分

TA的精华主题

TA的得分主题

5
楼主 | 揭晓于 2015-2-4 09:38 | 只看该作者
二、仅列出标的目的文件夹中全数子文件夹名。(不包括标的目的文件夹中文件、不包括子文件夹中的文件或子文件夹),最火的足彩论坛。
  1. Sub ListFilesTest()
  2. With Application.FileDialog(msoFileDialogFolderPicker)
  3. If .Show Then myPath$ = .SelectedItems(1) Else Exit Sub
  4. End With
  5. If Right(myPath, 1) <> "" Then myPath = myPath & ""

  6. MsgBox ListFolders(myPath)

  7. End Sub
  8. Function ListFolders(myPath$)
  9. Set fso = CreateObject("Scripting.FileSystemObject")
  10. For Each f In fso.GetFolder(myPath).SubFolders
  11. j = j + 1: t = t & vbCr & f.Name
  12. Next
  13. ListFolders = j & " Folders:" & t
  14. End Function
复制代码
和楼上的代码ListFiles相比,分歧很小。
fso.GetFolder(myPath).Files
fso.GetFolder(myPath).SubFolders

即。
有.Files 全数文件、改为 .足球跟我学【喜迎2015足球论坛哪个火立春】遍历文件夹(含子文件夹)格式ABC。SubFolders 全数子文件夹


呵呵。是不是特别简单那?

TA的精华主题

TA的得分主题

6
楼主 | 揭晓于 2015-2-4 09:51 | 只看该作者
本帖末了由 香川群子 于 2015-2-4 09:52 编辑

下面很快进入正题:

三、遍历标的目的文件夹内全数文件、以及全数子文件夹中的全数文件。

以下代码仅为示例,可以用。
但是可以在此基础上修改为各种可能。
  1. Sub ListFilesTest()
  2. With Application.FileDialog(msoFileDialogFolderPicker)
  3. If .Show Then myPath$ = .SelectedItems(1) Else Exit Sub
  4. End With
  5. If Right(myPath, 1) <> "" Then myPath = myPath & ""

  6. [a:a] = "" '清空A列
  7. Call ListAllFso(myPath) '调用FSO遍历子文件夹的递归过程

  8. End Sub

  9. Function ListAllFso(myPath$) '用FSO格式遍历并列出全数文件和文件夹名的【递归过程】
  10. Set fld = CreateObject("Scripting.FileSystemObject").GetFolder(myPath)
  11. '用FSO格式获得现时途径的文件夹对象实例 注意这里的【现时途径myPath是个递归变量】

  12. For Each f In fld.Files '遍历现时文件夹内全数【文件.Files】
  13. [a].End(3).Offset(1) = f.Name '在A列逐一列出文件名
  14. Next

  15. For Each fd In fld.SubFolders '遍历现时文件夹内全数【子文件夹.SubFolders】
  16. [a].End(3).Offset(1) = " " & fd.Name & "" '在A列逐一列出子文件夹名
  17. Call ListAllFso(fd.Path) '注意此时的途径变量已经改换为【子文件夹的途径fd.Path】
  18. '注意重点在这里: 继续向下调用递归过程【遍历子文件夹内全数文件文件夹对象】
  19. Next
  20. End Function
复制代码
其实、递归是个让代码更简单的好工具、好算法。
因为它可以把相同的过程的代码一再引用而无需重复写进去。……建议不熟识熟练递归的开始研究一下递归算法。足球VBA步骤启示。


TA的精华主题

TA的得分主题

7
揭晓于 2015-2-4 10:10 | 只看该作者
保藏,学习,谢谢

TA的精华主题

TA的得分主题

8
楼主 | 揭晓于 2015-2-4 10:10 | 只看该作者
本帖末了由 香川群子 于 2015-2-5 09:42 编辑

由于很多初学者不太能理解递归算法的过程而发作畏难、冲撞激情,
所以下面避开递归,而采用字典记录中央结果的格式。
  1. Sub ListFilesTest()
  2. With Application.FileDialog(msoFileDialogFolderPicker)
  3. If .Show Then myPath$ = .SelectedItems(1) Else Exit Sub
  4. End With
  5. If Right(myPath, 1) <> "" Then myPath = myPath & ""

  6. MsgBox "List Files:" & vbCr & Join(ListAllFsoDic(myPath), vbCr)
  7. MsgBox "List SubFolders:" & vbCr & Join(ListAllFsoDic(myPath, 1), vbCr)
  8. End Sub

  9. Function ListAllFsoDic(myPath$, Optional k = 0) '运用2个字典但无需递归的遍历过程
  10. Dim i&, j&
  11. Set d1 = CreateObject("Scripting.Dictionary") '字典d1记录子文件夹的绝对途径名
  12. Set d2 = CreateObject("Scripting.Dictionary") '字典d2记录文件名 (文件夹和文件分隔收拾)

  13. d1(myPath) = "" '以现时途径myPath作为起始记录,以便开始循环检查

  14. Set fso = CreateObject("Scripting.FileSystemObject")
  15. Do While i < d1.Count
  16. '当字典1文件夹中有未遍历收拾的key生计时进行Do循环 直到 i=d1.Count即全数子文件夹都已收拾时截至

  17. kr = d1.Keys '取出文件夹中全数的key即全数子文件夹途径 (注意每次都要更新)
  18. For Each f In fso.GetFolder(kr(i)).Files '遍历该子文件夹中全数文件 (注意仅重新的kr(i) 开始)
  19. j = j + 1: d2(j) = f.Name
  20. '把该子文件夹内的全数文件名作为字典Item项加入字典d2 (为防止文件重名不能用key属性)
  21. Next

  22. i = i + 1 '已经收拾过的子文件夹数目 i +1 (防止下次发作重复收拾)
  23. For Each fd In fso.GetFolder(kr(i - 1)).SubFolders '遍历该文件夹中全数新的子文件夹
  24. d1(fd.Path) = " " & fd.Name & ""
  25. '把新的子文件夹途径取出字典d1以便在下一轮循环中收拾
  26. Next
  27. Loop

  28. If k Then ListAllFsoDic = d1.Keys Else ListAllFsoDic = d2.Items
  29. '借使参数=1则列出字典d1中全数子文件夹的途径名 (如运用d1.Items则仅列出子文件夹称号不含途径)
  30. '借使参数=0则默许列出字典d2中Items即全数文件名

  31. End Function
复制代码
FSO格式到此暂且告一段落(以后我会再贴出较为适用的代码)

请行家缓慢消化接收,可以自身轻易修改。

评分

参与人数 2 鲜花 +5 收起 理由
比尔04 + 2 太壮大了
kuangben8 + 3 太壮大了

观察全部评分

TA的精华主题

TA的得分主题

9
揭晓于 2015-2-4 10:37 | 只看该作者

保藏,学习,谢谢

TA的精华主题

TA的得分主题

10
揭晓于 2015-2-4 10:58 | 只看该作者
很好的帖子,但是建议老师写个附件。呵呵!

点评

我的代码是通用的,给你的代码你复制一下就能用在轻易文件里了。 揭晓于 2015-2-4 13:16
您需要登录后才可以回帖 登录 | 收费注册

本版积分规则

封闭

最新热点上一条 /2 下一条

关切官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|曼城足球论坛

GMT+8, 2020-9-1 02:04, Processed in 0.0 second(s),曼城足球论坛技术论坛。 11 queries , Gzip On, MemCache On.

Powered by X3.4

? 1999-2020 Wooffice Inc.

本论坛言论纯属揭晓者小我意见,任何违犯国家相关法律的言论。

快速回复 前往顶部 前往列表