アクセスでファイル選択ダイアログを使う(実行時バインドでっせ)

#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で動かしてみたら動かない!てなことがあります。この原因は、利用したいライブラリが、プログラミングしたときに設定したバージョンと異なっているからです。

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

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

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

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

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

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

「標準モジュールを作成」を選択したところ

リボンから「マクロ」→標準モジュールを選択してください

Option Compare Database
Option Explicit

Function FileSelect()

Dim Dlg As Object
Dim inttype As Integer
Dim varSelectedFile As Variant

On Error GoTo ErrorHandler  'エラー処理ルーチンを実行します。

'ファイルを選択する場合は、msofiledialogfilepicker → 3
inttype = 3

Set Dlg = Application.FileDialog(inttype)

'ファイル参照用の設定値をセットします。
With Dlg

     'ダイアログタイトル名
     .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 varSelectedFile In .SelectedItems
             FileSelect = varSelectedFile
         Next
     End If
End With
Exit Function

ErrorHandler:

     MsgBox "予期せぬエラーが発生しました" & Chr(13) & _
             "エラーナンバー:" & Err.Number & Chr(13) & _
             "エラー内容:" & Err.Description, vbOKOnly
     Exit Function
End Function

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

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

コメントをどうぞ!