Excel VBA 指定したフォルダ内のファイルをすべて開く

ファイル/フォルダ操作

今回は指定したフォルダ内のファイルをすべて開く方法をご説明します。

ネットワーク上のフォルダにも対応した記述となっており、ファイル名は指定せずフォルダのみを指定して同一フォルダ内のファイルを、すべて開きたい場合に便利な方法です。

コード内でフォルダのパスを指定する方法と、ダイアログボックスでフォルダを指定してもらう方法の2つをご説明します。

ダイアログボックスを使用すると、決まったフォルダ意外にも対応出来ます。

また、別のファイルを開く方法はこちらをご覧ください。

1.フォルダ名を直接指定して開く

指定したフォルダ内のファイルを開く場合は、指定したフォルダをカレントフォルダに指定します。

そうする事で、簡単にそのフォルダ内のファイルを指定する事ができます。

フォルダを直接指定する方法

まずはフォルダ名(パス)をコードで直接指定する方法です。

フォルダを指定するには「CreateObject(“WScript.Shell”)」で指定します。

本来カレントフォルダの指定は「ChDirプロパティ」を使用しますが、共有ネットワーク上のフォルダに対応できるように「CreateObject(“WScript.Shell”)」を使用しています。(個人の好みです)

Sub Sample1()

With CreateObject("WScript.Shell")
    
    .CurrentDirectory = "C:\Sample\"
    
End With

End Sub

フォルダ内のファイルをすべて開く

フォルダの指定はできましたので、次は指定されたフォルダ内のファイルをすべて開く方法です。

Sub Sample2()

Dim Filename    As String
Dim IsBookOpen  As Boolean
Dim OpenBook    As Workbook

With CreateObject("WScript.Shell")
    
    .CurrentDirectory = "C:\Sample\"
    
End With

Filename = Dir("*.xlsx")
     
Do While Filename <> "" 'フォルダ内のファイルをループ
    
    If Filename <> ThisWorkbook.Name Then 'VBAの書かれた自身のファイルか判定
    
        IsBookOpen = False
        
        For Each OpenBook In Workbooks 'Excelのブックをループ
                    
            If OpenBook.Name = Filename Then
            
                IsBookOpen = True
                
                Exit For
                
            End If
            
        Next
        
        If IsBookOpen = False Then
                          
            Workbooks.Open (Filename), UpdateLinks:=1
                                   
        End If
        
    End If
    
    Filename = Dir()
    
Loop

End Sub
コードの説明

フォルダをカレントフォルダに指定する方法は上記の「With CreateObject(“WScript.Shell”)」で指定した通りです。

Filename = Dir(“*.xlsx”)」でファイル名にワイルドカードを使用して、「Dir関数」でファイル名を指定します。

この時「Filename = Dir(“*”)」とすることで、すべての拡張子に対応します。

「Do While Filename <> “”」で指定したフォルダ内のファイルを一巡するまでループします。

If Filename <> ThisWorkbook.Name Then」で同じマクロの書かれたファイル名と同じファイルを開くとエラーになるため、判定しています。

すでに開いているブックコレクションをループして、開こうとしているファイル名と同じファイルが無ければ、最後にファイルを開きます。

2.ダイアログでフォルダを指定する

次はダイアログボックスを開いて、フォルダを指定する方法です。

先程の直接指定する方法と考え方はおなじです。

そのカレントフォルダに指定したいパスをダイアログボックスで取得します。

まずはダイアログボックスの使い方を簡単に説明したいと思います。

FileDialogの使い方

ダイアログボックスの表示は「FileDialog」を使用します。

Application.FileDialog(処理方法).Showと書きます。

処理方法には4つの方法があり、次の通りです。

処理方法コード
ファイル選択msoFileDialogFilePicker
フォルダ選択msoFileDialogFolderPicker
ファイルを開くmsoFileDialogFileOpen
ファイルを保存msoFileDialogFileSaveAs

フォルダの操作は「msoFileDialogFolderPicker」を使用します。

次のコードでフォルダ指定のダイアログが開きます。

Sub Sample3()

Application.FileDialog(msoFileDialogFolderPicker).Show

End Sub

選択したフォルダパスを取得するには、「SelectedItemsプロパティ」を使用します。

SelectedItems(インデックス番号)で指定します。

また、今回はフォルダを1つしか選択しない想定で、「SelectedItems(1)」とします。

Sub Sample4()

Dim myFolder As String

'ダイアログボックスを表示
Application.FileDialog(msoFileDialogFolderPicker).Show

'指定されたフォルダを取得
myFolder = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)

MsgBox myFolder

End Sub

FileDialogのキャンセル処理

キャンセルや「×」ボタンでダイアログを閉じられた場合、エラーとなりますので、エラー処理も組み込みます。

Showメソッド」でキャンセルを押した際の戻り値が「0」なので、こちらで判定します。

Application.FileDialog(msoFileDialogFolderPicker)」は長いので「With」で括ると、コードがすっきりします。

Sub Sample5()

Dim myFolder As Variant

With Application.FileDialog(msoFileDialogFolderPicker)

    If .Show <> 0 Then
    
        myFolder = .SelectedItems(1)
    
    End If

End With

MsgBox myFolder

End Sub

指定されたフォルダ内のファイルを全て開く

FileDialogでフォルダを指定出来たら、次はフォルダ内のファイルを全て開きます。

ここのロジックは「Sample2」のコードのファイルを開く部分と同じです。

Sub Sample6()

Dim Filename    As String
Dim IsBookOpen  As Boolean
Dim OpenBook    As Workbook
Dim myFolder As Variant

With Application.FileDialog(msoFileDialogFolderPicker)

    If .Show <> 0 Then
    
        myFolder = .SelectedItems(1)
    
    End If

End With

With CreateObject("WScript.Shell")
    
    .CurrentDirectory = myFolder
    
End With

Filename = Dir("*.xlsx")
     
Do While Filename <> ""
    
    If Filename <> ThisWorkbook.Name Then
    
        IsBookOpen = False
        
        For Each OpenBook In Workbooks
                    
            If OpenBook.Name = Filename Then
            
                IsBookOpen = True
                
                Exit For
                
            End If
            
        Next
        
        If IsBookOpen = False Then
                          
            Workbooks.Open (Filename), UpdateLinks:=1
                                   
        End If
        
    End If
    
    Filename = Dir()
    
Loop

End Sub

ダイアログボックスを使用することで、毎回コードを書き換える必要もなく、フォルダ内のファイルを開いて処理をする事が可能ですので、ぜひ覚えてみてください。

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