Как мне переместить папки старше 12 месяцев в другую папку архива в VBA?

#excel #vba

#excel #vba

Вопрос:

У меня более 1000 папок старше года, которые содержат различные файлы, такие как файлы Excel и .txt. Я хотел бы создать программу vba в Excel, которая могла бы перемещать эти папки в папку архива, но я не уверен, как написать это в Excel, поскольку у меня нет большого опыта в том, чтобы vba делал что-то за пределами Excel. Это то, что я нашел в Google, и это работает, но для этого требуется исходная папка, и мне просто нужно переместить папки внутри нее.

 Private Sub CommandButton1_Click()

   Dim objFileSystem As Object
    Dim SourceFolder As String
    Dim TargetFolder As String
    
    'Path of the folder where files are locted
    SourceFolder = "C:DesktopSource Folder"
    TargetFolder = "C:DesktopTarget Folder"
          
    Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    
    'Check if source and target folder exists
    If objFileSystem.FolderExists(SourceFolder) = True And objFileSystem.FolderExists(TargetFolder) = True Then
        objFileSystem.MoveFolder Source:=SourceFolder, Destination:=TargetFolder
        MsgBox "Source folder has moved to target folder"
    Else
        MsgBox "Either source or target folder does not exist"
    End If


End Sub
 

Комментарии:

1. Google для перебора папок и копирования / перемещения вложенных папок

Ответ №1:

Переместить вложенные папки

 Option Explicit

Private Sub CommandButton1_Click()
    
    Const SourceFolder As String = "C:DesktopSource Folder"
    Const TargetFolder As String = "C:DesktopTarget Folder"
    Dim Sep As String
    Sep = Application.PathSeparator
    Dim fdate As Long ' Account for leap year:
    fdate = Date - IIf(Day(Date) <> Day(Date - 365), 366, 365)
          
    With CreateObject("Scripting.FileSystemObject")
        If .FolderExists(SourceFolder) And .FolderExists(TargetFolder) Then
            Dim fsoFolder As Object
            Set fsoFolder = .GetFolder(SourceFolder)
            Dim fsoSubFolder As Object
            Dim n As Long
            For Each fsoSubFolder In fsoFolder.Subfolders
                If fsoSubFolder.DateCreated < fdate Then
                    n = n   1
                    .MoveFolder _
                      Source:=fsoSubFolder, _
                      Destination:=TargetFolder amp; Sep amp; fsoSubFolder.Name
                End If
            Next fsoSubFolder
            MsgBox "Moved " amp; n amp; " folder(s) to target folder"
        Else
            MsgBox "Either source or target folder does not exist"
        End If
    End With

End Sub
 

Комментарии:

1. Спасибо, что это сработало! есть ли какой-нибудь материал, который я мог бы прочитать в Интернете, который мог бы помочь мне на самом деле понять этот код построчно?

2. Начните отсюда File System Object . Также изучите другие объекты, показанные слева от страницы. Когда устанете или заскучаете, откройте новую рабочую книгу. В VBE включите Tools>References>Microsoft Scripting Runtime и в новом подразделе напишите : Dim fso As FileSystemObject : Set fso = New FileSystemObject и продолжайте, fso. и intellisense VBA покажет вам различные возможности.

3. Используя способ, описанный в комментарии, в решении, которое вы бы продолжили: If fso.FolderExists(SourceFolder) And fsoFolderExists(TargetFolder) Then ; Dim fsoFolder As Folder : Set fsoFolder = fso.GetFolder(SourceFolder) : Dim fsoSubFolder As Folder а позже измените только на fso.MoveFolder _ , и у вас будет более читаемая версия. Это вызывается early binding , в то время как в коде, который я использую late binding , что, среди прочего, означает, что нам не нужна ссылка на библиотеку. Конечно, вы не знакомы с этим, изучите «режим раннего связывания», чтобы ознакомиться с предметом.