エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを開く

dialog

photo credit: Bundes Jugend Vertretung 156-IMG_4170 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでファイルやフォルダを操作する方法についてお伝えしています。

前回の記事はコチラ。

エクセルVBAでDir関数を使って指定のファイルが存在するかどうかを判定する方法
エクセルVBAでファイルを開く作業を自動化する方法についてのシリーズ。今回は開くファイルの指定をエクセルシートに変更し、またファイルが存在するかどうかをDir関数で判定する方法についてお伝えします。

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」はこちらです。

VBAで開くファイルをエクセルシートにリスト

上記プログラムですと、ファイルが存在していない場合は「ファイル~が存在しません」と表示するだけです。

ですが、目的のファイルが存在していなければ、その時に正しいものを指定してもらえれば良いですよね?

ということで、こんな処理にしていきます。

  1. 存在していないファイルが記載されていれば、ファイル選択ダイアログを開いて正しいファイルを選択してもらう
  2. 正しいファイルのフルパスをシートに上書きする
  3. その上で全てのファイルを開く

だいぶ気の利いたプログラムになりますでしょ?

FileDialogオブジェクトでファイル選択ダイアログを開く

では早速、ファイル選択ダイアログを開く方法について解説をしていきます。その場合には、その名もFileDialogオブジェクトを使います。

書き方はこうです。

Application.FileDialog(ダイアログタイプ)

ダイアログタイプにはいくつか種類がありますので、以下定数のうちいずれかを指定します。

定数 内容
msoFileDialogFilePicker ファイル選択
msoFileDialogFolderPicker フォルダ選択
msoFileDialogOpen ファイルを開く
msoFileDialogSaveAs ファイルを保存

今回は、ファイル選択を使いますので、msoFileDialogFilePickerですね。

ShowメソッドでFileDialogオブジェクトを表示する

FileDialogオブジェクトを実際に表示するときはShowメソッドを使います。

このように書きます。

FileDialogオブジェクト.Show

例えば、With~End Withを使って

With Application.FileDialog(msoFileDialogFilePicker)
     .Show
End With

とすればファイル選択ダイアログを表示させることができます。

SelectedItemsプロパティでダイアログで選択したファイルのパスを取得

ユーザーが選択したファイルのパスを取得する必要がありますね。

FileDialogオブジェクトでユーザーが選択したファイルのパスを取得するには、SelectedItemsプロパティを使います。

書き方はこうです。

FileDialogオブジェクト.SelectedItems

ファイルの選択は複数可能である場合もありますので、ファイルパスはコレクションとして取得する形となりますから、その場合はインデックス番号を指定して

FileDialogオブジェクト.SelectedItems(インデックス番号)

とすれば指定したインデックス番号のファイルパスを取得することができます。

今回の場合、複数ファイルを選択することはありませんから、1番目のインデックスになります。つまりプログラムとしては

With Application.FileDialog(msoFileDialogFilePicker)
  .Show
  strPath = .SelectedItems(1)
End With

とすれば、strPathに目的のファイルパスを取得することができるというわけです。

AllowMultiSelectプロパティで複数ファイル選択を制限する

前述の通り、ファイル選択ダイアログでは複数ファイルを取得できてしまいます。

しかし、今回の場合は複数ファイルを選択されてしまうと困りますので、それができないように制限をかけてしまいましょう。

FileDialogオブジェクトで複数ファイル選択をさせるかどうかは、AllowMultiSelectプロパティでコントロールできます。

FileDialogオブジェクト.AllowMultiSelect = True または False

Trueであれば複数ファイルが選択可能になりますので、逆に制限をかけたければプロパティをFalseに設定をすればよいのです。

Titleプロパティでダイアログのタイトルを設定する

もう一つ、よく使うプロパティとしてTitleプロパティがあります。

FileDialogオブジェクトで表示させるダイアログのタイトルを設定することができます。

FileDialogオブジェクト.Title = 文字列

ファイルが存在しない場合にファイル選択ダイアログを表示するプログラム

では、ここまでの内容を踏まえて、プログラムを修正してみましょう。

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オブジェクトに関する部分ですね。

実行結果

このプログラムを実行してみます。

存在していないファイルがあれば、ファイル選択ダイアログが開きます。

エクセルVBAでファイル選択ダイアログを開く

Titleプロパティで指定した通り、ダイアログのタイトルも変更されていますね。

正しいファイルを選択すると

エクセルVBAで正しいファイルのパスに上書き

このようにシートの情報も更新されます。二つ目のDo While~Loopに入ったところで、他のファイルとともに開かれます。

まとめ

エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを表示させる方法についてお伝えしました。

FileDialogオブジェクトとその主なメソッド、プロパティについてお伝えしましたが、他にもたくさんの活用法がありますので、機会をみて紹介しますね。

次回はちょっと別のDir関数の使い方、ファイル一覧の取得方法についてお伝えします。

エクセルVBAでフォルダ内のファイル一覧を表示するDir関数の使い方
エクセルVBAでファイルを開く作業を自動化する方法についてお伝えしています。今回はエクセルVBAでフォルダ内のファイル一覧を出力するDir関数の使い方です。ワイルドカード一つで便利に使えます。

どうぞお楽しみに!

連載目次:エクセルVBAでファイルやフォルダを操作する方法

お仕事でいつも決まったファイルをいつも一つずつダブルクリックして開くの…毎日だと思うと面倒ですよね。 このシリーズでは、ファイルを自動で開く、フォルダ一覧を出力するなど、エクセルVBAでファイルやフォルダを操作する方法についてお伝えしていきます。
  1. エクセルVBAでブックを開いたときに他のワークブックも一緒に自動で開く
  2. エクセルVBAでエクセル以外の他のアプリケーションを開く方法
  3. エクセルVBAでDir関数を使って指定のファイルが存在するかどうかを判定する方法
  4. エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを開く
  5. エクセルVBAでフォルダ内のファイル一覧を表示するDir関数の使い方
  6. エクセルVBAでDir関数を使ってフォルダ一覧を表示する方法
タイトルとURLをコピーしました