このページではJavaScriptを使用しています。スクリプトが無効に設定されているとメニュー等が表示されません。
ユーザーフォームの作り方
「ユーザーフォーム」とは何でしょう。
「ユーザーフォーム」というのは、
Excel
の「ツール」メニューの「オプション」を選択すると表示される、固定ダイアログと言われる種類のフォームウィンドウを自由にデザインして作成し表示利用できる機能です。
「入力画面」としたり、一括処理の起動条件の「指定画面」としてマクロ上で利用します。但し、「入力画面」としては、ワークシート自体が本来は入力画面なので機能としては重複しており、この要件では必須となるものではないという考え方もあると思います。
VBE
上からユーザーフォームをプロジェクトに追加します。
VBE
のプロジェクトエクスプローラでプロジェクトを右クリックして「挿入」→「ユーザーフォーム」を選択すると「ユーザーフォーム」が挿入され利用できるようになります。
追加されると、「空」のフォーム(
Windows
アプリケーションの一般的な入力画面)と「ツールボックス」が現われます。
「ツールボックス」が出てこない場合は、「表示」メニューから選択して下さい。
行ないたいフォームを作成します。「ツールボックス」から貼り付けるコントロールをクリックしてから、フォーム上で貼り付け範囲をドラッグすることでコトロールがフォーム上に作成されます。
位置や大きさの細かい調整は、コントロールのドラッグハンドルや、左下のプロパティウィンドウの項目の値を直接書き換えて調節します。
このようにしてフォームのデザインを完成させます。
ここでは、フォーム自体や各コントロールの名前を「(オブジェクト名)」に指定し、フォームやラベルの「
Caption
」で表示名、「
Font
」で文字、「
ForeColor
」で文字色、「
TextAlign
」で横方向配置、テキストボックスでは、この他「
MaxLength
]で最大桁数、「
IMEMode
」で日本語変換の
On/Off
などを決定します。これら(オブジェクト名以外)は、プロシージャ記述内でも変更できますが、固定のものはこのデザイン段階で完了させておいた方が簡単です。
このサンプルではフォーム名「
FRM_USER
」、各テキストボックスが「
TXT_NAME
」「
TXT_CODE
」「
TXT_DEPT
」、登録ボタンが「
CMD_OK
」としました。
続いて、
Tab
キー等でのコントロールのカーソル出現順を確認します。フォームを選択した状態での右クリックメニューの
「タブオーダー」
で確認します。
「氏名」「社員av「部署名」の見出しはラベルなので、
Tab
キー等でフォーカスが降りることはありませんから、ラベルの位置は関係ありません。具体的にフォーカスが降りるコントロールの順番を確認します。通常はコントロールの作成順になっているので、後から追加、変更した場合は調整が必要です。
これでデザインは完了となり、ここからが実際のVBAコードの記述です。
フォームの右クリックメニューの「コードの表示」や、プロジェクトエクスプローラの左上ボタンでコードページが表示されます。
ユーザーフォームは、VBA上ではクラスモジュールの一種で、標準モジュール等からはオブジェクトの1つです。ユーザーフォーム上に必要なコードの記述は、イベント動作の中で必要になるものだけ記述すれば済みます。
イベント動作の記述は、コードウィンドウの上にある2つのプルダウンで
オブジェクト
(左プルダウン)、
イベント
(右プルダウン)を選択すればその
Sub
プロシージャ
が作成されるので、その中に記述するだけです。
lこのサンプルのように、テキストボックスとボタンだけのフォームであれば、テキストボックスのイベントで特に必要な処理はないので、登録ボタンのクリックについてのイベント記述を記述すれば済むはずです。
この例は、社員の「氏名」「社員av「部署名」の登録処理のサンプルとしています。
(以前に説明していない記述もいくらか含まれています)
(画像をクリックすると、実際にExcel上で開いて動作が確認できます)
サンプルには、ワークシートイベントのコード「
Worksheet_SelectionChange
」が記述してあり、シート上で「氏名」の列のどれかの行をクリックしたり、カーソルを移動すると、今回作成した「ユーザー情報の登録」のフォームが現われます。
この時、既に登録済みの行が選択された時は、その行の内容が「ユーザー情報の登録」に表示され、未登録行か見出しの行の場合は「空」で表示されます。
ここに内容を登録して、「登録」ボタンをクリックすればシートに内容が更新されます。
(画像をクリックすると、実際にExcel上で開いて動作が確認できます)
※この画面サンプルは、一度登録してから再度その行を表示させています。
ここでは、ワークシートは保護(パスワードなし)されており、直接の入力はできないようになっています。「登録」ボタンをクリックした時は、「氏名」「社員av「部署名」が揃って入力されているか、「社員avは数字で5桁かなどをチェックしてから登録するようになっています。
この
Excel
ブックのプロジェクトを開くと、このようになっています。
(画像をクリックすると、実際にExcel上で開いて動作が確認できます)
プロジェクトエクスプローラから「
FRM_USER
」「
Sheet1
」「
Module1
」を選択して、右クリックメニューから「コードの表示」を選択して見て下さい。
「
Sheet
1」はワークシートの
イベント記述
で、「
Worksheet_SelectionChange
」はシート上の選択セルが変わると走るイベントです。ここでカラムが「1」であれば「
TOUROKU
」を呼び出しています。
「
Module1
」はメインモジュールで「
TOUROKU
」のコードが書き込まれています。「
TOUROKU
」は少し長いですが、「
FRM_USER
」に初期値をセットして「ユーザー情報の登録」フォームを表示させ、フォームが消失した後フォームの内容からワークシートを更新する処理が記述されています。
「
FRM_USER
」は、「ユーザー情報の登録」フォーム上の
イベント記述
です。ここで必要なのは「登録」ボタンをクリックした時の内容チェックで、各項目をチェックしてOKであれば、スイッチに「1」をセットしてからフォームを消失させています。
ユーザーフォームは通常、
「
Show
メソッド」
で呼び出されます。呼び出されるとユーザーフォームが消えるまで、呼び出し元の処理は
「
Show
メソッド」
の行で停止した状態になります。このサンプルでのユーザーフォームの消失は、「登録」ボタンのクリックイベントの記述で、チェックがOKだった時の
「
Me.Hide
」
か操作で「閉じる」ボタンがクリックされた時となりますが、
「
Me.Hide
」
以外は「
g_swOK
」に「1」がセットされないので、更新の処理はされないようになっています。
また、「登録」ボタンのクリックイベントの記述で、チェックがエラーだった場合は、ユーザーフォームが表示されたままなので、そのまま修正入力をして、再度「登録」ボタンのクリックができます。
このようなことを、マクロ(VBA)で記述していくと、ユーザーフォームが利用できるようになります。ユーザーフォームはこのような登録のためのフォームの他、処理の範囲選択などに利用できます。このサンプルのような登録画面の例でも、単にテキストボックスを並べるばかりではなく、部署は
コンボボックス
や
リストボックス
でプルダウンリストから選べるようにしたり、社員かアルバイトかの区別や男性/女性の区別を
オプションボタン
や
チェックボックス
で選ぶなど工夫ができます。
さらに、修正で呼び出してから前行や後行に
スピンボタン
や
スクロールバー
を使って移動させたりもできます。入力する項目数が相当多い場合は、種別ごとに切り分けて、
タブストリップ
や
マルチページ
で小さいウィンドウを使い分けるなど通常、
VisualBasic
等の開発言語を駆使して行なうような分野までExcelでも対応させることができます。
但し、注意していただきたいのは、
VisualBasic
等がインストールされている環境でユーザーフォームを使う場合です。ツールボックスの「その他のコントロール」には
Excel
だけでは利用できないコントロールが「利用可能なコントロール」として表示されてしまいます。これをむやみに利用しても配布先が
Excel
のみの環境であれば利用できないことを理解しておいて下さい。
Excelには、このようなフォームの仕組みがもう一つあります。それは、ワークシートの「挿入」を行なう時の選択に出てくる
「
MS Excel5.0
ダイアログ」
です。これは
Excel95
以前のもので
Excel97
以降では使う必要はありません。
「
MS Excel5.0
ダイアログ」
上のコントロールは、コントロールに対応した「マクロ」を登録する古いものですが、ワークシート上では「フォーム」のツールバーに出てくるもので現在でも利用度はあります。しかし、ダイアログ上ではユーザーフォームよりも表現力が乏しく、イベント動作でないため機能が半減します。