フォルダ内のExcelファイルを処理する

指定フォルダ内のファイルを処理するサンプルです。
処理自体は後から書くことを想定したものなので、「★ここに処理を書く★」のあたりを変更して使ってください。
指定フォルダ直下のみ処理します(サブフォルダ配下は対象外)。

Sub フォルダ内のExcelファイルを処理する()

    Dim FSO As Object               'ファイルシステムオブジェクト
    Dim FolderPath As String        'ダイアログで指定されたフォルダパス
    Dim objFolder As Object         'フォルダオブジェクト
    Dim objFiles As Object          'ファイルオブジェクト
    Dim objF As Object              'ファイルオブジェクト用for文変数
    Dim FileCount As Long           '処理するファイル数
    Dim FilePaths()                 '処理するファイルパス(配列)
    Dim i As Long
    Dim xlsWorkbook As Workbook     '開いたExcelファイル
    
    Dim WSH As Variant              'WSH(Windows Scripting Host)
    Dim DefaultPath As String       'デスクトップパス
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set WSH = CreateObject("WScript.Shell")
    
    '--------------------------------------
    'フォルダと直下のファイルを取得
    '--------------------------------------
    'フォルダダイアログ
    DefaultPath = WSH.SpecialFolders("Desktop") & "\"   'デスクトップに指定
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = DefaultPath      'デフォルトフォルダをデスクトップにする
        If .Show = True Then
            FolderPath = .SelectedItems(1)
        End If
    End With
    'フォルダダイアログで「キャンセル」したので終了
    If FolderPath = "" Then Exit Sub
    'フォルダ取得
    Set objFolder = FSO.GetFolder(FolderPath)
    'ファイルが1つもない場合は終了
    If objFolder.Files.Count = 0 Then
        '終了メッセージ
        MsgBox "指定されたフォルダにはファイルが1つもないので、終了します。", _
            vbOKOnly + vbExclamation
        Exit Sub
    End If
    'ファイル取得
    Set objFiles = objFolder.Files
    
    '--------------------------------------
    'ファイルパスを取得
    '--------------------------------------
    '処理するファイル数の初期化
    FileCount = 0
    For Each objF In objFiles
        'Wordのファイルのみ処理
        If LCase(FSO.GetExtensionName(objF.Name)) = "xls" Or _
            LCase(FSO.GetExtensionName(objF.Name)) = "xlsx" Then
            'ファイルカウント
            FileCount = FileCount + 1
            'ファイルパスを取得するための動的配列を定義
            If FileCount = 1 Then
                ReDim FilePaths(FileCount)
            Else
                ReDim Preserve FilePaths(FileCount)
            End If
            'ファイルパスを配列に格納
            FilePaths(FileCount) = objF
        End If
    Next objF
    
    '処理対象のファイルが1つもない場合は終了
    If FileCount = 0 Then
        '終了メッセージ
        MsgBox "指定されたフォルダには処理対象となるファイルが1つもないので、終了します。", _
                vbOKOnly + vbExclamation
        Exit Sub
    End If
    
    '--------------------------------------
    'ファイルを開いて処理する
    '--------------------------------------
    For i = 1 To FileCount
        'ファイルを開く(読み取り専用)
        Workbooks.Open FilePaths(i), ReadOnly:=True
        Set xlsWorkbook = ActiveWorkbook
               
        '★ここに処理を書く★
        
        'ファイルを閉じる
        xlsWorkbook.Close SaveChanges:=xlDoNotSaveChanges
    Next i
    
    '--------------------------------------
    '終了
    '--------------------------------------
    'オブジェクトクリア
    Set FSO = Nothing
    Set objFolder = Nothing
    Set objFiles = Nothing
    Set objF = Nothing
    Set xlsWorkbook = Nothing
    Set WSH = Nothing
    
End Sub

・ファイルパスを配列に格納し、その後配列内をループして対象ファイルを処理する作りです。
・51-52行目 拡張子は xls と xlsx を処理しています。
・79行目 ReadOnly:=True で開いてますが、編集したいときは ReadOnly:=False で開いて、保存処理が必要になりますね。

タイトルとURLをコピーしました