ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于Office2007的Application.filesearch替代方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-3 21:32 | 显示全部楼层 |阅读模式
在论坛里找到了一些方法,不过大多是excelhome的
https://www.veryword.com/2009/04/office2007_application-filesearch.html
这个网址里用类模块来替代,但是我用的时候发现只遍历了当前文件夹,如果要遍历当前文件夹并子文件夹,不知怎么修改代码
第一个类,命名为FileSearh:
Dim pLookIn As String Dim pSearchSubFolders As Boolean Dim pFileName As String
Public FoundFiles As New Collection

Public Property Get LookIn() As String
LookIn = pLookIn
End Property
Public Property Let LookIn(value As String)
pLookIn = value
End Property
Public Property Get SearchSubFolders() As Boolean
LookIn = pSearchSubFolders
End Property
Public Property Let SearchSubFolders(value As Boolean)
pSearchSubFolders = value
End Property
Public Property Get fileName() As String
fileName = pFileName
End Property
Public Property Let fileName(value As String)
pFileName = value
End Property
Public Function Execute() As Long

Dim ex As Long
Dim sLookIn As String
Dim sDirName As String
Dim sSubDir As String
Dim sFileName As String
Dim ff As FilesFound

Set ff = New FilesFound
sLookIn = LookIn
sDirName = Dir(sLookIn, vbDirectory)
sFileName = Dir(sLookIn & "\", vbNormal)
Do Until Len(sFileName) = 0
If sFileName Like fileName Then
ff.AddFile sLookIn, sFileName
FoundFiles.Add (ff.FoundFileFullName)
End If
sFileName = Dir
Loop
If SearchSubFolders Then
Do Until Len(sDirName) = 0
If GetAttr(sLookIn & sDirName) = vbDirectory Then
sSubDir = sDirName
Do Until Len(sFileName) = 0
If GetAttr(sDirName) = vbNormal Then
sFileName = sDirName
ff.AddFile sDirName, sFileName
FoundFiles.Add (ff)
End If
Loop
End If
sDirName = Dir
Loop
End If

Execute = FoundFiles.Count

End Function

第二个类,命名为FilesFound :
Public FoundFileFullName As String
Public Function AddFile(path As String, fileName As String)
FoundFileFullName = path & "\" & fileName
End Function

使用:

Dim sFile as String
Dim fs As New FileSearh
With fs
.LookIn = sPath
.SearchSubFolders = True
.fileName = "*"
If .Execute > 0 Then
For i = 1 To .FoundFiles.Count
sFile = .FoundFiles(i)
' your code here
Next
End If
End With

TA的精华主题

TA的得分主题

发表于 2018-7-3 22:41 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
类模块麻烦的要死。用我的两个现成的吧(别说不知道怎么用):
Function FSO遍历()   
'*------------------------------------------------------------------------------*  
    Dim fso As Object, b As Object, arr() As String, F
    Set fso = CreateObject("scripting.filesystemobject")  
    With Application.FileDialog(msoFileDialogFolderPicker)  
        If .Show <> -1 Then Exit Function  
        fod = .InitialFileName  
    End With  
    For Each F In fso.GetFolder(fod).Files  '目录本身的  
        ReDim Preserve arr(i)  
        arr(i) = F  
        i = UBound(arr) + 1  
    Next  
    查找子目录 fod, arr, fso  
    arr = Filter(arr, ".doc", True, vbTextCompare) '仅保留doc文件  
    arr = Filter(arr, "*", False, vbTextCompare)  
    arr = Filter(arr, "$", False, vbTextCompare) '过滤掉带有$符号的文件  
    FSO遍历 = arr  
    Set fso = Nothing  
End Function  
Function 查找子目录(ByVal fod As String, arr, fso)  
    If fso.FolderExists(fod) Then  
        If Len(fso.GetFolder(fod)) = 0 Then  
            Debug.Print "文件夹为空"
        Else  
            For Each zi In fso.GetFolder(fod).SubFolders  
                For Each F In zi.Files '子目录中的  
                    i = UBound(arr) + 1  
                    ReDim Preserve arr(i)  
                    arr(i) = F  
                Next  
                查找子目录 zi, arr, fso  
            Next  
        End If  
    End If  
End Function  
  
Function Dir遍历()  
Dim arr() As String  
    With Application.FileDialog(msoFileDialogFolderPicker)  
        If .Show <> -1 Then Exit Function  
        fod = .InitialFileName  
    End With  
处理子目录 fod, arr  
    arr = Filter(arr, ".doc", True, vbTextCompare) '仅保留doc文件  
    arr = Filter(arr, "$", False, vbTextCompare) '过滤掉带有$符号的文件  
Dir遍历 = arr  
End Function  
Sub 处理子目录(p, arr)  
On Error Resume Next  
    Dim a As String, b() As String, c() As String  
    If Right(p, 1) <> "\" Then p = p + "\"  
    MY = Dir(p, vbDirectory Or vbHidden Or vbNormal Or vbReadOnly)  
    Do While MY <> ""  
        If MY <> ".." And MY <> "." Then  
            If (GetAttr(p + MY) And vbDirectory) = vbDirectory Then  
                n = n + 1  
                ReDim Preserve b(n)  
                b(n - 1) = MY  
            Else  
            On Error Resume Next  
                i = UBound(arr) + 1  
            On Error GoTo 0  
                ReDim Preserve arr(i)  
                arr(i) = p + MY  
            End If  
        End If  
        MY = Dir  
    Loop  
    For j = 0 To n - 1  
        处理子目录 (p + b(j)), arr  
    Next  
    ReDim b(0)  
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-4 22:09 | 显示全部楼层
我上传了我的程序,我是用类模块实现Application.filesearch,剩下两个问题
(1)比如我选文件夹“资料库”,要查找的内容是“你好”,软后遍历问价夹时,子文件夹内的文件没有加载
(2)最后显示“共找到n个文件”的n并不是打开并定位的文件个数,而是总的个数
请帮忙修改下,万分感谢。

里面有5个文件,子文件内有两个文件

里面有5个文件,子文件内有两个文件

查找你好

查找你好

这里5,说明没有遍历子文件夹

这里5,说明没有遍历子文件夹

最后只找到3个,但它说5个,说明是总个数,而不是找到的个数

最后只找到3个,但它说5个,说明是总个数,而不是找到的个数

内容查找.rar

93.18 KB, 下载次数: 8

模板和资料库

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-7 19:58 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-8-15 22:52 | 显示全部楼层
葡萄枝 发表于 2018-7-7 19:58
谁能帮忙,自己顶下

你不能获取正确的结果,是因为网上流传的这个代码本身就是错误的。
本人已予以修正,将FileSearch的类模块部分修正如下:

  1. Dim pLookIn As String
  2. Dim pSearchSubFolders As Boolean
  3. Dim pFileName As String
  4. Public FoundFiles As New Collection

  5. Public Property Get LookIn() As String
  6. LookIn = pLookIn
  7. End Property
  8. Public Property Let LookIn(value As String)
  9. pLookIn = value
  10. End Property
  11. Public Property Get SearchSubFolders() As Boolean
  12. LookIn = pSearchSubFolders
  13. End Property
  14. Public Property Let SearchSubFolders(value As Boolean)
  15. pSearchSubFolders = value
  16. End Property
  17. Public Property Get fileName() As String
  18. fileName = pFileName
  19. End Property
  20. Public Property Let fileName(value As String)
  21. pFileName = value
  22. End Property
  23. Public Function Execute() As Long
  24.    
  25. Dim ex As Long
  26. Dim sLookIn As String
  27. Dim sDirName As String
  28. Dim sSubDir As String
  29. Dim sFileName As String
  30. Dim sFileName2 As String
  31. Dim ff As FilesFound
  32. Dim arr() As String, i&, k&, f
  33.     ReDim Preserve arr(1)
  34.     Set ff = New FilesFound
  35.     arr(1) = LookIn & ""
  36.     i = 1: k = 1
  37.     Do While i < UBound(arr) + 1
  38.         If arr(i) = "" Then Exit Do
  39.         sFileName = Dir(arr(i), vbDirectory)
  40.         Do While sFileName <> ""
  41.             If InStr(sFileName, ".") = 0 And sFileName <> "" Then
  42.                 If GetAttr(arr(i) & sFileName) = 16 Then
  43.                     k = k + 1
  44.                     ReDim Preserve arr(k)
  45.                     arr(k) = arr(i) & sFileName & ""
  46.                 End If
  47.             Else
  48.                 If sFileName Like fileName Then
  49.                     If pSearchSubFolders Then
  50.                         ff.AddFile arr(i), sFileName
  51.                         FoundFiles.Add (ff.FoundFileFullName)
  52.                     Else
  53.                         If i < 2 Then
  54.                             ff.AddFile arr(i), sFileName
  55.                             FoundFiles.Add (ff.FoundFileFullName)
  56.                         End If
  57.                     End If
  58.                 End If
  59.             End If
  60.             sFileName = Dir
  61.         Loop
  62.         i = i + 1
  63.     Loop
  64.     Execute = FoundFiles.Count
  65. End Function
复制代码
上面的两处也一并修正了。

内容查找-修正.rar

27.24 KB, 下载次数: 22

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-25 06:51 , Processed in 0.044846 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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