Base自分用のナレッジベース。Server、オープンソース系のシステムやフリーソフトに関する情報、iPhone、Androidスマホ便利情報など役立つ情報などを覚書しておくためのブログ。リニューアルされました。リダイレクトされます。AccessのVBAで"WizHook"オブジェクトを使用して[ファイルを開く]、[名前をつけて保存]ダイアログボックスを表示する方法について覚書。記事概要AccessのVBAでは、[ファイルを開く]もしくは、[名前を付けて保存]ダイアログボックスを表示するための標準的なメソッドが用意されていません。ExcelにあるようなGetOpenFilename、GetSaveAsFilenameメソッドがなく、これらの[ファイルを開く]、[名前を付けて保存]ダイアログボックスの機能を簡単に利用すことができません。以下は、非公開オブジェクトである"WizHook"オブジェクトを利用してAccessのVBAで[ファイルを開く]もしくは、[名前を付けて保存]ダイアログボックスを表示するために作成したユーザー定義関数のサンプルプログラムを覚書しておきます。WizHookオブジェクトは、非公開のオブジェクトですが、このオブジェクトを利用することによってAccessのVBAでも[ファイルを開く]、[名前を付けて保存]ダイアログボックスをAPIなどを使用せずに比較的簡単に利用することができます。以下に作成したユーザー関数のサンプルプログラムと、作成したユーザー定義関数をプログラムから呼び出して利用するためのサンプルプログラムを紹介します。WizHookオブジェクトを使用したVBAの基本的なサンプルプログラム以下のプログラムをコピーして標準モジュールに貼り付けてください。Function上記で作成した関数"GetFileName(引数)"は、[ファイルを開く]ダイアログボックスか[名前をつけて保存]ダイアログボックスを指定する引数を持たせています。"GetFileName(引数)"関数を呼び出す際に引数に指定する値(TrueかFalse)によって表示するダイアログボックスをどちらにするか判断しおり、引数に"True"を指定した場合は、[ファイルを開く]ダイアログボックスを表示し、"False"を指定した場合は、[名前を付けて保存]ダイアログボックスを表示します。表示したダイアログボックスで[キャンセル]ボタンが押された場合を考慮して関数の戻り値として2つの値を返しています。WizHookの仕様として[キャンセル]ボタンが押された場合は、WizHookの戻り値として-302が返され、きちんとファイルが選択された場合は、0が返されます。この2つの値を呼び出し元に返すために関数の戻り値としては配列が返るようになっています。配列のインデックス番号0番に[キャンセル]が押されたかどうかを示す値、インデックス番号1番にパスを含めたファイル名の文字列(キャンセルされた時は空文字(""))が代入されています。作成した"GetFileName(引数)"関数を呼び出して使用するサンプルプログラム作成したユーザー定義関数、"GetFileName(引数)"関数をプログラム中で呼び出して使用するサンプルプログラムを以下に紹介します。"キャンセルが押されました。Sub関数の戻り値は配列になるため、戻り値が代入される変数ReturnArrayはVariant型で宣言しています。ReturnArray(0)に[キャンセル]が押されたかどうかを表す値、ReturnArray(1)にパスを含めたファイル名の文字列が代入されています。ダイアログボックスの細かい設定を引数としてい指定できるように変更したサンプルプログラム作成したユーザー定義関数をもう少し汎用的に使用できるようにするために、ダイアログボックスのタイトル文字列などの指定を関数の引数で指定できるように変更したサンプルプログラム。ファイルの種類のフィルタとダイアログボックスのタイトル文字列を引数として指定できるように変更。Function変更した"GetFileName"関数を呼び出して使用するサンプルプログラム上記ユーザー定義関数をプログラムから呼び出して利用するサンプルプログラムを以下に記載します。絞るフィルタを指定して[名前をつけて保存]ダイアログボックスを表示するサンプルプログラムです。"キャンセルが押されました。Sub以下は上記サンプルプログラムを実行した際に表示される[名前をつけて保存]ダイアログボックスです。関数を呼び出す際ファイルのフィルタとタイトルバーの文字列を指定する引数に""(空文字)を指定すると、規定の状態で表示されます。フィルタは、"全てのファイル(*.*)"になります。AccessのVBAで、[ファイルを開く]もしくは、[名前を付けて保存]ダイアログボックスを表示するサンプルプログラムまとめAccessのVBAには、ExcelにあるようなGetOpenFilename、GetSaveAsFilenameメソッドがないため、非公開オブジェクトの"WizHook"オブジェクトを呼び出して[ファイルを開く]ダイアログボックス、[名前をつけて保存]ダイアログボックスを表示して使用する方法を紹介しました。"WizHook"オブジェクトは、[ファイルを開く]ダイアログボックス、[名前をつけて保存]ダイアログボックス両方の機能を持っているので、どちらを表示するかを関数の引数で渡せるようにしました。ダイアログボックスのタイトル文字列やファイルのフィルタ(表示するファイルの拡張子により限定するなど)文字列も引数で渡せるように変更し、作成したGetFileName関数をもっと汎用的に使用できるようにしたサンプルプログラムを紹介しました。サンプルプログラムではユーザー定義関数として作成して呼び出す方式をとっていますが、関数にせずプログラムの中で直接記述しても構いません。WizHookは、オブジェクトブラウザで右クリックして"非表示メンバを表示"を選択すると出てくるオブジェクトです。WizHookのメンバはAccessのバージョンによって異なります。WizHookを使用する以外にも"FileDialog"を使用することにより同じような機能を実現することができます。"FileDialog"オブジェクトを使用したサンプルプログラム関する記事一覧"FileDialog"オブジェクトの詳細やサンプルプログラムについては、以下の記事を参照してください。VBA:TransferTextを使用せずにVBAでCSVなどの区切り記号つきテキストファイルを既存のテーブルにインポートするサンプルプログラムよく参照される記事なので、説明を少し詳しくした上で読みやすいように記事を更新しました。データベースインポート位置webサイトウィンドウサイズ端末にAPNが正しく設定されていません。(11/25)プロフィールこのブログの中の人:billyboyこのブログを見に来てくれてありがとうございます。このブログの中の人はExcel、AccessのVBAに関するカスタマーサポート、技術ドキュメントのの作成業務を経験後、開発系SEを経て現在は金融系企業のシステム運用/保守SEとして働いています。当初自分が困ったときに解決した方法や社内/外からの技術的な問い合わせに回答した時に作ったプログラムなどを自分用の備忘録としてこのブログを開設しました。たくさんの方に見に来ていただけてることに気づいてからはなるべく誰が見てもわかるような記事内容にすることを意識して書いています。