我知道这个问题之前被问了很多次,我已经检查过以前的建议,但我无法让我的代码运行。
所以,我有一个名为“Report”的文件夹,其中也包含多个文件夹。这些文件夹包含.xlsx和.zip文件。
每个文件还包含一个名为“2016”的文件夹,在其下面有12个文件夹“January”,“February”,...,“December”。
我想要做的是,循环遍历所有这些子文件夹,并根据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
我想自动化我的宏,以便它可以在所有子文件夹上工作不是一个接一个并且每次都改变路径。 有什么建议吗?非常感谢你。
答案 0 :(得分:8)
与@luke_t和@Lowpar不同,我不认为递归循环,查看所有子文件夹和文件是正确答案,因为当你到达底部文件夹(即C:\Report\Shipment\2016\May\
)时,你会得到和移动已经在正确位置的文件。
由于你有固定的文件夹结构,你可以遍历主文件夹(.xlsx
)的每个子文件夹中的每个.zip
和C:\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