VB6 リファレンス お品書き へ戻ります
Visual Basic6 リファレンス


VB6 ファイルを開くダイアログボックス操作 (API)
APIを使って、「ファイルを開く」、「ファイル名を付けて保存」ダイアログボックスを表示します

API
「ファイルを開く」ダイアログボックス : GetOpenFileName : comdlg32.dll
「ファイル名を付けて保存」ダイアログボックス : GetSaveFileName : comdlg32.dll

ソースはVB6用で記述しています。VB.NET以降のバージョンは型宣言に注意してください(VB6:Long → VB.NET以降:Integer)

お品書き
● 標準モジュールAPI定義 標準モジュールのソース
● 共通関数サンプル「ファイルを開く」ダイアログボックスを開く共通関数ソース
● 共通関数サンプル「ファイル名を付けて保存」ダイアログボックスを開く共通関数ソースリスト
● サンプルリスト「ファイルを開く」ダイアログボックスを開く共通関数を利用するサンプルプログラム
● サンプルリスト「ファイル名を付けて保存」ダイアログボックスを開く共通関数を利用するサンプルプログラム
● GetOpenFileName「ファイルを開く」ダイアログボックスを開く
● GetSaveFileName「ファイル名を付けて保存」ダイアログボックスを開く


● API定義 標準モジュール

'=======================
' ファイルを開くダイアログボックス
'=======================
Public Declare Function GetOpenFileName Lib "comdlg32.dll" _
  Alias "GetOpenFileNameA" (lpofn As OPENFILENAME) As Long

'=============================
' [ファイル名を付けて保存] ダイアログボックス
'=============================
Public Declare Function GetSaveFileName Lib "comdlg32.dll" _
  Alias "GetSaveFileNameA" (lpofn As OPENFILENAME) As Long

'===============
' OPENFILENAME構造体
'===============
Public Type OPENFILENAME
  lStructSize As Long             '構造体のサイズ
  hwndOwner As Long            'ウインドウのハンドル
  hInstance As Long              'インスタンスハンドル
  lpstrFilter As String            'フィルタ
  lpstrCustomFilter As String  'カスタムフィルタ
  nMaxCustFilter 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                    '定数(OFN_××参照)
  nFileOffset As Integer         'フルパスの中のファイル名までのオフセット
  nFileExtension As Integer    '拡張子までのオフセット
  lpstrDefExt As String          'デフォルトの拡張子
  lCustData As Long              'lpfnHookで渡すデータ
  lpfnHook As Long               'フック関数のポインタ
  lpTemplateName As String   'テンプレート名
End Type

Public Const OFN_ALLOWMULTISELECT = &H200      '複数ファイルを選択可能にする
Public Const OFN_CREATEPROMPT = &H2000           '指定のファイル名が存在しない時にメッセージボックスを表示
Public Const OFN_FILEMUSTEXIST = &H1000           '存在しないファイル名は入力不可
Public Const OFN_HIDEREADONLY = &H4                '読み取り専用のチェックボックスを非表示
Public Const OFN_NOCHANGEDIR = &H8                 '他のサブディレクトリから選択不可
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                    'ヘルプボタンを表示


● 「ファイルを開く」ダイアログボックス 共通関数

'=======================================
'■関数名       apiGetOpenFileName
'■用途        「ファイルを開く」ダイアログボックスを表示する
'■引数         nHandle:ウインドウのハンドル
'               nFilter  :ファイルフィルタ
'               nDir     :デフォルトのフォルダ位置
'■戻り値      ファイルを選択した場合 ファイル名(フルパス)
'               キャンセルを押した場合 ヌルストリング("")
'=======================================
Public Function apiGetOpenFileName(nHandle As Long, nFilter As String, nDir As String) As String

   Dim OFN As OPENFILENAME           'OPENFILENAME構造体
   Dim Ret As Long                          '戻り値

   With OFN                                 '構造体の設定
      .Flags = OFN_PATHMUSTEXIST Or _
               OFN_FILEMUSTEXIST Or _
               OFN_HIDEREADONLY
      .hInstance = App.hInstance             'インスタンスハンドルを設定
      .hwndOwner = nHandle                   'ウインドウハンドルを設定
      .lpstrTitle = "ファイルを開く"             'コモンダイアログのタイトルを設定
      .lpstrFilter = nFilter                       'フィルタを設定
      .lStructSize = Len(OFN)                  '構造体のサイズを設定
      .nMaxFile = 257                            'ファイル名のバッファのサイズを設定
      .lpstrFileTitle = String(257, Chr(0))  'フルパス用のバッファを確保
      .nMaxFileTitle = 257                      'フルパス用のバッファのサイズを設定
      .lpstrFile = String(257, Chr(0))       'ファイル名のバッファを確保
      .lpstrInitialDir = nDir                    'デフォルトのディレクトリを指定
   End With

   Ret = GetOpenFileName(OFN)          '「ファイルを開く」ダイアログボックスを表示する

   If Ret = 0 Then                                '[キャンセル]を押した時、
      apiGetOpenFileName = vbNullString  ' ""を返す
   Else                                               '[OK]を押した時、
      apiGetOpenFileName = Left(OFN.lpstrFile, InStr(OFN.lpstrFile, Chr(0)) - 1)  ' ファイル名(フルパス)を返す
   End If

End Function


● 「ファイル名を付けて保存」ダイアログボックス 共通関数

'============================================
'■関数名       apiSaveFileName
'■用途        「ファイル名を付けて保存」ダイアログボックスを表示する
'■引数         nHandle:ウインドウのハンドル
'               nFilter  :ファイルフィルタ
'               nDir     :デフォルトのフォルダ位置
'               nFile    : デフォルトのファイル名
'■戻り値      ファイルを選択した場合 ファイル名(フルパス)
'               キャンセルを押した場合 ヌルストリング("")
'============================================
Public Function apiSaveFileName(nHandle As Long, nFilter As String, nDir As String, Optional nFile As String = "") As String

   Dim OFN As OPENFILENAME           'OPENFILENAME構造体
   Dim Ret As Long                          '戻り値

   With OFN                                 '構造体の設定
      .Flags = OFN_PATHMUSTEXIST Or _
               OFN_FILEMUSTEXIST Or _
               OFN_HIDEREADONLY Or _
               OFN_OVERWRITEPROMPT
      .hInstance = App.hInstance                 'インスタンスハンドルを設定
      .hwndOwner = nHandle                       'ウインドウハンドルを設定
      .lpstrTitle = "ファイルを保存する"            'コモンダイアログのタイトルを設定
      .lpstrFilter = nFilter                           'フィルタを設定
      .lStructSize = Len(OFN)                      '構造体のサイズを設定
      .nMaxFile = 257                                'ファイル名のバッファサイズを設定
      .lpstrFileTitle = String(257, Chr(0))      'フルパス用のバッファを確保
      .nMaxFileTitle = 257                          'フルパス用のバッファサイズを設定
      .lpstrFile = nFile & String(257, Chr(0)) 'ファイル名のバッファを確保
      .lpstrInitialDir = nDir                         'デフォルトのディレクトリを設定
   End With

   Ret = GetSaveFileName(OFN)         '「ファイル名を付けて保存」ダイアログボックスを表示する

   If Ret = 0 Then                           '[キャンセル]を押した時、
      apiSaveFileName = vbNullString  ' ""を返す
   Else                                          '[OK]を押した時、
      apiSaveFileName = Left(OFN.lpstrFile, InStr(OFN.lpstrFile, Chr(0)) - 1) ' ファイル名(フルパス)を返す
   End If

End Function


● 「ファイルを開く」ダイアログボックス 共通関数の使用例

'============================================
' 「ファイルを開く」ダイアログボックスを表示してファイル名を取得する
'============================================
Dim strFilter As String   'ファイルフィルタの設定
strFilter = "EXCELファイル(*.xls, *.csv)" & Chr(0) & "*.xls;*.csv" & Chr(0) & _
               "すべてのファイル(*.*)" & Chr(0) & "*.*" & Chr(0)

Dim strDir As String      'デフォルトのフォルダ位置
strDir = "c:¥"

Dim strFileName As String 'ファイル名(フルパス)
strFileName = apiGetOpenFileName(Me.hWnd, strFilter, strDir) 'ダイアログ表示


● 「ファイル名を付けて保存」ダイアログボックス 共通関数の使用例

'================================================
' 「ファイル名を付けて保存」ダイアログボックスを表示してファイル名を取得する
'================================================
Dim strFilter As String   'ファイルフィルタの設定
strFilter = "EXCELファイル(*.xls, *.csv)" & Chr(0) & "*.xls;*.csv" & Chr(0) & _
               "すべてのファイル(*.*)" & Chr(0) & "*.*" & Chr(0)

Dim strDir As String      'デフォルトのフォルダ位置
strDir = "c:¥"

Dim strFileName As String 'ファイル名(フルパス)
strFileName = apiSaveFileName(Me.hWnd, strFilter, strDir, "test.xls") 'ダイアログ表示


● GetOpenFileName APIメソッド
【機能】[ファイルを開く]ダイアログボックスを作成します。
【宣言】 Public Declare Function GetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (lpofn As OPENFILENAME) As Long

lpofnOPENFILENAME 構造体へのポインタ。この構造体に選択したファイル情報が格納されます。
【戻り値】 ファイルを指定して[OK]ボタンをクリックすると、0 以外の値が返ります。
ダイアログボックスをキャンセルしたり閉じた場合、またはエラーが発生した場合は 0 が返ります。


● GetSaveFileName APIメソッド
【機能】[ファイル名を付けて保存]ダイアログボックスを作成します。
【宣言】 Public Declare Function GetSaveFileName Lib "comdlg32.dll" _
        Alias "GetSaveFileNameA" (lpofn As OPENFILENAME) As Long

lpofnOPENFILENAME 構造体へのポインタ。この構造体に選択したファイル情報が格納されます。
【戻り値】 ファイルを指定して[OK]ボタンをクリックすると、0 以外の値が返ります。
ダイアログボックスをキャンセルしたり閉じた場合、またはエラーが発生した場合は 0 が返ります。