みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでファイルやフォルダを操作する方法についてお伝えしています。
前回の記事はコチラ。
Dir関数を使って指定したファイルの有無を確認する方法についてお伝えしました。
それで、指定のファイルがなかった場合には「ファイルが存在しません」というメッセージを表示するのみだったのですが、その場合のちょっと気の利いた機能として、ファイル選択ダイアログで正しいファイルを選択させてあげたいと思います。
ということで今回は、エクセルVBAでファイル選択ダイアログを表示させる方法です。
前回のおさらい
前回まででできあがったプログラムはこちらです。
Sub Auto_Open()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim shell As Object: Set shell = CreateObject("Shell.Application")
Dim i As Long
i = 2
Do While ws.Cells(i, 1).Value <> ""
If Dir(ws.Cells(i, 2).Value) <> "" Then
shell.ShellExecute ws.Cells(i, 2).Value
Else
MsgBox "ファイル " & ws.Cells(i, 2).Value & " が存在しません", vbInformation
End If
i = i + 1
Loop
End Sub
Auto_Openイベントプロシージャですから、このファイルを開いたら自動で動作しまして、「Sheet1」にリストされているファイルのパスを見て、そのファイルが存在していれば、該当のファイルを開いていくという処理です。
そのファイルの存在するかどうかの判定は9行目、Dir関数を使っています。
そのファイルのパスをリストしている「Sheet1」はこちらです。
上記プログラムですと、ファイルが存在していない場合は「ファイル~が存在しません」と表示するだけです。
ですが、目的のファイルが存在していなければ、その時に正しいものを指定してもらえれば良いですよね?
ということで、こんな処理にしていきます。
- 存在していないファイルが記載されていれば、ファイル選択ダイアログを開いて正しいファイルを選択してもらう
- 正しいファイルのフルパスをシートに上書きする
- その上で全てのファイルを開く
だいぶ気の利いたプログラムになりますでしょ?
FileDialogオブジェクトでファイル選択ダイアログを開く
では早速、ファイル選択ダイアログを開く方法について解説をしていきます。その場合には、その名もFileDialogオブジェクトを使います。
書き方はこうです。
ダイアログタイプにはいくつか種類がありますので、以下定数のうちいずれかを指定します。
定数 | 内容 |
---|---|
msoFileDialogFilePicker | ファイル選択 |
msoFileDialogFolderPicker | フォルダ選択 |
msoFileDialogOpen | ファイルを開く |
msoFileDialogSaveAs | ファイルを保存 |
今回は、ファイル選択を使いますので、msoFileDialogFilePickerですね。
ShowメソッドでFileDialogオブジェクトを表示する
FileDialogオブジェクトを実際に表示するときはShowメソッドを使います。
このように書きます。
例えば、With~End Withを使って
With Application.FileDialog(msoFileDialogFilePicker)
.Show
End With
とすればファイル選択ダイアログを表示させることができます。
SelectedItemsプロパティでダイアログで選択したファイルのパスを取得
ユーザーが選択したファイルのパスを取得する必要がありますね。
FileDialogオブジェクトでユーザーが選択したファイルのパスを取得するには、SelectedItemsプロパティを使います。
書き方はこうです。
ファイルの選択は複数可能である場合もありますので、ファイルパスはコレクションとして取得する形となりますから、その場合はインデックス番号を指定して
とすれば指定したインデックス番号のファイルパスを取得することができます。
今回の場合、複数ファイルを選択することはありませんから、1番目のインデックスになります。つまりプログラムとしては
With Application.FileDialog(msoFileDialogFilePicker)
.Show
strPath = .SelectedItems(1)
End With
とすれば、strPathに目的のファイルパスを取得することができるというわけです。
AllowMultiSelectプロパティで複数ファイル選択を制限する
前述の通り、ファイル選択ダイアログでは複数ファイルを取得できてしまいます。
しかし、今回の場合は複数ファイルを選択されてしまうと困りますので、それができないように制限をかけてしまいましょう。
FileDialogオブジェクトで複数ファイル選択をさせるかどうかは、AllowMultiSelectプロパティでコントロールできます。
Trueであれば複数ファイルが選択可能になりますので、逆に制限をかけたければプロパティをFalseに設定をすればよいのです。
Titleプロパティでダイアログのタイトルを設定する
もう一つ、よく使うプロパティとしてTitleプロパティがあります。
FileDialogオブジェクトで表示させるダイアログのタイトルを設定することができます。
ファイルが存在しない場合にファイル選択ダイアログを表示するプログラム
では、ここまでの内容を踏まえて、プログラムを修正してみましょう。
Sub Auto_Open()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim shell As Object: Set shell = CreateObject("Shell.Application")
Dim strPath As String 'ファイルパス
Dim i As Long
i = 2
Do While ws.Cells(i, 1).Value <> ""
If Dir(ws.Cells(i, 2).Value) = "" Then
With Application.FileDialog(msoFileDialogFilePicker) 'FileDialogオブジェクト
.Title = ws.Cells(i, 1).Value & "のファイルを選択してください" '表示するテキスト
.AllowMultiSelect = False '複数ファイルを選択させない
.Show '表示
strPath = .SelectedItems(1) '選択したファイルのパス
End With
ws.Cells(i, 2).Value = strPath 'パスをシートに記載
End If
i = i + 1
Loop
i = 2
Do While ws.Cells(i, 1).Value <> ""
shell.ShellExecute ws.Cells(i, 2).Value
i = i + 1
Loop
End Sub
プログラムとして、前半でシート上のファイルパスの全てについて、ファイルが存在するかどうかをまず判定、クリーニングをしています。その上で後半で一気にファイルを開いています。
わざわざ二回のDo Whiel~Loopに分けている理由なのですが、いっぺんに行うとファイルダイアログ表示の処理をしている間に、ShellExecuteでファイルを開く処理が飛ばされてしまうことがあるので、安全を期して別ブロックでの処理としています。
11行目~16行目が今回お伝えしてきたFileDialogオブジェクトに関する部分ですね。
実行結果
このプログラムを実行してみます。
存在していないファイルがあれば、ファイル選択ダイアログが開きます。
Titleプロパティで指定した通り、ダイアログのタイトルも変更されていますね。
正しいファイルを選択すると
このようにシートの情報も更新されます。二つ目のDo While~Loopに入ったところで、他のファイルとともに開かれます。
まとめ
エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを表示させる方法についてお伝えしました。
FileDialogオブジェクトとその主なメソッド、プロパティについてお伝えしましたが、他にもたくさんの活用法がありますので、機会をみて紹介しますね。
次回はちょっと別のDir関数の使い方、ファイル一覧の取得方法についてお伝えします。
どうぞお楽しみに!