Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: qinhuan66

[已解决]如何提取文件夹内子文件夹的所有资料 有图有代码

[复制链接]
发表于 2013-2-6 11:24 | 显示全部楼层
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2013-2-6 11:51 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 11:23
你没用对方法,你要调用这个过程,直接用是没效的。

老师在吗?我试了一下还是不知道咋调用。能再指导一下吗?
回复

使用道具 举报

发表于 2013-2-6 13:05 | 显示全部楼层
回复

使用道具 举报

发表于 2013-2-6 13:40 | 显示全部楼层    本楼为最佳答案   
  1. Sub 提取数据()
  2.     Dim myPath$
  3.     Application.ScreenUpdating = False        '冻结屏幕,以防屏幕抖动
  4.     Application.DisplayAlerts = False

  5.     myPath = ThisWorkbook.Path & "\数据库"          '把文件路径定义给变量
  6.     ListDirs myPath


  7.     Application.ScreenUpdating = True                 '冻结屏幕,此类语句一般成对使用
  8.     MsgBox "汇总完成,请查看!", 64, "提示"
  9. End Sub

  10. Sub 删除5至10000行数据()
  11.     Rows("5:10000").Delete Shift:=xlUp
  12. End Sub


  13. Sub ListDirs(ByVal Path As String)
  14. '文件名
  15.     Dim filename$
  16.     '文件夹数组
  17.     Dim arrPath()
  18.     '当前搜索的文件夹
  19.     Dim sPath$
  20.     '计数变量
  21.     Dim i&, j&, k&
  22.     Dim AK As Workbook, aRow%, tRow%
  23.     i = 1: j = 1

  24.     ReDim arrPath(1 To 1)
  25.     arrPath(i) = Path & Application.PathSeparator
  26.     'On Error Resume Next

  27.     sPath = arrPath(j)
  28.     'Debug.Print sPath
  29.     Do While Len(sPath)
  30.         Debug.Print "--------------------"
  31.         Debug.Print sPath
  32.         '搜索文件和文件夹(无属性设置的)
  33.         filename = Dir(sPath & "*.*", vbDirectory + vbNormal)
  34.         Do While Len(filename)
  35.             '跳过. 和 .. 文件夹
  36.             If Not (filename = "." Or filename = "..") Then
  37.                 '判断是否为文件夹
  38.                 If (GetAttr(sPath & "" & filename) And vbDirectory) = 16 Then
  39.                     '避免读取错误
  40.                     If Err.Number <> 0 Then Err.Clear: GoTo End1If
  41.                     i = i + 1
  42.                     '把搜索到的子文件夹放入数组中
  43.                     ReDim Preserve arrPath(1 To i)
  44.                     arrPath(i) = sPath & filename & Application.PathSeparator
  45.                 Else
  46.                     '在在此处加入针对文件处理的代码



  47.                     If filename <> ThisWorkbook.Name And UCase(filename) Like "*.XLS" Then
  48.                         Debug.Print filename
  49.                         Set AK = Workbooks.Open(sPath & filename)          '打开符合要求的文件

  50.                         For k = 6 To 65536
  51.                             If AK.Sheets(1).Cells(k, 1).Value = "" Then Exit For
  52.                         Next
  53.                         aRow = k - 1
  54.                         tRow = ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Row + 1
  55.                         If tRow < 5 Then tRow = 5
  56.                         arr = AK.Sheets(1).Range("a6:q" & aRow)
  57.                         ThisWorkbook.Sheets(1).Range("A" & tRow).Resize(UBound(arr), UBound(arr, 2)) = arr
  58.                         ThisWorkbook.Sheets(1).Range("R" & tRow).Resize(UBound(arr), 1) = AK.Sheets(1).Range("c2")
  59.                         Workbooks(filename).Close False               '关闭源工作簿,并不作修改
  60.                     End If
  61.                 End If
  62.             End If
  63. End1If:
  64.             filename = Dir
  65.         Loop

  66.         j = j + 1
  67.         If j > i Then Exit Do
  68.         sPath = arrPath(j)
  69.     Loop
  70. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
qinhuan66 + 1 真的很感谢老师的帮忙

查看全部评分

回复

使用道具 举报

发表于 2013-2-6 13:43 | 显示全部楼层
养老保险待遇发放系统.rar (46.72 KB, 下载次数: 6)
回复

使用道具 举报

 楼主| 发表于 2013-2-6 14:02 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 13:43
有两个地方没注意了。upper弄错了。
然后你的统计代码里也有个变量i,跟我遍历目录的代码里的变量i冲突, ...

谢谢了朋友!你真是帮了我一个大忙。真的感激不尽呀。对了有空的话帮忙看最后一个问题,也是像上面那个提取汇总的路径一模一样。
代码如下:
Sub 生成数据()
Dim wj As String, fs As Object, arr, Rng As Range, Y!, N1&, N2&
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Range("a5:s500").ClearContents
wj = Dir(ThisWorkbook.Path & "\数据库\")
s = 2
Do While wj <> ""
    If s = 2 Then
        ReDim arr(1 To 23, 1 To 1)
    Else
        ReDim Preserve arr(1 To 23, 1 To UBound(arr, 2) + 1)
    End If
    s = s + 1
    Set fs = GetObject(ThisWorkbook.Path & "\数据库\" & wj)
    arr(1, s - 2) = s - 2
    arr(2, s - 2) = Mid(wj, 4, IIf(InStr(wj, "区") > 0, InStr(wj, "区") - 3, InStr(wj, "村") - 3))
    arr(3, s - 2) = fs.Sheets(1).[P2]
    arr(4, s - 2) = "=SUM(RC[1]+RC[2])"
    arr(5, s - 2) = Application.WorksheetFunction.CountIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放")
    arr(6, s - 2) = Application.WorksheetFunction.CountIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发")
    arr(7, s - 2) = "=SUM(RC[1]+RC[4])"
    arr(8, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放", fs.Sheets(1).Range("G6:G10000"))
    arr(9, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放", fs.Sheets(1).Range("H6:H10000"))
    arr(10, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放", fs.Sheets(1).Range("I6:I10000"))
    arr(11, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发", fs.Sheets(1).Range("J6:J10000"))
    arr(12, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发", fs.Sheets(1).Range("K6:K10000"))
    arr(13, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发", fs.Sheets(1).Range("L6:L10000"))
    arr(16, s - 2) = ""
    arr(17, s - 2) = ""
    arr(18, s - 2) = ""
    arr(19, s - 2) = ""
    arr(20, s - 2) = ""
    arr(21, s - 2) = ""
    arr(22, s - 2) = ""
    arr(23, s - 2) = ""
    With fs.Sheets(1)
        N1 = 0
        N2 = 0
        For Each Rng In .Range("d6:d" & .Cells(.Rows.Count, 4).End(3).Row)
            If Rng <> "" And (.Cells(Rng.Row, "Q").Value = "正常发放" Or .Cells(Rng.Row, "Q").Value = "死亡停发") Then
                Y = Val(IIf(Len(Rng.Text) = 18, Mid(Trim(Rng.Text), 7, 4), "19" & Mid(Trim(Rng.Text), 7, 2)))
                Select Case Y
                    Case Is <= 1949
                        N1 = N1 + 1
                    Case Is <= 1952
                        N2 = N2 + 1
                    Case Else

                End Select
            End If
        Next Rng
    End With
    arr(14, s - 2) = Val(arr(14, s - 2)) + N1
    arr(15, s - 2) = Val(arr(15, s - 2)) + N2
    fs.Close False
    wj = Dir
Loop
Cells(5, 1).Resize(UBound(arr, 2), UBound(arr)) = Application.Transpose(arr)
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Sub 删除数据()
Range("A5:w65536").ClearContents
End Sub

回复

使用道具 举报

 楼主| 发表于 2013-2-6 14:49 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 13:43
有两个地方没注意了。upper弄错了。
然后你的统计代码里也有个变量i,跟我遍历目录的代码里的变量i冲突, ...

我试做了上面这个老是跳出  LOOP没有DO 等等
回复

使用道具 举报

发表于 2013-2-6 16:04 | 显示全部楼层
这个代码是我用的遍历模板,没问题的。
你单步看看,直接跳出,肯定是没找到文件嘛。
回复

使用道具 举报

 楼主| 发表于 2013-2-6 16:09 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 16:04
这个代码是我用的遍历模板,没问题的。
你单步看看,直接跳出,肯定是没找到文件嘛。

老师帮帮手好吗,准备放假了,我想弄好过了年来得用。谢谢
回复

使用道具 举报

发表于 2013-2-6 16:30 | 显示全部楼层
  1. Option Explicit
  2. Dim arr

  3. Sub 生成数据()
  4.     Dim filename As String ', , Rng As Range,
  5.     Application.ScreenUpdating = False
  6.     Application.DisplayAlerts = False
  7.     Application.EnableEvents = False
  8.     Range("a5:s500").ClearContents

  9.     ListDirs ThisWorkbook.Path & "\数据库"

  10.     Cells(5, 1).Resize(UBound(arr, 2), UBound(arr)) = Application.Transpose(arr)
  11.     Application.EnableEvents = True
  12.     Application.DisplayAlerts = True
  13.     Application.ScreenUpdating = True
  14. End Sub
  15. Sub 删除数据()
  16.     Range("A5:w65536").ClearContents
  17. End Sub


  18. Sub ListDirs(ByVal Path As String)
  19.     '文件名
  20.     Dim filename$
  21.     '文件夹数组
  22.     Dim arrPath()
  23.     '当前搜索的文件夹
  24.     Dim sPath$
  25.     '计数变量
  26.     Dim i&, j&, k&, s&
  27.     Dim N1&, N2&, Y!
  28.     Dim fs As Workbook
  29.     Dim Rng As Range
  30.     i = 1: j = 1
  31.     s = 2
  32.     ReDim arrPath(1 To 1)
  33.    
  34.     arrPath(i) = Path & Application.PathSeparator
  35.     'On Error Resume Next
  36.     sPath = arrPath(j)
  37.    
  38.     Do While Len(sPath)
  39.         'Debug.Print "--------------------"
  40.         'Debug.Print sPath
  41.         
  42.         '搜索文件和文件夹(无属性设置的)
  43.         filename = Dir(sPath & "*.*", vbDirectory + vbNormal)
  44.         Do While Len(filename)
  45.             '跳过. 和 .. 文件夹
  46.             If Not (filename = "." Or filename = "..") Then
  47.                 '判断是否为文件夹
  48.                 If (GetAttr(sPath & "" & filename) And vbDirectory) = 16 Then
  49.                     '避免读取错误
  50.                     If Err.Number <> 0 Then Err.Clear: GoTo End1If
  51.                     i = i + 1
  52.                     '把搜索到的子文件夹放入数组中
  53.                     ReDim Preserve arrPath(1 To i)
  54.                     arrPath(i) = sPath & filename & Application.PathSeparator
  55.                 Else
  56.                     If filename <> ThisWorkbook.Name And (Not LCase(filename) Like "*.xls") Then
  57.                         '在在此处加入针对文件处理的代码
  58.                         If s = 2 Then
  59.                             ReDim arr(1 To 23, 1 To 1)
  60.                         Else
  61.                             ReDim Preserve arr(1 To 23, 1 To UBound(arr, 2) + 1)
  62.                         End If
  63.                         s = s + 1
  64.                         Set fs = GetObject(sPath & filename)
  65.                         arr(1, s - 2) = s - 2
  66.                         arr(2, s - 2) = Mid(filename, 4, IIf(InStr(filename, "区") > 0, InStr(filename, "区") - 3, InStr(filename, "村") - 3))
  67.                         arr(3, s - 2) = fs.Sheets(1).[P2]
  68.                         arr(4, s - 2) = "=SUM(RC[1]+RC[2])"
  69.                         arr(5, s - 2) = Application.WorksheetFunction.CountIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放")
  70.                         arr(6, s - 2) = Application.WorksheetFunction.CountIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发")
  71.                         arr(7, s - 2) = "=SUM(RC[1]+RC[4])"
  72.                         arr(8, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放", fs.Sheets(1).Range("G6:G10000"))
  73.                         arr(9, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放", fs.Sheets(1).Range("H6:H10000"))
  74.                         arr(10, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "正常发放", fs.Sheets(1).Range("I6:I10000"))
  75.                         arr(11, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发", fs.Sheets(1).Range("J6:J10000"))
  76.                         arr(12, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发", fs.Sheets(1).Range("K6:K10000"))
  77.                         arr(13, s - 2) = Application.WorksheetFunction.SumIf(fs.Sheets(1).Range("Q6:Q10000"), "死亡停发", fs.Sheets(1).Range("L6:L10000"))
  78.                         arr(16, s - 2) = ""
  79.                         arr(17, s - 2) = ""
  80.                         arr(18, s - 2) = ""
  81.                         arr(19, s - 2) = ""
  82.                         arr(20, s - 2) = ""
  83.                         arr(21, s - 2) = ""
  84.                         arr(22, s - 2) = ""
  85.                         arr(23, s - 2) = ""
  86.                         With fs.Sheets(1)
  87.                             N1 = 0
  88.                             N2 = 0
  89.                             For Each Rng In .Range("d6:d" & .Cells(.Rows.Count, 4).End(3).Row)
  90.                                 If Rng <> "" And (.Cells(Rng.Row, "Q").Value = "正常发放" Or .Cells(Rng.Row, "Q").Value = "死亡停发") Then
  91.                                     Y = Val(IIf(Len(Rng.Text) = 18, Mid(Trim(Rng.Text), 7, 4), "19" & Mid(Trim(Rng.Text), 7, 2)))
  92.                                     Select Case Y
  93.                                         Case Is <= 1949
  94.                                             N1 = N1 + 1
  95.                                         Case Is <= 1952
  96.                                             N2 = N2 + 1
  97.                                         Case Else

  98.                                     End Select
  99.                                 End If
  100.                             Next Rng
  101.                         End With
  102.                         arr(14, s - 2) = Val(arr(14, s - 2)) + N1
  103.                         arr(15, s - 2) = Val(arr(15, s - 2)) + N2
  104.                         fs.Close False
  105.                     End If
  106.                 End If
  107.             End If
  108. End1If:
  109.                 filename = Dir
  110.             Loop

  111.             j = j + 1
  112.             If j > i Then Exit Do
  113.             sPath = arrPath(j)
  114.         Loop
  115.     End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 13:52 , Processed in 0.295335 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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