Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 19496|回复: 9

[已解决]如何遍历子文件夹模糊查找文件夹名

[复制链接]
发表于 2013-4-18 12:55 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2013-4-19 12:33 编辑

比如我D盘有个"学习资料""的文件夹,"学习资料"文件夹里面有:VBA视频大全,VBA常用代码集合,EXCEL资料,WORD视频8_30集合等文件夹,我如何根据"VBA视频37集"的前五个字符查找到VBA视频大全这个文件夹名,再返回给一指定值,我好根据这个指定值打开这个文件的工作簿?
最佳答案
2013-4-18 14:34
FileSystemObject方法查找文件的代码:
利用递归算法搜寻子文件夹,找到含指定字符s的文件后打开。
  1. Dim s$, fNm$
  2. Sub FindFile()
  3.     s = InputBox("Input key word:", "Find Files") '输入关键词
  4.     If s = "" Then Exit Sub
  5.     pth = InputBox("Confirm FileFolder Path:", "Find Files", ThisWorkbook.Path) '输入指定文件夹
  6.     Call FindFileName(pth) '递归搜寻子文件夹
  7.     Workbooks.Open Filename:=fNm '打开搜寻到的文件

  8.     '这里写你自己的后续处理代码,或调用其它过程
  9.    '…………

  10. End Sub

  11. Sub FindFileName(pth) '递归搜寻代码
  12.     If fNm <> "" Then Exit Sub '找到后退出递归
  13.     Set fso = CreateObject("Scripting.FileSystemObject")
  14.     Set fld = fso.GetFolder(pth)
  15.     Set fsb = fld.SubFolders
  16.     For Each fd In fsb '遍历该文件夹的所有子文件夹
  17.         For Each f In fd.Files '遍历每个子文件夹中的所有文件
  18.             If InStr(f.Name, s) Then '用instr方法比对文件名称是否包含指定字符
  19.                 fNm = fd.Path & "" & f.Name
  20.                 Exit Sub '找到后退出递归
  21.             End If
  22.         Next
  23.         Call FindFileName(fd.Path) '本文件夹检查完毕后,继续深层搜素其子文件夹
  24.     Next
  25. End Sub
复制代码
代码试过了没有问题,但未作容错处理。(楼主根据需要自己添加代码吧)
比如,找到了含指定字符的文件,但不是Excel文件,
而是Word文件或其它格式的文件因而无法在Excel中打开。

…………
另外,找到第一个符合要求的文件后就退出了……
如果需要找到全部,那么所有Exit Sub语句就应该要注释掉……并做适当处理。

呵呵。
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-4-18 13:41 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-4-18 13:51 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-4-18 13:56 | 显示全部楼层
老班,看代码要密码呀
回复

使用道具 举报

发表于 2013-4-18 14:10 | 显示全部楼层
呵呵,楼主你说的好像过于复杂,兜圈子了吧。

整理一下楼主的目的:
在指定文件夹的未知子文件中,找到并打开含字符"VBA视频37集"的Excel文件。
回复

使用道具 举报

 楼主| 发表于 2013-4-18 14:16 | 显示全部楼层
不是五楼那个意思,比如说根据你的名字"""香川群子"找到"""香川的电话"这个文件夹,(是文件夹不是工作簿),请指教.
回复

使用道具 举报

发表于 2013-4-18 14:34 | 显示全部楼层    本楼为最佳答案   
FileSystemObject方法查找文件的代码:
利用递归算法搜寻子文件夹,找到含指定字符s的文件后打开。
  1. Dim s$, fNm$
  2. Sub FindFile()
  3.     s = InputBox("Input key word:", "Find Files") '输入关键词
  4.     If s = "" Then Exit Sub
  5.     pth = InputBox("Confirm FileFolder Path:", "Find Files", ThisWorkbook.Path) '输入指定文件夹
  6.     Call FindFileName(pth) '递归搜寻子文件夹
  7.     Workbooks.Open Filename:=fNm '打开搜寻到的文件

  8.     '这里写你自己的后续处理代码,或调用其它过程
  9.    '…………

  10. End Sub

  11. Sub FindFileName(pth) '递归搜寻代码
  12.     If fNm <> "" Then Exit Sub '找到后退出递归
  13.     Set fso = CreateObject("Scripting.FileSystemObject")
  14.     Set fld = fso.GetFolder(pth)
  15.     Set fsb = fld.SubFolders
  16.     For Each fd In fsb '遍历该文件夹的所有子文件夹
  17.         For Each f In fd.Files '遍历每个子文件夹中的所有文件
  18.             If InStr(f.Name, s) Then '用instr方法比对文件名称是否包含指定字符
  19.                 fNm = fd.Path & "" & f.Name
  20.                 Exit Sub '找到后退出递归
  21.             End If
  22.         Next
  23.         Call FindFileName(fd.Path) '本文件夹检查完毕后,继续深层搜素其子文件夹
  24.     Next
  25. End Sub
复制代码
代码试过了没有问题,但未作容错处理。(楼主根据需要自己添加代码吧)
比如,找到了含指定字符的文件,但不是Excel文件,
而是Word文件或其它格式的文件因而无法在Excel中打开。

…………
另外,找到第一个符合要求的文件后就退出了……
如果需要找到全部,那么所有Exit Sub语句就应该要注释掉……并做适当处理。

呵呵。

评分

参与人数 1 +30 金币 +30 收起 理由
爱疯 + 30 + 30 谢谢群子老师,学习了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-4-18 14:44 | 显示全部楼层
谢谢香川群子,我先用下试试
回复

使用道具 举报

发表于 2013-4-18 15:16 | 显示全部楼层
本帖最后由 香川群子 于 2013-4-18 15:19 编辑
hwc2ycy 发表于 2013-4-18 13:41
有许多工作薄,每个工作薄中 ...
http://www.excelpx.com/thread-299155-1-1.html


修改了你的Dir代码:
  1. Dim s$, fNm$, cnt&
  2. Sub test()
  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.     fNm = "": cnt = 0: tms = Timer
  7.     Call ListDirs(pth)
  8.     MsgBox Format(Timer - tms, "0.000s ") & cnt & vbCr & fNm
  9.     ' Workbooks.Open filename:=fNm


  10. End Sub
  11. Sub ListDirs(ByVal Path As String)
  12.     Dim i&, j&, arrPath(), sPath$, fName$
  13.     i = 1: j = 1

  14.     ReDim arrPath(1 To 1)
  15.     arrPath(i) = Path & ""

  16.     On Error Resume Next
  17.     sPath = arrPath(j)
  18.     Do While Len(sPath)
  19.         cnt = cnt + 1
  20.         fName = Dir(sPath & "*.*", vbDirectory + vbNormal)
  21.         Do While fName <> ""
  22.             If (fName = "." Or fName = "..") Then GoTo Nxt
  23.             If (GetAttr(sPath & "" & fName) And vbDirectory) = 16 Then
  24.                 If Err.Number Then Err.Clear: GoTo Nxt
  25.                 i = i + 1: ReDim Preserve arrPath(1 To i)
  26.                 arrPath(i) = sPath & fName & ""
  27.             Else
  28.                 If InStr(fName, s) Then fNm = sPath & fName: Exit Sub
  29.             End If
  30. Nxt:
  31.             fName = Dir
  32.             cnt = cnt + 1
  33.         Loop
  34.         j = j + 1: If j > i Then Exit Do
  35.         sPath = arrPath(j)
  36.     Loop

  37. End Sub
复制代码
代码稍显复杂,不过Dir的效率比较高,运算速度快。
回复

使用道具 举报

发表于 2015-4-27 17:44 | 显示全部楼层
香川群子 发表于 2013-4-18 15:16
修改了你的Dir代码:代码稍显复杂,不过Dir的效率比较高,运算速度快。

香川老师,如果有多个匹配的档案,能否全部显示出来,然后根据自己的需要选择双击打开?谢谢指教!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-9 03:30 , Processed in 0.214431 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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