ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请教各位老师一个遍历所有文件夹下的VBA循环的问题, 谢谢!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-6-26 17:11 | 显示全部楼层 |阅读模式
本帖最后由 mtsmty 于 2018-6-27 07:11 编辑

在编code时发现有一个循环实现不了, Code如下:

Option Explicit

Sub BatchGetFiles_FoldersName()

Dim sfso
Dim myPath As String
Dim sh As Object
Dim Folder As Object
Dim i As Long

Application.ScreenUpdating = False

On Error Resume Next

Set sfso = CreateObject("Scripting.FileSystemObject")
Set sh = CreateObject("shell.application")
Set Folder = sh.BrowseForFolder(0, "", 0, "")

If Folder Is Nothing Then     ' Clarifying whether the user click cancel button

    Exit Sub

End If

If Not Folder Is Nothing Then      ' Clarifying whether the user select a valid path

  myPath = Folder.Items.Item.Path
  'MsgBox myPath

End If

Cells(1, 1) = "OldName"
Cells(1, 2) = "FileType"
Cells(1, 3) = "FolderPath"
Cells(1, 4) = "FileOrSubFolderPath"
Cells(1, 5) = "NewName"
Cells(1, 6) = "Filename Extension"
Cells(1, 7) = "Size (MB)"
Cells(1, 8) = "Attribute"
Cells(1, 9) = "Date Created"
Cells(1, 10) = "Last Modified"
Call GetFileName(myPath & "\")

With ActiveSheet
.Columns("A:O").AutoFit
.Range("A1:O1").Font.Bold = True
.Range("A1:O1").Font.Italic = True
.Range("A1:O1").Font.ColorIndex = 3
End With


Application.ScreenUpdating = True


End Sub

Private Sub GetFileName(myPath As String)

Dim i, j As Long
Dim arr
Dim myTxt As String
Dim objFile, objFolder
Dim fso

    Set fso = CreateObject("Scripting.FileSystemObject")

    myTxt = Dir(myPath, 31)

    i = WorksheetFunction.CountA(Range("A:A").Rows)

    Do While myTxt <> ""

    On Error Resume Next

        If myTxt <> ThisWorkbook.Name And myTxt <> "." And myTxt <> ".." And myTxt <> "081226" Then ' Clarifying the level of Folder

            i = i + 1

            Cells(i, 1) = "'" & myTxt

            If (GetAttr(myPath & myTxt) And vbDirectory) = vbDirectory Then     ' Clarifying whether the item is a Folder of File

'=============================== Folder or File =======================================================================

                Cells(i, 2) = "FileFolder"

            Else

                Cells(i, 2) = "File"

            End If

'=============================== Folder Path =======================================================================

            Cells(i, 3) = Left(myPath, Len(myPath) - 1)

'=============================== Folder or File Path =======================================================================

            Cells(i, 4) = Cells(i, 3) & "/" & Cells(i, 1)

                'Cells(i, 6) = Mid(myTxt, InStr(myTxt, "."), Len(myTxt)
            If Cells(i, 2) = "FileFolder" Then

'=============================== Folder Attributes =======================================================================

                Set objFolder = fso.getfolder(Cells(i, 4).Text)

                Cells(i, 6) = ""
                Cells(i, 7) = FormatNumber(((objFolder.Size / 1024) / 1024), -1)
                Cells(i, 8) = objFolder.Attributes
                Cells(i, 9) = objFolder.dateCreated
                Cells(i, 10) = objFolder.DateLastModified

            Else

'=============================== File Attributes =======================================================================
                Set objFile = fso.getfile(Cells(i, 4).Text)

                arr = Split(myTxt, ".")
                j = UBound(arr)

                Cells(i, 6) = "." & arr(j)
                Cells(i, 7) = FormatNumber(((objFile.Size / 1024) / 1024), -1)
                Cells(i, 8) = objFile.Attributes
                Cells(i, 9) = objFile.dateCreated
                Cells(i, 10) = objFile.DateLastModified

            End If

        End If

        myTxt = Dir

    Loop

End Sub



Sub BatchGetCurrentPathAllFolder_Subfolder_Files()
' Could find 6 subfolder
Dim i1, i2, i3, i4, i5, i6, i7 As Long
Dim myPathRng As Range
Dim PathStr, myPath As String
Dim arr, btn
Dim sh
Dim ActSh As String
Dim rec, rec1, rec2, rec3, rec4, rec5, rec6

Call BatchGetFiles_FoldersName


rec = WorksheetFunction.CountA(Range("A:A"))

Application.ScreenUpdating = False

On Error Resume Next

For i1 = 2 To rec ' Count how much Folders

        If Cells(i1, 2) = "FileFolder" Then

            myPath = Cells(i1, 4).Text        ' Get the Folder path

            Call GetFileName(myPath & "\")

        End If

Next i1

rec1 = WorksheetFunction.CountA(Range("A:A"))

For i2 = rec + 1 To rec1
    If Cells(i2, 2) = "FileFolder" Then

            myPath = Cells(i2, 4).Text        ' Get the Folder path

            Call GetFileName(myPath & "\")

        End If

Next i2

rec2 = WorksheetFunction.CountA(Range("A:A"))

For i3 = rec1 + 1 To rec2
    If Cells(i3, 2) = "FileFolder" Then

            myPath = Cells(i3, 4).Text        ' Get the Folder path

            Call GetFileName(myPath & "\")

        End If

Next i3

rec3 = WorksheetFunction.CountA(Range("A:A"))

For i4 = rec2 + 1 To rec3
    If Cells(i4, 2) = "FileFolder" Then

            myPath = Cells(i4, 4).Text        ' Get the Folder path

            Call GetFileName(myPath & "\")

        End If

Next i4

rec4 = WorksheetFunction.CountA(Range("A:A"))

For i5 = rec3 + 1 To rec4
    If Cells(i5, 2) = "FileFolder" Then

            myPath = Cells(i5, 4).Text        ' Get the Folder path

            Call GetFileName(myPath & "\")

        End If

Next i5

rec5 = WorksheetFunction.CountA(Range("A:A"))

For i6 = rec4 + 1 To rec5
    If Cells(i6, 2) = "FileFolder" Then

            myPath = Cells(i6, 4).Text        ' Get the Folder path

            Call GetFileName(myPath & "\")

        End If

Next i6

End Sub

前两个procedure 是是遍历一个路径下所有文件的路径及名称,但无法遍历子文件夹下的文件与文件夹.
第三个procedure写了六个循环可以输出六级子文件夹下的所有文件, 想要实现的循环是直到路径下所有文件夹下都没有子文件夹才停止输出, 求大神指点, 感激不尽~


附上文件:
附件.zip (22.51 KB, 下载次数: 1)




TA的精华主题

TA的得分主题

发表于 2018-6-26 19:20 | 显示全部楼层
新同学  不明白你要干什么  很简单的问题  你搞得那么复杂

TA的精华主题

TA的得分主题

发表于 2018-6-26 19:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
最好能上传附件  并说明想要达到的效果

TA的精华主题

TA的得分主题

发表于 2018-6-26 19:38 | 显示全部楼层
Sub BatchLoop()

Dim rec1, rec2, rec3, rec4
Dim i, j, m, n

Cells(1, 1) = 1
Cells(2, 1) = 2
Cells(3, 1) = 3
Cells(4, 1) = 4
A = 1
rec1 = WorksheetFunction.CountA(Range("A:A"))

X: For i = A To rec1

    Cells(i, 1) = i

Next i

rec2 = WorksheetFunction.CountA(Range("A:A"))

For j = rec1 + 1 To rec2 + 3

    Cells(j, 1) = j

Next j

rec3 = WorksheetFunction.CountA(Range("A:A"))

For m = rec2 + 1 To rec3 + 5

    Cells(m, 1) = m

Next m

rec4 = WorksheetFunction.CountA(Range("A:A"))

For n = rec3 + 1 To rec4 + 10

    Cells(n, 1) = n

Next n
A = n
If A > 100 Then Exit Sub
GoTo X
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-26 21:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
sjlxp2010 发表于 2018-6-26 19:38
Sub BatchLoop()

Dim rec1, rec2, rec3, rec4

谢谢回复~, 现在的问题是并不清楚A是多少,有一个循环会一直读取数据,我做个附件放上来您看下~

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-26 21:24 | 显示全部楼层
abc123281 发表于 2018-6-26 19:21
最好能上传附件  并说明想要达到的效果

无法上传xlsm, 我把code更新了,您看下~

TA的精华主题

TA的得分主题

发表于 2018-6-27 06:44 来自手机 | 显示全部楼层
mtsmty 发表于 2018-6-26 21:24
无法上传xlsm, 我把code更新了,您看下~

压缩城zip你再上传。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-27 07:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zpy2 发表于 2018-6-27 06:44
压缩城zip你再上传。

哦哦,明白了~,谢谢

TA的精华主题

TA的得分主题

发表于 2018-6-27 07:50 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
mtsmty 发表于 2018-6-26 21:15
谢谢回复~, 现在的问题是并不清楚A是多少,有一个循环会一直读取数据,我做个附件放上来您看下~

遍历所有的文件夹可能用递归比较方便。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-27 08:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zpy2 发表于 2018-6-27 07:50
遍历所有的文件夹可能用递归比较方便。

不太会用。。。。所以才写了这么个循环,有没有什么教程呢?我搜到的都不太能实现所有子文件夹下的文件录入0.0
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 21:07 , Processed in 0.035400 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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