ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 循环遍历文件夹--文件搜索(宏)实用版 v1

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-8-18 00:56 | 显示全部楼层 |阅读模式
本帖最后由 413191246se 于 2015-8-18 13:38 编辑

* 原因:Word2003本身的《文件搜索》功能不能查找到文件!WIN7系统也无法找到关键词文件,网络上搜索软件试用好几个也无法查找到文件,偶然看到一个网页谈到 .TextOrProperty属性可以查找正文关键词来返回文件,验证OK!看来只能靠 VBA 了!(其实以前也知道这条语句,但没重视。)
* 功能:在指定文件夹中,通过按《文件名关键词》/《正文关键词》/《文件名关键词 + 正文关键词》三个模式搜索 Word 文档(*.doc)。
* 当找到的文件数少于 22 个时,自动打开所有找到的文件(大家可以自行修改这个值);否则,询问是否打开。自动提取文件名到空白文档中。
* 注意事项:在运行此宏期间,请耐心等待,不要做各种键盘和鼠标运行,以免程序中途停止。如果不想等待,可以按 Ctrl + PauseBreak 中止程序。
*《循环遍历文件夹_文件搜索》宏(实用版)v1代码:
  1. Sub 循环遍历文件夹_文件搜索()
  2.     On Error Resume Next
  3.     Dim fd As FileDialog, i As Long, doc As Document, p As String, j As String, k As Long, q As String, r As String, s As String, t As String, a As String
  4.     Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  5.     If fd.Show = -1 Then p = fd.SelectedItems(1) Else Exit Sub
  6.     Set fd = Nothing
  7.     If MsgBox("是否搜索文件夹 " & p & " ?", vbYesNo + vbExclamation, "循环遍历文件夹_文件搜索") = vbNo Then Exit Sub
  8.     j = MsgBox("是:<文件名关键词>    否:<正文关键词>    取消:<文件名关键词+正文关键词>", vbYesNoCancel + vbExclamation, "请选择文件搜索模式!")
  9.     If j = vbYes Then
  10.         k = 1: q = "<文件名关键词>": r = "任职"
  11.     ElseIf j = vbNo Then
  12.         k = 2: q = "<正文关键词>": r = "秦楚楚"
  13.     Else
  14.         k = 3: q = "<文件名关键词+正文关键词>": r = "任职,秦楚楚"
  15.     End If
  16. reipt:
  17.     a = InputBox("如果同时输入<文件名关键词>+<正文关键词>,必须以中文逗号分隔!如:“任职,秦楚楚”", "请输入" & q & "搜索文件!", r)
  18.     If a = "" Then Exit Sub
  19.     If k = 1 Then
  20.         If a Like "*,*" Then GoTo reipt
  21.         s = a
  22.     ElseIf k = 2 Then
  23.         If a Like "*,*" Then GoTo reipt
  24.         t = a
  25.     ElseIf k = 3 Then
  26.         If Not (a Like "*,*") Then GoTo reipt
  27.         s = Left(a, InStr(a, ",") - 1): t = Mid(a, InStr(a, ",") + 1)
  28.     End If
  29.     Set doc = Documents.Add
  30.     With Application.FileSearch
  31.         .NewSearch
  32.         .LookIn = p
  33.         .SearchSubFolders = True
  34.         If k = 1 Then
  35.             .FileName = "*" & s & "*.doc"
  36.         ElseIf k = 2 Then
  37.             .FileName = "*.doc"
  38.             .TextOrProperty = t
  39.         ElseIf k = 3 Then
  40.             .FileName = "*" & s & "*.doc"
  41.             .TextOrProperty = t
  42.         End If
  43.         If .Execute > 0 Then
  44.             For i = 1 To .FoundFiles.Count
  45.                 doc.Content.InsertAfter Text:=.FoundFiles(i) & vbCr
  46.             Next i
  47.             If .FoundFiles.Count >= 22 Then If MsgBox("搜索完毕!共发现 " & .FoundFiles.Count & " 个文件!——是否打开搜索的文件?", vbYesNo + vbExclamation, "循环遍历文件夹_文件搜索") = vbNo Then End
  48.             For i = 1 To .FoundFiles.Count
  49.                 Documents.Open FileName:=.FoundFiles(i)
  50.             Next i
  51.             MsgBox "搜索完毕!共发现 " & .FoundFiles.Count & " 个文件!", vbOKOnly + vbExclamation, "循环遍历文件夹_文件搜索"
  52.         Else
  53.             MsgBox "未发现文件!", vbOKOnly + vbCritical, "循环遍历文件夹_文件搜索"
  54.         End If
  55.     End With
  56. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-18 06:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 413191246se 于 2015-8-18 07:01 编辑

* 补充说明:大家看第8/9 两句代码!
*
  •        .FileName = "*任职*.doc"
  •         .TextOrProperty = "秦楚楚"
.FileName=这句,在指定文件夹内,可以搜索[文件名包含关键词“任职”]的 Word 文件;
.TextOrProperty=这句,在指定文件夹内,可以搜索[文件正文包含关键词“秦楚楚”]的 Word 文件(当不记得文件名是什么的时候,此句代码太有用了!)
而且更好的是:搜索文件是不用打开文件的,与转换文件不同。
* 单独通过搜索[文件名包含的关键词]找到文件,或单独通过搜索[文件正文包含的关键词]找到文件均可,但也可以同时搜索[文件名包含的关键词+正文包含的关键词]找到文件。——找到文件后,一个是把所有找到的文件名列表在空白文档中(未保存,如需保存请自行保存),另一个是打开所有找到的文件。

Sub test()
'查找文件夹中包含关键字的 Word 文档!------成功!!!

'本示例可实现的功能为:返回所有在文件正文或文件属性中包含单词“run”、“running”、“runs”或“ran”的文件。

'TextOrProperty 属性设置需匹配的单词,并将查找范围限制在文件正文或文件属性中。

'MatchTextExactly 属性--'如果仅查找这样的文件,其文件正文中或文件属性中包括指定单词或短语的完全匹配形式,则返回True。Boolean类型,可读写。

'Execute 方法--'开始对指定文件的搜索。返回一个Long类型,如果没有找到文件,则返回零(0),如果找到一个或多个文件,则返回一个正数。

'LookIn 属性--返回或设置在指定的文件搜索过程中要搜索的文件夹。String类型,可读写。

'FoundFiles 属性--返回一个FoundFiles对象,该对象包括一次查找操作中找到的所有文件的文件名。

    Dim i As Long, doc As Document
    Set doc = Documents.Add
   

    With Application.FileSearch
        .NewSearch
'        .LookIn = "C:\My Documents"
        .LookIn = "C:\My Work Documents\"

        .SearchSubFolders = True
        .FileName = "*任职*.doc"
'        .TextOrProperty = "run*"
'        .TextOrProperty = ""

'        .MatchTextExactly = True
'        .MatchAllWordForms = True
        .FileType = msoFileTypeAllFiles
        If .Execute > 0 Then
'            Set doc = Documents.Open(FileName:=.FoundFiles(i))
            MsgBox "There were " & .FoundFiles.Count & " file(s) found."
'            For i = 1 To .FoundFiles.Count
'                MsgBox .FoundFiles(i)'逐个显示查找到的文件名
'            Next i

            For i = 1 To .FoundFiles.Count
                doc.Content.InsertAfter Text:=.FoundFiles(i) & vbCr '提取文件名(到空白文档中)
                Documents.Open FileName:=.FoundFiles(i) '打开查找到的文件
            Next i

        Else
            MsgBox "There were no files found."
        End If
    End With

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-18 07:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-8-18 12:02 | 显示全部楼层

FileSearch 功能只能在2003以下版本使用。

按目前的现状、80%以上的用户已经是2007以上版本,楼主代码无法使用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-18 13:48 | 显示全部楼层
本帖最后由 413191246se 于 2015-8-18 13:52 编辑

    谢谢 香川群子 朋友关注!
    据说,VBA 搜索文件可以有四种方法呢!在 2007 版以上可以用其它方法达到目的,我单位现在还是 XP/Office2003,所以我也就随大流了,2007也略有所知,曾经安装过,但还是与大家所用软件保持一致才好。
    其实也是没办法的事,前面帖子说了,工作中有时是要查找文件的,但用别的办法找不到,现在用 VBA 看来是找得到的,算是解决了问题。我编程水平不高,但能达到目的即可,效率/算法什么的倒还是其次。
    ——前几天,跟论坛高人 loquat 兄学会了 InStr()函数的用法,现在喜欢用它,还要应用到《第一章/条》宏上。   
    ——我发现:此宏并不需要打开文档,只在后台内存中运行,这个和文档转换/打印/合并完全不同。有时不记得文件名了,只记得文件中有某个关键词,这样,用此宏就好了。

TA的精华主题

TA的得分主题

发表于 2015-8-19 08:11 来自手机 | 显示全部楼层
效率的话,应该dir比较高一些  最快的事直接调用㎝d

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-19 13:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢 loquat!但关键是不会,目前只会此方法一种,而且管用。

TA的精华主题

TA的得分主题

发表于 2015-8-20 16:25 | 显示全部楼层
师傅好!
我把你这个宏代码粘贴到代码窗口内,这一行代码变为了红色 a = InputBox("如果同时输入<文件名关键词>+<正文关键词>,必须以中文逗号分隔!如:“任职,秦楚楚”", "请输入" & q & "搜索文件!", r)

再比如我只记得在一个文件夹中,有一篇文档的正文内有:“花狗” 2个字,其它的都不记得,在下面的3行代码中分别怎样填?才可以找到这个文件?

k = 1: q = "<文件名关键词>": r = "任职"
    ElseIf j = vbNo Then
        k = 2: q = "<正文关键词>": r = "秦楚楚"
    Else
        k = 3: q = "<文件名关键词+正文关键词>": r = "任职,秦楚楚"
    End If
reipt:

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-20 18:18 | 显示全部楼层
本帖最后由 413191246se 于 2015-8-20 18:22 编辑

    139:粘贴不正确!不填!
    须知,任何过程都是以"Sub XXXX......End Sub"为标志的一段小程序,在这两行代码中间的为真正的程序代码,知道这个原则就好了,你试试重新粘贴。
    另外,第二个问题,我的代码已经设置好了,不须用户在代码中修改,只须粘贴在另一个过程的 End Sub 行的后面即可。——你只要把第一个问题解决,第二个问题会迎刃而解。
    ***你的”把文字排成自左往右的纵向例文",我试试,看能否用宏实现,你暂时先不要安装下载2010版本,因为那个版本很大,并且安装后,一般2003就不保了。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-21 09:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
139:”把文字排成自左往右的纵向例文"我用宏试了,看着像从左往右,但后续排版不被支持,所以,你师傅真的需要这种竖排从左往右排版的文字吗?默认的从右向左不行吗?如果非要这种效果,我看来是爱莫能助啊!但我不建议你安装2010版本。(另外这种竖排文字看着也费劲,哪如横排好看。)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-28 11:22 , Processed in 0.039866 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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