今回は指定したフォルダ内のファイルをすべて開く方法をご説明します。
ネットワーク上のフォルダにも対応した記述となっており、ファイル名は指定せずフォルダのみを指定して同一フォルダ内のファイルを、すべて開きたい場合に便利な方法です。
コード内でフォルダのパスを指定する方法と、ダイアログボックスでフォルダを指定してもらう方法の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
ダイアログボックスを使用することで、毎回コードを書き換える必要もなく、フォルダ内のファイルを開いて処理をする事が可能ですので、ぜひ覚えてみてください。