HOME > 即効テクニック > AccessVBA > Windows環境・オブジェクト > コモンダイアログを使用する (API)

即効テクニック

Windows環境・オブジェクト

コモンダイアログを使用する (API)

(Access 97)
●概要●
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は単に「ファイル名を取得」するだけですから、そのファイル名をどう処理していくかは、他の部分のコーディングに依存しますので注意が必要です。