Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5486|回复: 23

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

[复制链接]
发表于 2013-2-6 09:46 | 显示全部楼层 |阅读模式
如何修改红框圈内黄底色的这句代码提取数据库文件夹的资料换成提取数据库文件夹内子文件夹的所有资料
测试.rar (115.82 KB, 下载次数: 47)
发表于 2013-2-6 09:59 | 显示全部楼层
你参考下这个过程,加进去自己针对工作簿的处理代码就成了。
  1. Sub ListDirs(ByVal Path As String)
  2.     Dim filename$
  3.     Dim arrPath()
  4.     Dim sPath$
  5.     Dim i&, j&

  6.     i = 1: j = 1

  7.     ReDim arrPath(1 To 1)
  8.     arrPath(i) = Path & Application.PathSeparator
  9.     'On Error Resume Next

  10.     sPath = arrPath(j)
  11.     Debug.Print sPath
  12.     Do While Len(sPath)
  13.         filename = Dir(sPath & "*.*", vbDirectory + vbNormal)
  14.         Do While Len(filename)

  15.             If Not (filename = "." Or filename = "..") Then
  16.                 If (GetAttr(sPath & "" & filename) And vbDirectory) = 16 Then
  17.                     '避免读取错误
  18.                     If Err.Number <> 0 Then Err.Clear: GoTo End1If
  19.                     i = i + 1
  20.                     ReDim Preserve arrPath(1 To i)
  21.                     arrPath(i) = sPath & filename & Application.PathSeparator
  22.                 Else
  23.                     '文件处理代码
  24.                 End If
  25.             End If
  26. End1If:
  27.             filename = Dir
  28.         Loop

  29.         j = j + 1
  30.         If j > i Then Exit Do
  31.         sPath = arrPath(j)
  32.     Loop
  33. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-2-6 10:01 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 09:59
你参考下这个过程,加进去自己针对工作簿的处理代码就成了。

老师能帮处理一下吗我才刚学习VBA对我来说有点难度  谢谢
回复

使用道具 举报

发表于 2013-2-6 10:02 | 显示全部楼层
  1. Sub ListDirs(ByVal Path As String)
  2.     '文件名
  3.     Dim filename$
  4.     '文件夹数组
  5.     Dim arrPath()
  6.     '当前搜索的文件夹
  7.     Dim sPath$
  8.     '计数变量
  9.     Dim i&, j&

  10.     i = 1: j = 1

  11.     ReDim arrPath(1 To 1)
  12.     arrPath(i) = Path & Application.PathSeparator
  13.     'On Error Resume Next

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

  40.         j = j + 1
  41.         If j > i Then Exit Do
  42.         sPath = arrPath(j)
  43.     Loop
  44. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-2-6 10:05 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 10:02

好的老师那我先试一下,不懂再请教你。谢谢了老师
回复

使用道具 举报

 楼主| 发表于 2013-2-6 10:09 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 10:02

老师能按照我的附件帮修改一下吗?谢谢
回复

使用道具 举报

发表于 2013-2-6 10:10 | 显示全部楼层
你的整合进来了。
你直接调用 call listdirs 你的数据路径
  1. Sub ListDirs(ByVal Path As String)
  2. '文件名
  3.     Dim filename$
  4.     '文件夹数组
  5.     Dim arrPath()
  6.     '当前搜索的文件夹
  7.     Dim sPath$
  8.     '计数变量
  9.     Dim i&, j&

  10.     i = 1: j = 1

  11.     ReDim arrPath(1 To 1)
  12.     arrPath(i) = Path & Application.PathSeparator
  13.     'On Error Resume Next

  14.     sPath = arrPath(j)
  15.     'Debug.Print sPath
  16.     Do While Len(sPath)
  17.         '搜索文件和文件夹(无属性设置的)
  18.         filename = Dir(sPath & "*.*", vbDirectory + vbNormal)
  19.         Do While Len(filename)
  20.             '跳过. 和 .. 文件夹
  21.             If Not (filename = "." Or filename = "..") Then
  22.                 '判断是否为文件夹
  23.                 If (GetAttr(sPath & "" & filename) And vbDirectory) = 16 Then
  24.                     '避免读取错误
  25.                     If Err.Number <> 0 Then Err.Clear: GoTo End1If
  26.                     i = i + 1
  27.                     '把搜索到的子文件夹放入数组中
  28.                     ReDim Preserve arrPath(1 To i)
  29.                     arrPath(i) = sPath & filename & Application.PathSeparator
  30.                 Else
  31.                     '在在此处加入针对文件处理的代码
  32.                     '
  33.                     '
  34.                     '
  35.                     If filename <> ThisWorkbook.Name And upper(filename) Like "*.XLS" Then
  36.                         Set AK = Workbooks.Open(sPath & filename)          '打开符合要求的文件

  37.                         For i = 6 To 65536 Step 1
  38.                             If AK.Sheets(1).Cells(i, 1).Value <> "" Then
  39.                             Else
  40.                                 Exit For
  41.                             End If
  42.                         Next
  43.                         aRow = i - 1
  44.                         tRow = ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Row + 1
  45.                         If tRow < 5 Then tRow = 5
  46.                         arr = AK.Sheets(1).Range("a6:q" & aRow)
  47.                         ThisWorkbook.Sheets(1).Range("A" & tRow).Resize(UBound(arr), UBound(arr, 2)) = arr
  48.                         ThisWorkbook.Sheets(1).Range("R" & tRow).Resize(UBound(arr), 1) = AK.Sheets(1).Range("c2")
  49.                         Workbooks(filename).Close False               '关闭源工作簿,并不作修改

  50.                     End If
  51.                 End If
  52. End1If:
  53.                 filename = Dir
  54.             Loop

  55.             j = j + 1
  56.             If j > i Then Exit Do
  57.             sPath = arrPath(j)
  58.         Loop
  59. End Sub
复制代码
回复

使用道具 举报

发表于 2013-2-6 10:11 | 显示全部楼层
  1.                         For i = 6 To 65536 Step 1
  2.                             If AK.Sheets(1).Cells(i, 1).Value <> "" Then
  3.                             Else
  4.                                 Exit For
  5.                             End If
  6.                         Next
复制代码
你这里可以直接改成
  1.                         For i = 6 To 65536 Step 1
  2.                             If AK.Sheets(1).Cells(i, 1).Value = "" Then Exit For
  3.                         Next
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-2-6 10:40 | 显示全部楼层
hwc2ycy 发表于 2013-2-6 10:11
你这里可以直接改成

老师我试了好多遍都不行呢。水平有限没办法。
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 23:28 , Processed in 0.444081 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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