再帰処理 

再帰処理 version1.0

フォルダ配下のサブフォルダもすべて対象にしたいときに使えるソース。
例としてフォルダとファイルの書き出しをしているソースを挙げる。
若干の制御も書いてるけど、不要なら削除して利用されたし。

'書き出し行
Dim writeRow As Integer
'ファイル操作オブジェクト
Dim objFSO As Object
'再帰処理フラグ(リカーシブ)
Dim recursiveFlag As Boolean
'比較日時
Dim conpareDate As Date
'再帰処理
Sub recursive()
    'トップフォルダパス
    Dim rootDirPath As String: rootDirPath = Cells(2, 2)
    '比較日時
    conpareDate = Cells(2, 3)
    '再帰処理をするかどうか
    recursiveFlag = True
    'ファイル操作オブジェクト設定
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    '書き出し行数
    writeRow = 4
    '初期化。CurrentRegionはそのセル位置でCtrl + Aをしたときの選択範囲。Offsetはそこからずらず行、ずらす列を指定できる
    Cells(writeRow, 1).CurrentRegion.Offset(0, 0).Clear
    '再帰処理の最初の呼び出し
    Call scanLoopWithFile(rootDirPath)
End Sub
'再帰処理のやり方
Function scanLoopWithFile(argDirPath As String)
    'フォルダ内の最初のファイル名を取得
    Dim currentFileName As String: currentFileName = Dir(argDirPath & "\*.*")
    
    Do While currentFileName <> ""
        'フォルダ&ファイル名書き出し
        Call writePath(argDirPath, currentFileName)
        '次のファイル名を取り出す(なければブランク)
        currentFileName = Dir()
    Loop
    
    If recursiveFlag Then
        'フォルダ内のサブフォルダを順に取得
        For Each directory In objFSO.getfolder(argDirPath).SubFolders
            '再帰処理
            Call scanLoopWithFile(directory.Path)
        Next
    End If
End Function
'ファイル情報を出力する
Function writePath(argDirPath As String, currentFileName As String)
    If Not isFutureThanUpdateDate(conpareDate, argDirPath & "\" & currentFileName) Then
        Exit Function
    End If
    
    Cells(writeRow, 1) = writeRow - 3
    Cells(writeRow, 2) = argDirPath
    Cells(writeRow, 3) = currentFileName
    Cells(writeRow, 4) = objFSO.getFile(argDirPath & "\" & currentFileName).DateLastModified
    writeRow = writeRow + 1
End Function
'指定された日時より指定されたファイルの最終更新日が未来ならTRUEを、過去ならFALSEを返す
Function isFutureThanUpdateDate(conditionUpdateDate As Date, filePath As String)
    If Not IsDate(conditionUpdateDate) Then
        isFutureThanUpdateDate = True
        Exit Function
    End If
    Dim fileUpdateDate As Date: fileUpdateDate = objFSO.getFile(filePath).DateLastModified
    '指定された日付よりファイルの更新時間が未来ならTRUEを、過去ならFALSEを返す
    isFutureThanUpdateDate = conditionUpdateDate <= fileUpdateDate
End Function


コメント