アクセスでプログラムを作ったことがある人は、一度はこう思ったことがあるはずです。
アクセスには、ファイルを開くダイアログが無いのか!
そうなんです。アクセスにはエクセルで用意されているような、ファイルを選択するダイアログ「GetOpenFilename」に相当する関数はありません。
ネットで検索すると、エクセルの「GetOpenFilename」をアクセスで使ったり、Officeオブジェクトのファイル選択ダイアログを使うという方法がヒットします。
これらは、VBAの[ツール]-[参照設定]から「Microsoft Excel 12.0 Object Library」や「Microsoft Office 12.0 Object Library」にチェックを入れておく必要があります。
この、あらかじめ参照設定しておくことを、事前バインディングといいます。
また、「Microsoft Excel 12.0 Object Library」などの外部プログラムを「ライブラリ」といいます。
事前バインディングするメリットは、実行速度が早くなるそうです。というのも体感するほどの差はないと思うのですが。
コードを入力するユーザーのメリットとしては、コードを入力するときに、VBAエディタが次の候補を示してくれる機能(入力支援機能)が使えることでしょうか。
逆に、デメリットは参照するライブラリのバージョンが異なっていると、動かなくなってしまうことがあります。
たとえばAccess2002のPCで作成したアクセスVBAを、Access2013のPCで動かしてみたら動かない!てなことがあります。この原因は、利用したいライブラリが、プログラミングしたときに設定したバージョンと異なっているからです。
これを解消するには、実行するたびに最新のライブラリを参照するようにすれば良いのです。これを実行時バインディング(遅延バインディング)といいます。
このように、実行時バインディングはバージョンの差を吸収してくれますが、もちろんデメリットもあります。
構文チェックが行われないので、エラーが出ると原因を把握するまで時間がかかることがあります。
このようなデメリットを理解したうえで、以下のコードを使用すると、参照設定なしでファイル選択ダイアログを使用することができます。
以下のコードを、標準モジュールに記述してください。
Function FileSelect() As String Dim varTgtFleNM As Variant On Error GoTo ErrHNDL 'エラー処理を宣言します。エラーが生じたら ErrHNDL 部分へ飛びます。 'ファイル参照用の設定値をセットします。 'ファイルを選択する場合は、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 ErrHNDL: MsgBox Err.Number & vbCrLf & Err.Description Exit Function End Function
コードを実行すると、このようにファイル選択ダイアログが出現します。
コメントをどうぞ!