ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 提取文件夹及子文件夹数据方法

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-9-20 20:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
第九种方法:
Dim ArrFiles(1 To 10000) '创建一个数组空间,用来存放文件名称
Dim cntFiles% '文件个数
'引用FileSystemObject对象
'注意:要使用FileSystemObject对象,
'需要首先引用一下,具体方法,VBE--工具--引用--找到miscrosoft scription runtime项目并选中
Sub ListAllFiles()
On Error Resume Next
Dim strPath$ '声明文件路径
Dim j%
Dim arr(1 To 500, 1 To 70)
'Set fso = CreateObject("Scripting.FileSystemObject")
Dim fso As New FileSystemObject, fd As Folder '创建一个FileSystemObject对象和一个文件夹对象
strPath = ThisWorkbook.Path & "\" '"设置要遍历的文件夹目录
cntFiles = 0
Set fd = fso.GetFolder(strPath) '设置fd文件夹对象
SearchFiles fd '调用子程序查搜索文件

    For j = 1 To cntFiles
        '下面可以装入自己想要对所有提取文件进行操作的代码
        '================================================
        If ArrFiles(j) Like "*.xls" Or ArrFiles(j) Like "*.xlsx" And ArrFiles(j) <> strPath & ThisWorkbook.Name Then
            Set wb = Workbooks.Open(ArrFiles(j))
                With wb
               
                    With .Sheets(1)
                        arr(j, 1) = .Range("D1")
                        arr(j, 2) = .Range("J1")
                        arr(j, 3) = .Range("O1")
                        arr(j, 4) = .Range("E7")
                        arr(j, 5) = .Range("E8")
                        arr(j, 6) = .Range("E9")
                        arr(j, 7) = .Range("E10")
                        arr(j, 8) = .Range("E11")
                        arr(j, 9) = .Range("E12")
                        arr(j, 10) = .Range("E13")
                        arr(j, 11) = .Range("M7")
                        arr(j, 12) = .Range("M8")
                        arr(j, 13) = .Range("M9")
                        arr(j, 14) = .Range("M10")
                        arr(j, 15) = .Range("M11")
                        arr(j, 16) = .Range("M12")
                        arr(j, 17) = .Range("B7")
                        arr(j, 18) = .Range("B8")
                        arr(j, 19) = .Range("B9")
                        arr(j, 20) = .Range("B10")
                        arr(j, 21) = .Range("B11")
                        arr(j, 22) = .Range("B12")
                        arr(j, 23) = .Range("B13")
                        arr(j, 24) = .Range("J7")
                        arr(j, 25) = .Range("J8")
                        arr(j, 26) = .Range("J9")
                        arr(j, 27) = .Range("J10")
                        arr(j, 28) = .Range("J11")
                        arr(j, 29) = .Range("J12")
                        arr(j, 30) = .Range("J15")
                        arr(j, 31) = .Range("J16")
                        arr(j, 32) = .Range("J17")
                        arr(j, 33) = .Range("J18")
                        arr(j, 34) = .Range("J19")
                        arr(j, 35) = .Range("J20")
                        arr(j, 36) = .Range("J21")
                        arr(j, 37) = .Range("J22")
                        arr(j, 38) = .Range("J23")
                        arr(j, 39) = .Range("J24")
                        arr(j, 40) = .Range("J25")
                        arr(j, 41) = .Range("J26")
                        arr(j, 42) = .Range("J27")
                        arr(j, 43) = .Range("J28")
                        arr(j, 44) = .Range("J29")
                        arr(j, 45) = .Range("J30")
                        arr(j, 46) = .Range("J31")
                        arr(j, 47) = .Range("J32")
                        arr(j, 48) = .Range("J33")
                        arr(j, 49) = .Range("J34")
                        arr(j, 50) = .Range("C15")
                        arr(j, 51) = .Range("C16")
                        arr(j, 52) = .Range("C17")
                        arr(j, 53) = .Range("C18")
                        arr(j, 54) = .Range("C19")
                        arr(j, 55) = .Range("C20")
                        arr(j, 56) = .Range("C21")
                        arr(j, 57) = .Range("C22")
                        arr(j, 58) = .Range("C23")
                        arr(j, 59) = .Range("C24")
                        arr(j, 60) = .Range("C25")
                        arr(j, 61) = .Range("C26")
                        arr(j, 62) = .Range("C27")
                        arr(j, 63) = .Range("C28")
                        arr(j, 64) = .Range("C29")
                        arr(j, 65) = .Range("C30")
                        arr(j, 66) = .Range("C31")
                        arr(j, 67) = .Range("C32")
                        arr(j, 68) = .Range("C33")
                        arr(j, 69) = .Range("C34")
                    End With
                    arr(j, 70) = .Name
                    .Close False
                End With
                [a2].Resize(5000, 70).ClearContents
                [a2].Resize(5000, 70).Borders.LineStyle = xlNone
                [a2].Resize(j, 70) = arr
                [a2].Resize(j, 70).Borders.LineStyle = 1
               
            Set wb = Nothing
        '================================================
        End If
    Next j

'Sheets(1).Range("A1").Resize(cntFiles) = Application.Transpose(ArrFiles) '把数组内的路径和文件名放在单元格中

End Sub
Sub SearchFiles(ByVal fd As Folder)
Dim fl As File
Dim sfd As Folder
    For Each fl In fd.Files '通过循环把文件逐个放在数组内
        If fl <> ThisWorkbook.FullName Then
            cntFiles = cntFiles + 1
            ArrFiles(cntFiles) = fl.Path
        End If
    Next fl
   
    If fd.SubFolders.Count = 0 Then Exit Sub 'SubFolders返回由指定文件夹中所有子文件夹(包括隐藏文件夹和系统文件夹)组成的 Folders 集合
    For Each sfd In fd.SubFolders '在 Folders 集合进行循环查找
        SearchFiles sfd '使用递归方法查找下一个文件夹
    Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-9-20 20:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
第十种方法:
Option Explicit
Dim fso As Object    '模块级变量
Dim SourcePath As String, i%
Dim bReMoveVBC As Boolean
Dim ArrFiles(1 To 10000) '创建一个数组空间,用来存放文件名称

'主程序:通过递归,执行指定的操作
Sub main需确定是否删除宏()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error Resume Next
    Dim k%, wb As Workbook, j%
    Dim arr(1 To 500, 1 To 70)
    Set fso = CreateObject("scripting.filesystemobject")
    '获取源路径
    i = 0
    SourcePath = getFolderPath("请选择源路径")
    If SourcePath = "" Then End
'    bReMoveVBC = MsgBox("是否清除文件中的宏代码?", vbYesNo) = vbYes
    '递归
    Call Recursion(SourcePath)
    '显示结果
        For k = 1 To i
            Set wb = Workbooks.Open(ArrFiles(k))
                With wb
                    With .Sheets(1)
                        j = j + 1
                        arr(j, 1) = .Range("D1")
                        arr(j, 2) = .Range("J1")
                        arr(j, 3) = .Range("O1")
                        arr(j, 4) = .Range("E7")
                        arr(j, 5) = .Range("E8")
                        arr(j, 6) = .Range("E9")
                        arr(j, 7) = .Range("E10")
                        arr(j, 8) = .Range("E11")
                        arr(j, 9) = .Range("E12")
                        arr(j, 10) = .Range("E13")
                        arr(j, 11) = .Range("M7")
                        arr(j, 12) = .Range("M8")
                        arr(j, 13) = .Range("M9")
                        arr(j, 14) = .Range("M10")
                        arr(j, 15) = .Range("M11")
                        arr(j, 16) = .Range("M12")
                        arr(j, 17) = .Range("B7")
                        arr(j, 18) = .Range("B8")
                        arr(j, 19) = .Range("B9")
                        arr(j, 20) = .Range("B10")
                        arr(j, 21) = .Range("B11")
                        arr(j, 22) = .Range("B12")
                        arr(j, 23) = .Range("B13")
                        arr(j, 24) = .Range("J7")
                        arr(j, 25) = .Range("J8")
                        arr(j, 26) = .Range("J9")
                        arr(j, 27) = .Range("J10")
                        arr(j, 28) = .Range("J11")
                        arr(j, 29) = .Range("J12")
                        arr(j, 30) = .Range("J15")
                        arr(j, 31) = .Range("J16")
                        arr(j, 32) = .Range("J17")
                        arr(j, 33) = .Range("J18")
                        arr(j, 34) = .Range("J19")
                        arr(j, 35) = .Range("J20")
                        arr(j, 36) = .Range("J21")
                        arr(j, 37) = .Range("J22")
                        arr(j, 38) = .Range("J23")
                        arr(j, 39) = .Range("J24")
                        arr(j, 40) = .Range("J25")
                        arr(j, 41) = .Range("J26")
                        arr(j, 42) = .Range("J27")
                        arr(j, 43) = .Range("J28")
                        arr(j, 44) = .Range("J29")
                        arr(j, 45) = .Range("J30")
                        arr(j, 46) = .Range("J31")
                        arr(j, 47) = .Range("J32")
                        arr(j, 48) = .Range("J33")
                        arr(j, 49) = .Range("J34")
                        arr(j, 50) = .Range("C15")
                        arr(j, 51) = .Range("C16")
                        arr(j, 52) = .Range("C17")
                        arr(j, 53) = .Range("C18")
                        arr(j, 54) = .Range("C19")
                        arr(j, 55) = .Range("C20")
                        arr(j, 56) = .Range("C21")
                        arr(j, 57) = .Range("C22")
                        arr(j, 58) = .Range("C23")
                        arr(j, 59) = .Range("C24")
                        arr(j, 60) = .Range("C25")
                        arr(j, 61) = .Range("C26")
                        arr(j, 62) = .Range("C27")
                        arr(j, 63) = .Range("C28")
                        arr(j, 64) = .Range("C29")
                        arr(j, 65) = .Range("C30")
                        arr(j, 66) = .Range("C31")
                        arr(j, 67) = .Range("C32")
                        arr(j, 68) = .Range("C33")
                        arr(j, 69) = .Range("C34")
                    End With
                    arr(j, 70) = .Name
                    .Close False
                End With
                Range("a" & 2).Resize(5000, 70).ClearContents
                Range("a" & 2).Resize(5000, 70).Borders.LineStyle = xlNone
                Range("a" & 2).Resize(j, 70) = arr
                Range("a" & 2).Resize(j, 70).Borders.LineStyle = 1
   
            Set wb = Nothing
        Next
   
'    Shell "explorer " & SourcePath & "\", vbNormalFocus
End Sub

'获取文件夹路径
Function getFolderPath(prompt) As String
    Dim Objshell As Object, Objfolder As Object
    Set Objshell = CreateObject("Shell.Application")
    Set Objfolder = Objshell.BrowseForFolder(0, prompt, 0, 0)
    If Objfolder Is Nothing Then getFolderPath = "" Else getFolderPath = Objfolder.self.Path
    Set Objfolder = Nothing: Set Objshell = Nothing
End Function

'递归程序
Sub Recursion(myPath As String)
    Dim myFolder As Object, mySubFolder As Object, myFile As Object
    Dim wb As Workbook, j%
    Set myFolder = fso.GetFolder(myPath)
    '遍历文件夹
    For Each mySubFolder In myFolder.SubFolders
        Recursion mySubFolder.Path
    Next
    '遍历文件
    For Each myFile In myFolder.Files
'        Select Case fso.GetExtensionName(myPath & "\" & myFile)
'        Case "xls", "xlsx" ', "xlsm"
            If myFile Like "*.xls" Or myFile Like "*.xlsx" And myFile.Name <> ThisWorkbook.Name Then
                i = i + 1
                ArrFiles(i) = myFile
            End If
'        Case Else
'        End Select
'    Erase arr
    Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-9-20 20:44 | 显示全部楼层
第十一种方法:
Public brr(), n
Sub 提取目录下所有工作薄信息() 'bajifeng
'http://club.excelhome.net/thread-1253652-1-1.html
Dim arr(1 To 5000, 1 To 70), myPath$, myName$, sh As Worksheet
Dim wb$, i&, fso As New FileSystemObject, m%
Dim fs As Folder
Application.ScreenUpdating = False
wb = ThisWorkbook.Name
myPath = ThisWorkbook.Path & "\"    '如提取文件不在需提取数据文件夹内,路径需自己修改
Set fd = fso.GetFolder(myPath)
serch fd
For m = 0 To n - 1
    If brr(m) <> myPath & wb Then
        Workbooks.Open brr(m)
        With ActiveWorkbook
            With .Sheets(1)
                i = i + 1
                arr(i, 1) = .Range("D1")
                arr(i, 2) = .Range("J1")
                arr(i, 3) = .Range("O1")
                arr(i, 4) = .Range("E7")
                arr(i, 5) = .Range("E8")
                arr(i, 6) = .Range("E9")
                arr(i, 7) = .Range("E10")
                arr(i, 8) = .Range("E11")
                arr(i, 9) = .Range("E12")
                arr(i, 10) = .Range("E13")
                arr(i, 11) = .Range("M7")
                arr(i, 12) = .Range("M8")
                arr(i, 13) = .Range("M9")
                arr(i, 14) = .Range("M10")
                arr(i, 15) = .Range("M11")
                arr(i, 16) = .Range("M12")
                arr(i, 17) = .Range("B7")
                arr(i, 18) = .Range("B8")
                arr(i, 19) = .Range("B9")
                arr(i, 20) = .Range("B10")
                arr(i, 21) = .Range("B11")
                arr(i, 22) = .Range("B12")
                arr(i, 23) = .Range("B13")
                arr(i, 24) = .Range("J7")
                arr(i, 25) = .Range("J8")
                arr(i, 26) = .Range("J9")
                arr(i, 27) = .Range("J10")
                arr(i, 28) = .Range("J11")
                arr(i, 29) = .Range("J12")
                arr(i, 30) = .Range("J15")
                arr(i, 31) = .Range("J16")
                arr(i, 32) = .Range("J17")
                arr(i, 33) = .Range("J18")
                arr(i, 34) = .Range("J19")
                arr(i, 35) = .Range("J20")
                arr(i, 36) = .Range("J21")
                arr(i, 37) = .Range("J22")
                arr(i, 38) = .Range("J23")
                arr(i, 39) = .Range("J24")
                arr(i, 40) = .Range("J25")
                arr(i, 41) = .Range("J26")
                arr(i, 42) = .Range("J27")
                arr(i, 43) = .Range("J28")
                arr(i, 44) = .Range("J29")
                arr(i, 45) = .Range("J30")
                arr(i, 46) = .Range("J31")
                arr(i, 47) = .Range("J32")
                arr(i, 48) = .Range("J33")
                arr(i, 49) = .Range("J34")
                arr(i, 50) = .Range("C15")
                arr(i, 51) = .Range("C16")
                arr(i, 52) = .Range("C17")
                arr(i, 53) = .Range("C18")
                arr(i, 54) = .Range("C19")
                arr(i, 55) = .Range("C20")
                arr(i, 56) = .Range("C21")
                arr(i, 57) = .Range("C22")
                arr(i, 58) = .Range("C23")
                arr(i, 59) = .Range("C24")
                arr(i, 60) = .Range("C25")
                arr(i, 61) = .Range("C26")
                arr(i, 62) = .Range("C27")
                arr(i, 63) = .Range("C28")
                arr(i, 64) = .Range("C29")
                arr(i, 65) = .Range("C30")
                arr(i, 66) = .Range("C31")
                arr(i, 67) = .Range("C32")
                arr(i, 68) = .Range("C33")
                arr(i, 69) = .Range("C34")
            End With
            arr(i, 70) = .Name
            .Close False
        End With
    End If
Next
[a2].Resize(5000, 70).ClearContents
[a2].Resize(5000, 70).Borders.LineStyle = xnone
[a2].Resize(i, 70) = arr
[a2].Resize(i, 70).Borders.LineStyle = 1
Application.ScreenUpdating = True
End Sub

Sub serch(ByVal fd As Folder)
    Dim fl As File
    Dim sfd As Folder
    For Each fl In fd.Files
        If Right(fl, 3) = "xls" Then
            n = n + 1
            ReDim Preserve brr(n - 1)
            brr(n - 1) = fl.Path
        End If
    Next
    If fd.SubFolders.Count = 0 Then Exit Sub
    For Each sfd In fd.SubFolders
        serch sfd
    Next
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-9-20 20:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wz1497 发表于 2017-9-20 20:33
我一般用的是filesystemobject

欢迎分享,谢谢!

TA的精华主题

TA的得分主题

发表于 2017-9-20 20:54 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-9-20 21:00 | 显示全部楼层

谢谢分享,不过这个帖子中的代码我已经参考并运用了。而且也参照了香川群子老师的递归代码。函数法是北极狐老师的,都非常好,有些想不起来借鉴哪位老师的了,但是在此处一并感谢!

TA的精华主题

TA的得分主题

发表于 2017-9-20 21:03 | 显示全部楼层
乐乐2006201505 发表于 2017-9-20 20:44
第十一种方法:
Public brr(), n
Sub 提取目录下所有工作薄信息() 'bajifeng

感谢分享,期待更多精彩

TA的精华主题

TA的得分主题

发表于 2017-9-20 21:17 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-9-20 21:28 | 显示全部楼层
没有附件,我标红部分你自己修改即可,我这个力图达到通用。只要修改对工作表操作代码即可为你自己的代码。主要目的是要达到遍历本文件夹及所有子文件夹中指定类型的文件,并进行相应操作。有些方法中明显可以看出相同部分代码,是可以自己替换的部分。

TA的精华主题

TA的得分主题

发表于 2017-9-20 22:57 来自手机 | 显示全部楼层
本帖最后由 duquancai 于 2017-9-20 23:09 编辑
乐乐2006201505 发表于 2017-9-20 21:28
没有附件,我标红部分你自己修改即可,我这个力图达到通用。只要修改对工作表操作代码即可为你自己的代码。 ...

还有两种方法
1.用栈:DIR+3个DO循环;FSO+1个DO循环+2个for each循环
2.用队列:DIR+3个DO循环;FSO+1个DO循环+2个for each循环

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-6 11:10 , Processed in 0.045344 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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