このページの目次になります。
フォルダ参照は、入力データを指定するために使用する場合と、出力フォルダとして使用する場合に分けられますが、一番単純なケースから考えると共通処理となりますので、ひとまず、一番単純なケースでのご紹介をしようと思います。
入力データの場合、指定フォルダ内のファイル名が固定の場合と、そうでない場合があると思います。
一番単純なケースは、ファイル名が固定の場合です。ひとまず、フォルダ名だけが取得できれば良い場合についてから触れていきたいと思います。
ファイル参照同様、参照したファイルやフォルダのパスが、エクセルシート側に必ず残ることで、取り込んだファイルやフォルダが明確になり、マクロの実行ログとして活用できます。
①参照ボタンを押下する。
②フォルダを選択する。
③フォルダパスがエクセルのセルに格納される。
シート側のマクロ。参照ボタンをクリックしたときに動作するマクロとして、下記関数を登録しておきます。
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)のダウンロード
次に、ファイル名が固定でない場合について考えていきたいと思います。
フォルダ内でアクセス対象とするファイル形式で縛っていくことを考えます。
①参照ボタンを押下する。
②フォルダを選択する。
※ここまでは、上部で記載済み。
③対象ファイルのセルをクリックする。対象ファイルの変更には、入力規則のリストを使用しています。
上の図では、7行目~13行目が非表示になっており、再表示させると次の図のようになります。
入力規則のリストに使用したテーブルが現れます。もちろん別シートでも構いません。セルの入力規則を使用することによって、対象ファイルの追加・削除がマクロを書けない人であっても、修正が可能になります。
そして、オブジェクトのリストボックスやコンボリストを使用するよりもマクロのコード量は少なく済みます。
選択したファイル形式に沿ってファイル名を抽出する方法は、下記の項目に続きます。
ファイル名を固定できる場合、ファイル名をセルから指定できるようするのがおすすめです。
入力ファイル名が変動し、その名前に沿って出力ファイル名が決まる場合は、この限りではありません。
出力フォルダ用の処理を作成するには、上記に載せた 参照_Click() 内コードをすべてコピーして、別モジュール名をつけ、Range("B3").Value の "B3" の部分を、"B14"に変更し、ボタンに登録するマクロとして新しく作成したモジュールを設定します。
ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。
マクロの有効化手順については、こちらも参考にしてください。
ファイル選択同様、このままでは、フォルダ選択ダイアログを開くときの初期フォルダは、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上に存在しないドライブが指定された場合、初期設定は無視されます。途中までが存在するパスの場合は、存在するパスの最深フォルダが適用されます。
ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。
マクロの有効化手順については、こちらも参考にしてください。