循环浏览所有文件夹及其所有子文件夹VBA

时间:2016-11-22 11:34:03

标签: vba excel-vba excel

我知道这个问题之前被问了很多次,我已经检查过以前的建议,但我无法让我的代码运行。

所以,我有一个名为“Report”的文件夹,其中也包含多个文件夹。这些文件夹包含.xlsx和.zip文件。

每个文件还包含一个名为“2016”的文件夹,在其下面有12个文件夹“January”,“February”,...,“December”。

以下是一个子文件夹的示例 enter image description here

我想要做的是,循环遍历所有这些子文件夹,并根据createdDate将.xlsx和.zip文件移动到每月文件夹。

例如,11月创建的位置中的所有.xlsx和.zip将被移动到同一位置的“2016”中的“November”文件夹。

我创建了这个宏,但这很耗时,因为每次我需要更改每个子浮动的路径并为每个子文件夹运行它。

Sub Move_Files_To_Folder()

Dim Fso As Object
Dim FromPath As String
Dim ToPath As String
Dim FileInFromFolder As Object

'Change Path
FromPath = "C:\Report\Shipment\"
ToPath = "C:\Report\Shipment\2016\"

Set Fso = CreateObject("scripting.filesystemobject")

For Each FileInFromFolder In Fso.GetFolder(FromPath).Files

'Change month and year
If (Month(FileInFromFolder.DateCreated)) = 11 And (year(FileInFromFolder.DateCreated)) = 2016 _
And (InStr(1, FileInFromFolder.name, ".xlsx") Or InStr(1, FileInFromFolder.name, ".zip")) Then
FileInFromFolder.Move (ToPath & MonthName(Month(FileInFromFolder.DateCreated)) & "\")
End If

Next FileInFromFolder

End Sub

我想自动化我的宏,以便它可以在所有子文件夹上工作不是一个接一个并且每次都改变路径。 有什么建议吗?非常感谢你。

2 个答案:

答案 0 :(得分:8)

与@luke_t和@Lowpar不同,我不认为递归循环,查看所有子文件夹和文件是正确答案,因为当你到达底部文件夹(即C:\Report\Shipment\2016\May\)时,你会得到和移动已经在正确位置的文件。

由于你有固定的文件夹结构,你可以遍历主文件夹(.xlsx)的每个子文件夹中的每个.zipC:\Report\文件。

Sub Move_Files_To_Folder()

Dim Fso As Object, objFolder As Object, objSubFolder As Object
Dim FromPath As String
Dim FileInFolder As Object

FromPath = "C:\Report\"
Set Fso = CreateObject("Scripting.filesystemobject")
Set objFolder = Fso.GetFolder(FromPath)

For Each objSubFolder In objFolder.subfolders
    For Each FileInFolder In objSubFolder.Files

        If InStr(1, FileInFolder.Name, ".xlsx") Or InStr(1, FileInFolder.Name, ".zip") Then
            FileInFolder.Move (objSubFolder.path & "\2016\" & MonthName(Month(FileInFolder.DateCreated)) & "\")
        End If

    Next FileInFolder
Next objSubFolder

End Sub

但是,如果文件夹的结构是动态的,那么提出@luke_t的方法会更合适。

答案 1 :(得分:4)

我建议使用递归函数来获取文件夹结构的底层。

以下功能将从提供的文件夹中遍历所有子文件夹。

一旦函数到达文件夹结构的底层,它就会开始遍历每个文件,如果需要移动(提供您输入代码来执行此任务,我在下面的示例中放置了注释) )。

  

您需要启用Microsoft Scripting Runtime参考(VBE - >工具 - >参考)

Option Explicit

Public Sub move_documents()

    Dim fSystem As Scripting.FileSystemObject
    Dim fp As String

    Set fSystem = New Scripting.FileSystemObject
    fp = "C:\xyz" ' Enter your folder start location

    find_folders fSystem.GetFolder(fp)

End Sub

Private Function find_folders(ByVal fldr As Folder)

    Dim sf As Folder

    For Each sf In fldr.SubFolders
        find_folders sf, ws
    Next

    ' Enter function or code to move each file in a folder here.

End Function