即効テクニック |
●概要● AccessではDevelopers Edition以外にはCommon Dialog Controlの開発ライセンスが付属していませんし、ExcelのGetOpenFileNameのようなAPIのラッパーも用意されていません。 仕方がないので、サンプルでAPIを直接操作して、コモンダイアログを表示する方法を説明します。 ●準備● 新規標準モジュールを作成し、以下のプロシージャを記述して下さい。 ●サンプルコード● '【API宣言部】 Public Declare Function GetOpenFileName _ Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" ( _ pOpenFileName As OPENFILENAME) As Long 'pOpenFileName構造体(ユーザー定義型)の宣言 Type OPENFILENAME lStructSize As Long '構造体のサイズ hwndOwner As Long 'ダイアログを所有 ' するウインドウハンドル hInstance As Long 'アプリケーションインスタンス lpstrFilter As String 'フィルタ lpstrCustomFilter As Long 'ユーザ定義フィルタ nMaxCustrFilter As Long 'ユーザ定義フィルタの ' バッファサイズ nFilterIndex As Long 'デフォルトフィルタのインデックス lpstrFile As String '選択されたファイル名 nMaxFile As Long 'ファイル名のバッファ lpstrFileTitle As String '選択されたファイル名のタイトル nMaxFileTitle As Long 'ファイル名のタイトルのバッファ lpstrInitialDir As String '初期ディレクトリ lpstrTitle As String 'ダイアログボックスのタイトル Flags As Long 'オプション nFileOffset As Integer 'ファイル名の最後の「\」までの ' オフセット値 nFileExtension As Integer '拡張子までのオフセット値 lpstrDefExt As String 'デフォルトの拡張子 lCustrData As Long 'OSがフック関数に渡すアプリ定義のデータ lpfnHook As Long 'メッセージを処理するフック関数 ' へのポインタ lpTemplateName As Long End Type '定数宣言 '複数のファイルを選択可能に Public Const OFN_ALLOWMULTISELECT = &H200 'ファイルが存在しなかった場合、新規作成するかどうか表示 Public Const OFN_CREATEPROMPT = &H2000 'エクスプローラ形式のダイアログを使用 Public Const OFN_EXPLORER = &H80000 '存在しないファイル名を入力不可に Public Const OFN_FILEMUSTEXIST = &H1000 '「読み取り専用」チェックボックスを非表示 Public Const OFN_HIDEREADONLY = &H4 'カレントディレクトリをダイアログのカレントディレクトリにする Public Const OFN_NOCHANGEDIR = &H8 Public Const OFN_NODEREFERENCELINKS = &H100000 'ネットワークコンピュータを非表示に Public Const OFN_NONETWORKBUTTON = &H20000 Public Const OFN_NOREADONLYRETURN = &H8000 Public Const OFN_NOVALIDATE = &H100 'ファイルが存在していた場合、上書きを問い合わせる Public Const OFN_OVERWRITEPROMPT = &H2 '有効なパス名のみを入力可能に Public Const OFN_PATHMUSTEXIST = &H800 '「読み取り専用」チェックボックスをオンにする Public Const OFN_READONLY = &H1 '「ヘルプ」ボタンの表示 Public Const OFN_SHOWHELP = &H10 '拡張子がデフォルトの拡張子と異なる場合に設定されるフラグ Public Const OFN_EXTENSIONDIFFERENT = &H400 '【機能】 ' コモンダイアログを表示し、選択ファイルのフルパスを取得 '【戻り値】 ' 選択したファイルのフルパス文字列 Public Function GetFileName() As String Dim pOpenFileName As OPENFILENAME Dim lngRet As Long 'Accessアプリケーションのハンドルを取得 pOpenFileName.hwndOwner = Application.hWndAccessApp pOpenFileName.hInstance = 0 'ファイルフィルタの設定 pOpenFileName.lpstrFilter = "全てのファイル (*.*)" & _ String(1, vbNullChar) & _ "*.*" & _ String(2, vbNullChar) pOpenFileName.lpstrCustomFilter = 0 pOpenFileName.nMaxCustrFilter = 0 pOpenFileName.nFilterIndex = 1 pOpenFileName.lpstrFile = String(511, vbNullChar) pOpenFileName.nMaxFile = 511 pOpenFileName.lpstrFileTitle = String(512, vbNullChar) pOpenFileName.nMaxFileTitle = 511 pOpenFileName.lpstrInitialDir = String(1, vbNullChar) pOpenFileName.lpstrTitle = String(1, vbNullChar) pOpenFileName.nFileOffset = 0 pOpenFileName.nFileExtension = 0 pOpenFileName.lpstrDefExt = String(1, vbNullChar) pOpenFileName.lCustrData = 0 pOpenFileName.lpfnHook = 0 pOpenFileName.lpTemplateName = 0 pOpenFileName.lStructSize = Len(pOpenFileName) '読取専用ファイルを隠す pOpenFileName.Flags = OFN_HIDEREADONLY _ Or OFN_EXPLORER lngRet = GetOpenFileName(pOpenFileName) GetFileName = Left(pOpenFileName.lpstrFile, _ InStr(pOpenFileName.lpstrFile, vbNullChar) - 1) End Function '実行プロシージャ Private Sub CmdlgTest() Debug.Print GetFileName End Sub ●動作確認● 実行プロシージャCmdlgTestを実行して下さい。 ファイル選択後、イミディエイトウィンドウに、選択したファイルのフルパスが表示されていることを確認して下さい。 ●詳細● サンプルでは、皆さんおなじみのエクスプローラ形式で、ファイルを1つだけ選択できるコモンダイアログが開きます。ファイルを複数選択したい、などのオプションは、「pOpenFileName.Flags」にDeclareセクションで宣言している定数を「Or」でつなげて代入していきます。 ちなみに複数ファイルを選択した場合、戻り値は... ------------------------------------------------------------ ドライブ名+ディレクトリ名 |ファイル名|ファイル名|・・・|| ※ 「|(パイプ)」はvbNullCharを表す ------------------------------------------------------------ という形になります。 また、このAPIは単に「ファイル名を取得」するだけですから、そのファイル名をどう処理していくかは、他の部分のコーディングに依存しますので注意が必要です。