ACCESSにExcelやcsvファイルをインポートしたりエクスポートしたりする際、ファイルやフォルダをエクスプローラーで選択できると便利です。
今回は、エクスプローラーでファイルを選択する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。
結論:ファイル選択するにはOffice共通のFileDialogオブジェクトを使用する
ACCESSへExcelファイルやCSVファイルを取り込む際、ファイルやフォルダのパスを固定にしていることも多いのではないでしょうか。VBAの記述の中でファイルパスなどを固定で記載すると、PCを入れ替えた際やファイルの置き場所を変えた際に正常に動作しなくなってしまいます。
また、システムのメンテナンス性の観点でもVBAのどこにファイルパスが書かれているか分からなくなり、運用が煩雑になるリスクを含んでいます。
そこで、ACCESSでファイルやフォルダを選択する際にエクスプローラーを起動し、ユーザーが自身でファイルを選択できるようにしましょう。ACCESSでファイルやフォルダを選択させるには、Office共通の「FileDialogオブジェクト」を利用するのが最も確実で効率的です。

FileDialogオブジェクトとは
FileDialogオブジェクトを一言で言えば、Windows標準のエクスプローラー画面を、VBAから自由に呼び出して操作するためのツールです。
Access専用の機能ではなく、ExcelやWordなど、Microsoft Office製品で共通して利用できるOfficeオブジェクトライブラリの一部として提供されています。そのため、一度使い方を覚えれば他のOfficeアプリの開発にも応用が利く、非常に汎用性の高い機能です。
FileDialogの構文
FileDialogは以下の構文で利用します。
Application.FileDialog(ダイアログ形式)
ダイアログ形式の部分に以下で説明する4つの形式のどれかを記述します。
4つのダイアログ形式
FileDialogオブジェクトには、用途に合わせて4つのタイプ(定数)が用意されています。
開発したい機能に合わせて、これらを切り替えて使用します。
| 定数名 | 役割 | 主な利用シーン |
| msoFileDialogFilePicker | ファイルを選択する | インポートするExcelやCSVを選ぶ |
| msoFileDialogFolderPicker | フォルダを選択する | 出力先の保存フォルダを指定する |
| msoFileDialogOpen | ファイルを開く | 選択したファイルをそのまま開く |
| msoFileDialogSaveAs | 名前を付けて保存 | ファイルに名前を付けて保存する |
ファイルを選択する際は、msoFileDialogFilePickerを利用します。
そのため、記述方法は
Application.FileDialog(msoFileDialogFilePicker)
となります。
FileDialogを利用する事前準備(参照設定)
ACCESSでFileDialogオブジェクトを使用するには、「参照設定」という事前準備が絶対に必要です。
参照設定を行わずにコードを書くと、「コンパイルエラー:ユーザー定義型は定義されていません」というエラーが出てしまい、動かすことすらできません。
参照設定とはACCESSの標準機能ではなく、WindowsやOfficeの機能を外部から参照して利用するためのライブラリを指定する設定です。
参照設定は以下の手順で行います。
VBE(VBAエディタ)を開く
まずはVisual Basic Editor(VBE)の画面を開きます。
ACCESSのメニューから「データベースツール」→「Visual Basic」を選択するか、Alt+F11キーを押します。

参照設定画面を開く
次にVBEの画面で参照設定画面を開きます。
「ツール」から「参照設定」を押します。

Microsoft Office XX.0 Object Libraryを追加する
参照設定画面で必要なライブラリを追加します。
今回はMicrosoft Office X.X Object Libraryを選択してください。

X.Xは数値が新しいものを選択すれば問題ありません。
これで参照設定は完了です。
エクスプローラーでファイルを選択する機能例
それでは、実際にFileDialogオブジェクトをを使ってエクスプローラーでファイルを選択する機能の例をご紹介します。
今回は以下のフォームを作成しました。

売上データ取り込みボタンを押すと、エクスプローラーが開いてファイルを選択するフォームです。
選択したファイルは、以下の売上データテーブルにインポートされます。

機能を作成するために、フォームの売上データ取り込みボタンにイベントプロシージャを設定します。
以下はデータ取り込みフォームをデザインビューで表示したものです。

設定するイベントプロシージャの内容は以下の通りです。
ここでは、ボタンを押した際に処理前のメッセージ表示などを行う売上データ取り込み_ボタン_Clickと、エクスプローラーからファイルパスを取得するget_file_nameの2つのイベントプロシージャを作成しています。
まず、ボタン押下時のイベントプロシージャです。
Private Sub 売上データ取り込み_ボタン_Click()
Dim file_name As String
If vbOK = MsgBox("売上データをExcelファイルから取り込みます。", vbInformation + vbOKCancel, "売上データ取り込み") Then
file_name = get_file_name("")
'入力キャンセル
If file_name = "" Then
MsgBox "入力がキャンセルされました。", vbInformation + vbOKOnly, "入力キャンセル"
Exit Sub
End If
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "売上データ", file_name, True
MsgBox "取り込みが完了しました。", vbInformation + vbOKOnly, "取り込み完了"
End If
End Sub
こちらでは、処理前のメッセージをMsgBoxで表示した後、
file_name = get_file_name("")
でもう一つのイベントプロシージャget_file_nameを呼び出し、結果を変数file_nameに格納しています。
その後の、
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "売上データ", file_name, True
の部分で選択したファイルをACCESSの売上データテーブルにインポートします。
では、もう一つのイベントプロシージャも見てみましょう。
Public Function get_file_name(tmp_file_path As String) As String
'■■■エクスプローラーからファイルパスを取得する■■■
With Application.FileDialog(msoFileDialogFilePicker)
'タイトルを設定
.Title = "ファイル選択"
'複数ファイル選択を禁止
.AllowMultiSelect = False
'ファイルの種類(拡張子)を指定
.Filters.Clear
.Filters.Add "Excelファイル", "*.xlsx; *.xls"
'ファイルの種類の初期値を設定
.FilterIndex = 1
'初期表示されるパスを引数で指定されたパスに指定
.InitialFileName = tmp_file_path
If .Show <> 0 Then
'ファイルが選択されたときはパスを返り値に設定
get_file_name = .SelectedItems(1)
Else
'ファイルが選択されなければ引数で指定されたパスを返す
get_file_name = tmp_file_path
End If
End With
End Function
こちらのイベントプロシージャはFunctionプロシージャで、エクスプローラーで選択したファイルのファイルパスを、get_file_nameという自身の名前の変数に格納して戻します。
その際に、この記事で説明したFileDialogオブジェクトが利用されています。
まず、
With Application.FileDialog(msoFileDialogFilePicker)
の部分でFileDialogオブジェクトをmsoFileDialogFilePickerを指定して利用開始します。
以降はWithステートメントによって、.(ドット)で始まるものはすべてApplication.FileDialog(msoFileDialogFilePicker)を対象としたプロパティ設定になります。
ダイアログのタイトルや、初期表示する拡張子、初期表示されるパスなどを設定していきます。
今回のプロシージャでは、引数にtmp_file_path As Stringを指定しており、初期表示されるパスはFunctionプロシージャの呼び出し時にユーザー側で指定できるようにしてあります。
プロパティ設定が完了したところで、
If .Show <> 0 Then
でダイアログボックスの表示と条件分岐を行います。
.Showメソッドは、ダイアログボックスを表示するメソッドです。
ここでダイアログボックスが表示された結果、「キャンセル」ボタンが押されると0が返され、それ以外のボタンが押されると-1が返されます。
今回のIf文では0出ない場合、つまりキャンセルされずにファイルが選択された場合という判定をしています。
'ファイルが選択されたときはパスを返り値に設定
get_file_name = .SelectedItems(1)
ファイルが選択された場合は、get_file_nameにその選択されたパスを代入して戻します。.SelectedItemsはユーザーが選択したファイルのパスを取得するプロパティです。
今回はファイルを1つの未選択しますので、.SelectedItems(1)として1つ目の選択されたファイルを指定しています。
このプロシージャを利用することで、エクスプーラーを起動し、選択されたファイルのパスをget_file_nameに変えることができます。
汎用的なプロシージャになっていますので、様々なACCESSファイルに組み込んで利用可能です。
ファイル選択機能を作成する際の注意点
ファイルを選択する際に注意すべき点がいくつかあります。
ファイルが選択されなかった場合のエラー処理
ダイアログボックスを表示しても、ユーザーがキャンセルしてファイルを選択しないというケースがあります。
こうした場合にエラーが出ないように考慮しておきましょう。
上記のget_file_nameでは、ファイルが選択されなかった場合は、もともと引数で指定したtmp_file_pathを変えるようにしています。
一方でPrivate Sub 売上データ取り込み_ボタン_Click()の方を見ると、
file_name = get_file_name("")
としてありますので、初期パスは空白””になっています。
この状態で後続処理である
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "売上データ", file_name, True
を実行すると、インポートファイルのパスが空白のためACCESSのエラーが出てしまいます。
これを防ぐために、file_nameが空白だった場合のエラー処理ルーチンを作成しました。
'入力キャンセル
If file_name = "" Then
MsgBox "入力がキャンセルされました。", vbInformation + vbOKOnly, "入力キャンセル"
Exit Sub
End If
の部分です。file_nameが空白だった場合は、メッセージを出してExit Subで処理を終了しています。
こうすることでファイル選択がキャンセルされた場合にもエラーを出さないようにできます。
こうした細やかなエラー回避処理がユーザーの利便性を高めるため、考慮しておきましょう。
初期表示される拡張子の設定
初期表示される拡張子の設定にも注意が必要です。
今回はExcelをインポートする機能を作っているため、ダイアログボックスで初期表示される拡張子もExcelに限定しています。
'ファイルの種類(拡張子)を指定
.Filters.Clear
.Filters.Add "Excelファイル", "*.xlsx; *.xls"
'ファイルの種類の初期値を設定
.FilterIndex = 1
拡張子の幅を広く設定しすぎると、ユーザーが誤ったファイルを選択する可能性が高まります。
そうすると、後続の処理でエラーが発生する原因にもなってしまいます。
ファイルの拡張子指定は適切なもののみとしておくことで、運用上の問題を減らすことが可能です。
まとめ:ファイル選択するにはFileDialogオブジェクトを利用
PCの入れ替えやファイルの置き場所の変更によるトラブルを未然に防ぎ、システムの信頼性を高めるために、FileDialogオブジェクトを使ってエクスプローラーでファイル選択できる機能を実装しておくことはとても有効です。
FileDialogオブジェクトは、以下の手順で利用できます。
1.参照設定でMicrosoft Office X.X Object Libraryを選択する
2.VBAでFileDialogオブジェクトに対して、プロパティ設定を行う
3.FileDialog(msoFileDialogFilePicker).Showでダイアログボックスを表示し、戻り値を後続処理に渡す
以上、エクスプローラーでファイルを選択する方法をご紹介しました。
この記事の内容を実際に試したい方へ
本記事の内容を実際にACCESSを動かしながら確認したいという方向けに、記事で紹介した機能が実装されたサンプルファイルを販売しています。記事内で解説しているテーブル、クエリ、フォーム、レポート、VBAのプロシージャなどをそのまま動く形で実装しました。
学習用としてはもちろん、加工して自社業務に利用することも可能です。
ご興味のある方は以下からご覧ください。

ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に300以上のACCESSデータベースの開発・修正実績のあるはこにわガジェット(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

最後までお読みいただき、ありがとうございました。
