参照設定を使用せずにアクセスでファイル選択ダイアログを使うには

この記事は約5分で読めます。

#Microsoft Access #VBA

アクセスでプログラムを作ったことがある人は、一度はこう思ったことがあるはずです。

アクセスには、ファイルを開くダイアログが無いのか!

そうなんです。アクセスにはエクセルで用意されているような、ファイルを選択するダイアログ「GetOpenFilename」に相当する関数はありません。

ネットで検索すると、エクセルの「GetOpenFilename」をアクセスで使ったり、Officeオブジェクトのファイル選択ダイアログを使うという方法がヒットします。

これらは、VBAの[ツール]-[参照設定]から「Microsoft Excel 12.0 Object Library」や「Microsoft Office 12.0 Object Library」にチェックを入れておく必要があります。

VBEの参照設定を選択するところ
VBEの参照設定を選択するところ
Microsoft Excel 12.0 Object Library
Microsoft Excel 12.0 Object Library
Microsoft Office 12.0 Object Library
Microsoft Office 12.0 Object Library

この、あらかじめ参照設定しておくことを、事前バインディングといいます。

また、「Microsoft Excel 12.0 Object Library」などの外部プログラムを「ライブラリ」といいます。

事前バインディングするメリットは、実行速度が早くなるそうです。というのも体感するほどの差はないと思うのですが。

コードを入力するユーザーのメリットとしては、コードを入力するときに、VBAエディタが次の候補を示してくれる機能(入力支援機能)が使えることでしょうか。

逆に、デメリットは参照するライブラリのバージョンが異なっていると、動かなくなってしまうことがあります。

たとえばAccess2002のPCで作成したアクセスVBAを、Access2013のPCで動かしてみたら動かない!てなことがあります。この原因は、利用したいライブラリが、プログラミングしたときに設定したバージョンと異なっているからです。

これを解消するには、実行するたびに最新のライブラリを参照するようにすれば良いのです。これを実行時バインディング(遅延バインディング)といいます。

このように、実行時バインディングはバージョンの差を吸収してくれますが、もちろんデメリットもあります。

構文チェックが行われないので、エラーが出ると原因を把握するまで時間がかかることがあります。

このようなデメリットを理解したうえで、以下のコードを使用すると、参照設定なしでファイル選択ダイアログを使用することができます。

使用される際は、そちらの環境で十分テストのうえ使用してください。

以下のコードを、標準モジュールに記述してください。

Function FileSelect()

Dim varTgtFleNM As Variant

On Error GoTo ErrorHandler  'エラー処理を宣言します。エラーが生じたら ErrorHandler 部分へ飛びます。

'ファイル参照用の設定値をセットします。
'ファイルを選択する場合は、msofiledialogfilepicker → 3(定数)
With Application.FileDialog(3)

     'ダイアログタイトル名
     .Title = "ファイルを選択してください"

     'ファイルの種類を定義します。
     .Filters.Add "HTML ファイル", "*.html"
     .Filters.Add "HTMファイル", "*.htm"
     .Filters.Add "すべてのファイル", "*.*"

     '複数ファイル選択を可能にする場合はTrue、不可の場合はFalse。
     .AllowMultiSelect = False

     '最初に開くホルダーを当ファイルのフォルダーとします。
     .InitialFileName = CurrentProject.Path & "\"

     If .Show = -1 Then 'ファイルが選択されれば -1 を返します。
         For Each varTgtFleNM In .SelectedItems
             FileSelect = varTgtFleNM
         Next
     End If
End With
Exit Function

ErrorHandler:

     MsgBox "予期せぬエラーが発生しました" & Chr(13) & _
             "エラーナンバー:" & Err.Number & Chr(13) & _
             "エラー内容:" & Err.Description, vbOKOnly
     Exit Function
End Function
「標準モジュールを作成」を選択したところ
リボンから「マクロ」→標準モジュールを選択してください

コードを実行すると、このようにファイル選択ダイアログが出現します。

ファイル選択ダイアログを起動させたところ

コメントをどうぞ!