ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请各位大神编写一个VBA程序 能在指定文件夹下包括子文件夹内查找包含关键字的文件谢谢

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-9 16:08 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请各位大神编写一个VBA程序 能在指定文件夹下包括子文件夹内查找包含关键字的文件谢谢

TA的精华主题

TA的得分主题

发表于 2024-3-9 16:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
everything

TA的精华主题

TA的得分主题

发表于 2024-3-9 18:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-9 19:01 | 显示全部楼层
这不是Explorer的事吗?打开所在目录,右上角搜索即可,

TA的精华主题

TA的得分主题

发表于 2024-3-9 19:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

发表于 2024-3-9 19:47 | 显示全部楼层
  1. Function ListAllDirDic(myPath$, Optional sb& = 0, Optional SpFile$ = "")
  2.     '利用Dir方法、以及用2个字典分别记录子文件夹路径和文件名的文件搜寻方法。
  3.     '第1参数【指定路径myPath】必选 为指定目标文件夹的绝对路径
  4.     '第2参数【子文件夹模式sb】为可选 =奇数时只搜寻当前文件夹、=偶数时搜寻所有子文件夹
  5.     '                                      该参数>=0时返回文件名、<0时返回文件夹路径名
  6.     '因此事实上第2参数可以设置这样四种模式:
  7.     '  默认=0时,搜寻所有子文件夹并返回所有文件名
  8.     '        =1时,搜寻当前文件夹并返回所有文件名 (不向下搜寻子文件夹)
  9.     '        =-1时,搜寻当前文件夹并返回子文件夹路径名
  10.     '        =-2时, 搜寻所有子文件夹并返回所有子文件夹路径名
  11.     '第3参数【文件名指定特殊匹配字符SpFile】 可选,返回文件名时用此关键词过滤一下
  12.     '默认留空时,返回全部文件名 (等于没有被过滤掉)
  13.     ' = 某个关键字时,返回符合匹配(即含该关键字)的部分文件名 (有过滤掉不含关键字的文件名)
  14.     ' = .xl 也可这样指定文件类型,返回匹配(该关键字指定文件类型)的部分文件名 (过滤掉其它类型文件名)
  15.     Dim i&, j&, myFile$
  16.     Set d1 = CreateObject("Scripting.Dictionary") '定义存放子文件夹路径的字典d1
  17.     Set d2 = CreateObject("Scripting.Dictionary") '定义存放文件名的字典d2
  18.     d1(myPath) = " '字典d1初始化记录目标文件夹路径名"
  19.     On Error Resume Next
  20.     Do While i < d1.Count
  21.         kr = d1.Keys  '从字典d1中更新提取所有子文件夹
  22.         myFile = Dir(kr(i), vbDirectory) '用Dir方法遍历该子文件夹得到文件或文件夹名 注意从kr(i)开始避免重复
  23.         Do While myFile <> "" 'Dir遍历直到返回空字符串 (即无未被遍历的文件或文件夹了)
  24.             If myFile <> "." And myFile <> ".." Then '如果是"."或".."属性则不用处理
  25.                 If (GetAttr(kr(i) & myFile) And vbDirectory) = vbDirectory Then '判断是文件夹属性时
  26.                     If Err.Number Then Err.Clear Else d1(kr(i) & myFile & "") = ""
  27.                     '#52 文件名Err时忽略(一般为操作系统语言文字环境问题),否则字典d1记录该子文件夹路径
  28.                 Else '如果不是文件夹则为文件
  29.                     If SpFile = "" Then '如未指定关键字
  30.                         j = j + 1: d2(j) = myFile '则所有文件名都作为Item项加入字典d2 (不能使用key防止重名文件)
  31.                     Else '否则指定了关键字
  32.                         If InStr(myFile, SpFile) Then j = j + 1: d2(j) = myFile
  33.                         '则判断含有指定关键字以后才可作为Item项加入字典d2 (不能使用key防止重名文件)
  34.                     End If
  35.                 End If
  36.             End If
  37.             myFile = Dir '用Dir方法继续搜寻下一个文件或子文件夹
  38.         Loop
  39.         If sb Mod 2 Then Exit Do Else i = i + 1
  40.         '如果第2参数指定为奇数则不用继续检查子文件夹就可退出,
  41.         '否则 i+1避免重复检查然后利用字典d1中的记录,继续检查下一个子文件夹直到全部子文件夹检查完毕
  42.     Loop
  43.     If sb >= 0 Or Len(SpFile) Then ListAllDirDic = d2.Items Else ListAllDirDic = d1.Keys
  44.     '如果第2参数>=0或第3参数有指定则返回d2的Items文件名、否则返回d1的keys子文件夹名
  45. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2024-3-9 20:28 | 显示全部楼层
查找包含关键字的文件名 有很多很好的软件呀  比如光速搜索 ,至于查找包含关键字 文件内容也有很多成熟的软件 没必要VBA

TA的精华主题

TA的得分主题

发表于 2024-3-9 20:37 | 显示全部楼层
上传一个附件,能很快解决。

TA的精华主题

TA的得分主题

发表于 2024-3-9 21:04 | 显示全部楼层
Sub Main()
  Dim i As Long, iCount As Long
  Dim strPath As String, objFso As Object, vrtFiles(1 To 2345) As String
  Set objFso = CreateObject("Scripting.FileSystemObject")
  strPath = ThisWorkbook.Path               '这里指定文件夹 如  C:\123\456\789\abc
  GetFiles strPath, objFso, vrtFiles, iCount, "$", "*关键字*.xls*"
  Set objFso = Nothing
  For i = 1 To iCount
    Debug.Print vrtFiles(i)
    '遍历符合的文件
  Next
End Sub

Function GetFiles(strPath As String, objFso As Object, vrtFiles() As String, iCount As Long, strExclude As String, Optional strFilter As String = ".xls")
  Dim objSubFolder As Object, objFilterFile As Object
  For Each objFilterFile In objFso.GetFolder(strPath).Files
    If objFilterFile.Name Like strFilter Then
      If InStr(objFilterFile.Name, strExclude) = 0 Then
        iCount = iCount + 1
        vrtFiles(iCount) = objFilterFile.Path
      End If
    End If
  Next
  For Each objSubFolder In objFso.GetFolder(strPath).SubFolders
    GetFiles objSubFolder.Path, objFso, vrtFiles, iCount, strExclude, strFilter
  Next
End Function

TA的精华主题

TA的得分主题

发表于 2024-3-9 21:14 | 显示全部楼层
everything我觉得还是最优选择,速度最快。。。

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-9-29 20:23 , Processed in 0.038327 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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