VBAで自動化ツールを作成する場合に、ユーザーに成果物を保存する場所やファイル名をしてもらいたい場合があります。そんなときに便利なダイアログボックスを表示する、FileDialogオブジェクトを解説します。
なお、サンプルコードが一部横に長くなっており、スマホでの閲覧の場合はスマホを横にしてもらえると比較的快適にサンプルコードを閲覧することができると思います。
FileDialogオブジェクトでフォルダをユーザに選択させる
あるエクセル作業の後工程がさらなる加工の元データになっている場合などは、エラー回避の為に人の手を介さずに全自動にするのが良い場合があります。そのような場合は成果物の保存の際のファイル名も固定の文字列にDateSerial関数で加工した文字列などをフルパスにするなどの工夫が奏功します。
一方で、後工程が人による確認作業の場合は、ユーザーが自由に成果物の保存場所やファイル名を指定できる事が望ましい場合もあります。今回はこのような場合にユーザーにファイル名や保存先のフォルダを指定させるためのダイアログボックスが簡単に表示できるFileDialogオブジェクトを解説します。
FileDialogオブジェクトの文法
それではさっそくFileDialogオブジェクトの文法を見ていきましょう。書き方に入る前にそもそもオブジェクトとは何かを説明しておきます。オブジェクトが何かと言うことを理解しておくことは今回だけでなく、今後も様々な作業をプログラムをする中で非常に重要です。オブジェクトがわかっていないとただサンプルコードをコピペするしかできない人になってしまいます。
そもそもオブジェクトとは何か
オブジェクトはモノと言う意味ですが、ここではオブジェクトとは機能やデータを束ねた一塊のモノです。例えばエクセルにはワークシートというものがありますが、このシートの集まりを表すSheetsはオブジェクトです。SheetsにはAddという機能があります。Addという機能を使うとSheetsというワークシートの集まりに新たなワークシートを追加します。また、Deleteという機能を使うとSheetsというワークシートの集まりのうち、指定したワークシートを削除します。また、Sheets(1)のようにインデックス番号をつけることによって、ワークシートの集まりから特定のワークシートを指定することができます。この指定したワークシートに対して、Sheets(1)
.Tabには1番目のワークシートの名前を表す値が入っています。
上記の例で紹介したAddやDeleteと言ったオブジェクトに関する機能をメソッド、Tabの様にオブジェクトに関するデータを格納する部分をプロパティと言います。
このように、複数の機能やデータを束ねたものをオブジェクトと言います。そして、オブジェクト.メソッドやオブジェクト.プロパティの形でそのオブジェクトに関する機能やデータを取り出すことができるというのがオブジェクトの正しい使い方であり、理解です。
この部分は、クラスモジュールを理解する時に必要になりますので、頭に入れておきましょう。
FileDialogオブジェクトの書き方
オブジェクトの意味が分かったところで、本題のFileDialogオブジェクトの書き方についての解説に移ります。きちんとオブジェクトの意義が分かっていれば、Sheets.AddやSheets.Tab=”~~”と同じような感覚で身に着けることができます。しかし、FileDialogは同じ名前のプロパティとオブジェクトがあるので混乱しやすくなっています。この際、きっちり理解しておきましょう。
FileDialogオブジェクトの文法は以下のようになっています。
ApplicationというのはOfficeの各アプリケーションです。このブログではエクセルVBAについて解説しているので、今回はApplicationはエクセルのソフトそのものを指します。そして、そのエクセルが持っているFileDialogプロパティを使います。書き間違いではありません。FileDialogプロパティです。
つまり、エクセルと言うアプリケーション(=ソフト)が持っている、FileDialogと言う種類のデータに開きたいダイアログボックスの種類を設定すると、その種類のダイアログボックスが開くということです。
一番重要な概念のところの解説が終わりました。続けて具体的なコードを見ていきます。
フォルダを選択する|msoFileDialogFolderPicker
実際のサンプルコードを見ていく中で理解を深めていきましょう。まずはユーザーにフォルダを選択してもらうダイアログボックスを出す手順を順に説明していきます。
Sub フォルダ選択ダイアログボックスを表示する() Application.FileDialog(msoFileDialogFolderPicker).Show End Sub
上のサンプルコードを実行すると、ユーザーにフォルダを選択させるダイアログボックスが表示されます。FileDialogプロパティの引数にmsoFileDialogFolderPickerを渡しています。msoFileDialogFolderPickerはフォルダ選択ダイアログボックスを意味する定数です。
よって、Application.FileDialog(msoFileDialogFolderPicker)の部分がフォルダ選択ダイアログボックスのオブジェクトを意味します。あのダイアログボックスそのものだと思って構いません。.Showと書いてあるので、そのダイアログボックスを表示させなさいという意味です。
これではダイアログボックスを表示しただけなので、選択されたフォルダのパスを取得するように変更します。
Sub 選択されたフォルダのパスを取得する() Dim path As String Application.FileDialog(msoFileDialogFolderPicker).Show ' ダイアログボックスを表示する path = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) 'パスを代入する MsgBox "選択されたパスは" & path & "です。" End Sub
ユーザーが選択したフォルダのパスを代入するためにpathという変数を用意しました。パスを代入している行に記述されているSelectedItemsプロパティの引数に1と記述されていますが、この1についてはこのオブジェクトを使ってファイルを選択する時にのみ関係します。フォルダの選択の場合は必ず1しか使わないと思って構いません。Selectedは英語で選択された、と言う意味なのでSelectedItemsでユーザーが選択したフォルダを意味するということです。
これでユーザーが選択したフォルダのパスが取得できたので、あとはファイルを保存する時に使ったり自由に使えばよいということになります。
フォルダ選択プログラムのエラーをトラップする
フォルダ選択ダイアログボックスはユーザーが【キャンセル】ボタンや右上のバツボタンを押して閉じることができます。前項のプログラムではキャンセルやバツボタンが押されるとエラーとなります。このエラーへの対応を行っておきましょう。
実は.Showは戻り値を持つのでその値を調べることで条件分岐ができます*1。
パスが取得できなかった場合、Showメソッドは0を返します。一方、正しくパスが取得できた場合は-1を返します。これを踏まえてエラーをトラップすると以下のようになりま。
Sub エラー対策済みフォルダ選択() Dim path As String Dim n As Long n = Application.FileDialog(msoFileDialogFolderPicker).Show ' ダイアログボックスを表示する If n = 0 Then MsgBox "処理を中断します。" End Else path = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) 'パスを代入する End If MsgBox "選択されたパスは" & path & "です。" End Sub
フォルダ選択プログラムのブラッシュアップ
これで一通りの機能が実装できました。それにしてもApplication.FileDialog(msoFileDialogFolderPicker)の部分があまりに長いので、これを変数に代入することで見やすくします。
Sub 変数を使って見やすくする() Dim path As String Dim n As Long Dim fd As FileDialog ' fdはファイル・ダイアログの略 Set fd = Application.FileDialog(msoFileDialogFolderPicker) n = fd.Show If n = 0 Then MsgBox "処理を中止します。" End Else path = fd.SelectedItems(1) End If MsgBox "選択されたパスは" & path & "です。" End Sub
そして、共通するオブジェクトについては、With-End Withでまとめると見やすくなるととてもメンテナンス性が上がります。
Sub フォルダを選択させる最終形() Dim path As String Dim n As Long Dim fd As FileDialog ' fdはファイル・ダイアログの略 Set fd = Application.FileDialog(msoFileDialogFolderPicker) With fd n = .Show If n = 0 Then MsgBox "処理を中止します。" End Else path = .SelectedItems(1) End If End With MsgBox "選択されたパスは" & path & "です。" End Sub
公式ドキュメントや参考書はこのように順を追わずに最後のサンプルだけ見せるのでわかりにくなっていますが、この記事でより多くの人がオブジェクトの考え方とフォルダを選択させるFielDialogオブジェクトに親しんでいただければと思います。
<ゆんの電子書籍>
*1:クラスモジュールでオブジェクトを自作するとわかりますが、オブジェクトが持つ機能はSubプロシジャかFunctionプロシジャで実装されます。Functionプロシジャで実装した場合は戻り値を返すことができます。つまり、.ShowメソッドはFunctionプロシジャで記述された機能だったのです