AccessのVBAで"WizHook"オブジェクトを使用して[ファイルを開く]、[名前をつけて保存]ダイアログボックスを表示する方法について覚書。
AccessのVBAで[ファイルを開く]、[名前を付けて保存]ダイアログボックスを利用したい場合について
AccessのVBAでは、[ファイルを開く]もしくは、[名前を付けて保存]ダイアログボックスを表示するための標準的なメソッドが用意されていません。
ExcelにあるようなGetOpenFilename、GetSaveAsFilenameメソッドがなく、これらの[ファイルを開く]、[名前を付けて保存]ダイアログボックスの機能を簡単に利用すことができません。
以下は、非公開オブジェクトである"WizHook"オブジェクトを利用してAccessのVBAで[ファイルを開く]もしくは、[名前を付けて保存]ダイアログボックスを表示するために作成したユーザー定義関数のサンプルプログラムを覚書しておきます。
WizHookオブジェクトは、非公開のオブジェクトですが、このオブジェクトを利用することによってAccessのVBAでも[ファイルを開く]、[名前を付けて保存]ダイアログボックスをAPIなどを使用せずに比較的簡単に利用することができます。
以下に作成したユーザー定義関数のサンプルプログラムと、作成したユーザー定義関数をプログラムから呼び出して利用するためのサンプルプログラムを紹介します。
WizHookオブジェクトを使用したVBAの基本的なサンプルプログラム
以下のプログラムをコピーして標準モジュールに貼り付けてください。
Function GetFileName(OpenOrSaveFlg As Boolean) As Variant
Dim returnValue As Integer
Dim strFilePath As String
WizHook.Key = 51488399 'WIZHOOKを有効化する
returnValue = WizHook.GetFileName( _
0, "", "", "", strFilePath, "", _
"テキストファイル (*.txt,*.csv,*.tab)|*.txt|*.csv|*.tab", _
0, 0, 0, OpenOrSaveFlg _
)
WizHook.Key = 0 ' WizHook 無効化
'returnValueとstrFilePathの2つの値を返す
'returnvalueの値を返すことで[キャンセル]が押されたかを判断するため
GetFileName = Array(returnValue, strFilePath)
End Function
上記で作成した関数"GetFileName(引数)"は、[ファイルを開く]ダイアログボックスか[名前をつけて保存]ダイアログボックスを指定する引数を持たせています。
"GetFileName(引数)"関数を呼び出す際に引数に指定する値(TrueかFalse)によって表示するダイアログボックスをどちらにするか判断しています。
引数に"True"を指定した場合は、[ファイルを開く]ダイアログボックスを表示し、"False"を指定した場合は、[名前を付けて保存]ダイアログボックスを表示します。
また、表示したダイアログボックスで[キャンセル]ボタンが押された場合を考慮して関数の戻り値として2つの値を返しています。
WizHookの仕様として[キャンセル]ボタンが押された場合は、WizHookの戻り値として-302が返され、きちんとファイルが選択された場合は、0が返されます。
この2つの値を呼び出し元に返すために関数の戻り値としては配列が返るようになっています。
配列のインデックス番号0番に[キャンセル]が押されたかどうかを示す値、インデックス番号1番にパスを含めたファイル名の文字列(キャンセルされた時は空文字(""))が代入されています。
作成した"GetFileName(引数)"関数を呼び出して使用するサンプルプログラム
作成したユーザー定義関数、"GetFileName(引数)"関数をプログラム中で呼び出して使用するサンプルプログラムを以下に紹介します。
Sub Sample01()
Dim ReturnArray As Variant
ReturnArray = GetFileName(True) 'この引数をFalseにすると保存ダイアログ
If ReturnArray(0) = -302 Then
'キャンセルボタンが押されたときの処理を記述
MsgBox "キャンセルが押されました。"
Else
'ファイルがきちんと選択された場合の処理を記述
MsgBox ReturnArray(1)
End If
End Sub
関数の戻り値は配列になるため、戻り値が代入される変数ReturnArrayはVariant型で宣言しています。
ReturnArray(0)に[キャンセル]が押されたかどうかを表す値、ReturnArray(1)にパスを含めたファイル名の文字列が代入されています。
ダイアログボックスの細かい設定を引数として指定できるように変更したサンプルプログラム
作成したユーザー定義関数をもう少し汎用的に使用できるようにするために、ダイアログボックスのタイトル文字列などの指定を関数の引数で指定できるように変更したサンプルプログラム。
ファイルの種類のフィルタとダイアログボックスのタイトル文字列を引数として指定できるように変更。
Function GetFileName(OpenOrSaveFlg As Boolean, strFilter As String, _
strTitle As String) As Variant
Dim returnValue As Integer
Dim strFilePath As String
If strFilter = "" Then
strFilter = "全てのファイル (*.*)|*.*"
End If
WizHook.Key = 51488399 'WIZHOOK有効
returnValue = WizHook.GetFileName( _
0, "", strTitle, "", strFilePath, "", _
strFilter, _
0, 0, 0, OpenOrSaveFlg _
)
WizHook.Key = 0 ' WizHook 無効
'returnValueとstrFilePathの2つの値を返す
'returnvalueの値を返すことで[キャンセル]が押されたかを判断するため
GetFileName = Array(returnValue, strFilePath)
End Function
変更した"GetFileName"関数を呼び出して使用するサンプルプログラム
上記ユーザー定義関数をプログラムから呼び出して利用するサンプルプログラムを以下に記載します。
ダイアログボックスのタイトル文字列を"ログファイルの保存"、開くファイル形式を *.txt、*.csv、*.tab に絞るフィルタを指定して[名前をつけて保存]ダイアログボックスを表示するサンプルプログラムです。
Sub Sample02()
Dim ReturnArray As Variant
ReturnArray = GetFileName(False, "ログファイル (*.txt,*.csv,*.tab)|*.txt|*.csv|*.tab", "ログファイルの保存")
If ReturnArray(0) = -302 Then
'キャンセルボタンが押されたときの処理を記述
MsgBox "キャンセルが押されました。"
Else
'ファイルが指定されたとこの処理を記述
MsgBox ReturnArray(1)
End If
End Sub
以下は上記サンプルプログラムを実行した際に表示される[名前をつけて保存]ダイアログボックスです。
関数を呼び出す際ファイルのフィルタとタイトルバーの文字列を指定する引数に""(空文字)を指定すると、規定の状態で表示されます。 フィルタは、"全てのファイル(*.*)"になります。
AccessのVBAで、[ファイルを開く]もしくは、[名前を付けて保存]ダイアログボックスを表示するサンプルプログラムまとめ
AccessのVBAには、ExcelにあるようなGetOpenFilename、GetSaveAsFilenameメソッドがないため、非公開オブジェクトの"WizHook"オブジェクトを呼び出して[ファイルを開く]ダイアログボックス、[名前をつけて保存]ダイアログボックスを表示して使用する方法を紹介しました。
"WizHook"オブジェクトは、[ファイルを開く]ダイアログボックス、[名前をつけて保存]ダイアログボックス両方の機能を持っているので、どちらを表示するかを関数の引数で渡せるようにしました。
また、ダイアログボックスのタイトル文字列やファイルのフィルタ(表示するファイルの拡張子により限定するなど)文字列も引数で渡せるように変更し、作成したGetFileName関数をもっと汎用的に使用できるようにしたサンプルプログラムを紹介しました。
サンプルプログラムではユーザー定義関数として作成して呼び出す方式をとっていますが、関数にせずプログラムの中で直接記述しても構いません。
WizHookは、オブジェクトブラウザで右クリックして"非表示メンバを表示"を選択すると出てくるオブジェクトです。 WizHookのメンバはAccessのバージョンによって異なります。
WizHookを使用する以外にも"FileDialog"を使用することにより同じような機能を実現することができます。
"FileDialog"オブジェクトを使用したサンプルプログラム関する記事一覧
"FileDialog"オブジェクトの詳細やサンプルプログラムについては、以下の記事を参照してください。
よく参照される記事なので、説明を少し詳しくした上で読みやすいように記事を更新しました。
コメント