ファビコン。井の家紋。フォルダ参照-フォルダ選択ダイアログ | エクセルマクロ(VBA)実践蔵(じっせんぐら)

前の項目 - ファイル参照-ファイル選択ダイアログ
次の項目 - フォルダ内のファイル名取得(ファイル名一覧の作成)

フォルダ参照-フォルダ選択ダイアログ最終更新日:2023-05-22

このページの目次になります。


フォルダ参照は、入力データを指定するために使用する場合と、出力フォルダとして使用する場合に分けられますが、一番単純なケースから考えると共通処理となりますので、ひとまず、一番単純なケースでのご紹介をしようと思います。

フォルダ参照ダイアログを表示させよう

入力データの場合、指定フォルダ内のファイル名が固定の場合と、そうでない場合があると思います。

一番単純なケースは、ファイル名が固定の場合です。ひとまず、フォルダ名だけが取得できれば良い場合についてから触れていきたいと思います。

ファイル参照同様、参照したファイルやフォルダのパスが、エクセルシート側に必ず残ることで、取り込んだファイルやフォルダが明確になり、マクロの実行ログとして活用できます。

フォルダ参照(表面側)

①参照ボタンを押下する。
エクセルExcelマクロVBA フォルダ参照(表面側)

②フォルダを選択する。
エクセルExcelマクロVBA フォルダ参照(ダイアログ)

③フォルダパスがエクセルのセルに格納される。

フォルダ参照(コード)

シート側のマクロ。参照ボタンをクリックしたときに動作するマクロとして、下記関数を登録しておきます。

 
Sub 参照_Click()

Dim FolderName As String

'フォルダ選択ダイアログの呼び出し
FolderName = GetDirectory

If FolderName <> "Cancel" Then

'フォルダが選択された場合
Range("B3").Value = FolderName

End If

End Sub

ボタン押下時のマクロ登録方法は、こちら

上記で呼び出しているGetDirectoryという関数は、標準関数ではないため、このままでは、まだ、動作できません。このGetDirectoryという関数を標準モジュールに追加します。

標準モジュールオブジェクトの追加方法は、こちら

標準モジュール側のマクロ。

 
'**************************************
'
' フォルダ選択ダイアログの呼び出し
'
'**************************************
Function GetDirectory() As String

'フォルダ選択ダイアログの呼び出し
With Application.FileDialog(msoFileDialogFolderPicker)

If .Show = True Then
'選択されたとき
GetDirectory = .SelectedItems(1)
Else
'キャンセルされたとき
GetDirectory = "Cancel"
End If

End With

End Function

別のマクロでも再利用できる可能性のある処理は、関数として、標準モジュールに切り出しておくと、インポート/エクスポート機能がついているため、使いまわすのに便利です。

一番ベースになる部分です。余分な処理を削りました。2023/5 追記

ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。

マクロの有効化手順については、こちらも参考にしてください。

フォルダ参照(一番単純なケース) エクセルファイル(xlsm)のダウンロード

入力ファイル名をマクロで取得したい場合のおすすめ

次に、ファイル名が固定でない場合について考えていきたいと思います。

フォルダ内でアクセス対象とするファイル形式で縛っていくことを考えます。

①参照ボタンを押下する。
 ②フォルダを選択する。
 ※ここまでは、上部で記載済み。

③対象ファイルのセルをクリックする。対象ファイルの変更には、入力規則のリストを使用しています。
エクセルExcelマクロVBA フォルダ参照(対象ファイル選択)

上の図では、7行目~13行目が非表示になっており、再表示させると次の図のようになります。


エクセルExcelマクロVBA フォルダ参照(入力規則リスト)

入力規則のリストに使用したテーブルが現れます。もちろん別シートでも構いません。セルの入力規則を使用することによって、対象ファイルの追加・削除がマクロを書けない人であっても、修正が可能になります。

そして、オブジェクトのリストボックスやコンボリストを使用するよりもマクロのコード量は少なく済みます。

選択したファイル形式に沿ってファイル名を抽出する方法は、下記の項目に続きます。

フォルダ内のファイル名取得につづく

出力ファイル名が固定の場合のおすすめ

ファイル名を固定できる場合、ファイル名をセルから指定できるようするのがおすすめです。

入力ファイル名が変動し、その名前に沿って出力ファイル名が決まる場合は、この限りではありません。

エクセルExcelマクロVBA フォルダ参照(出力時のファイル名指定)

出力フォルダ用の処理を作成するには、上記に載せた 参照_Click() 内コードをすべてコピーして、別モジュール名をつけ、Range("B3").Value の "B3" の部分を、"B14"に変更し、ボタンに登録するマクロとして新しく作成したモジュールを設定します。

エクセルマクロ有効ブックのダウンロード

ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。

マクロの有効化手順については、こちらも参考にしてください。

フォルダ参照 エクセルファイル(xlsm)のダウンロード

フォルダ選択ダイアログが開く、初期フォルダの設定

ファイル選択同様、このままでは、フォルダ選択ダイアログを開くときの初期フォルダは、PCの環境に依存します。主にCドライブのトップや、ドキュメントフォルダが初期フォルダとして開かれます。上記のままでも、エクセルを開いてから一度フォルダ選択ダイアログからフォルダを選択後に、再度、フォルダ選択ダイアログを呼び出す場合は、前回選択したフォルダの親フォルダが初期フォルダとして開かれます。

そのため、エクセルを開いて始めに呼び出されるフォルダ選択ダイアログに対して、初期フォルダを指定したい場合に限り、追加処置が必要になります。前回マクロを実行したときのフォルダパスがセルに残されていた場合に、そのパスを使用し、フォルダ選択ダイアログを開くときの初期フォルダに設定したいと思います。このとき、ネットワーク上のドライブや外付けドライブであっても、初回フォルダに設定できることを確認しました。

シートオブジェクト(Editorのシート側)のコードを変更します。GetDirectory() の引数に初期フォルダを追加します。

シートオブジェクト側のコード

 
Sub 参照_Click()

Dim FolderName As String

'フォルダ選択ダイアログの呼び出し
FolderName = GetDirectory(Range("B3").Value)

If FolderName <> "Cancel" Then

'フォルダが選択された場合
Range("B3").Value = FolderName

End If

End Sub

標準モジュール側のコード

 
'**************************************
'
' フォルダ選択ダイアログの呼び出し
' 引数:initDir 初期フォルダ 空の場合は、
' カレントディレクトリを開く
'
'**************************************
Function GetDirectory(initDir As String) As String


'フォルダ選択ダイアログの呼び出し
With Application.FileDialog(msoFileDialogFolderPicker)

If Not initDir = "" Then '設定ありの場合
.InitialFileName = initDir
Else

.InitialFileName = CurDir
End If

If .Show = True Then
'選択されたとき
GetDirectory = .SelectedItems(1)
Else
'キャンセルされたとき
GetDirectory = "Cancel"
End If

End With

End Function

FileDialogの「.InitialFileName」にPC上に存在しないドライブが指定された場合、初期設定は無視されます。途中までが存在するパスの場合は、存在するパスの最深フォルダが適用されます。

エクセルマクロ有効ブックのダウンロード

ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。

マクロの有効化手順については、こちらも参考にしてください。

フォルダ参照(初回フォルダ指定) エクセルファイル(xlsm)のダウンロード

前の項目 - ファイル参照-ファイル選択ダイアログ
次の項目 - フォルダ内のファイル名取得(ファイル名一覧の作成)