Home > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > ユーザフォーム入門 - 住所入力フォームを作成する(8) 〜 フォームの起動と終了

即効テクニック

ユーザーフォーム関連のテクニック

ユーザフォーム入門 - 住所入力フォームを作成する(8) 〜 フォームの起動と終了

(Excel 2000)
※このトピックはテクニック集”ユーザーフォーム入門−住所入力フォームを作成する(6)”までの内容を前提としています。
フォームの起動は・・・
UserForm1.Show
フォームの終了は、フォームモジュール内で・・・
Unload Me
とするのが基本ですが、問題は、起動については”どこからどのタイミングで起動するのか”、終了時については、”ユーザが作成者の意図しない終了の仕方をしてしまう場合の対応”、などにあります。

■どこからどのタイミングでフォームを起動するか■
一般的には・・・
  1. ブックを開いたとき(Workbook_Openイベント)
  2. ワークシート上のコマンドボタン(CommandButtonのクリックイベント)
  3. メニューバーやツールバーからの起動などの方法でフォームを起動します。
●1.Workbook_Openイベントの作成● VBEのプロジェクトウィンドウ(表示されていない場合は”表示”メニューから表示させる)からフォームを作成したブックの”ThisWorkbook(エクセルのアイコン)”を選択。          ↓ 右クリックから表示されるショートカットメニューのうち”コードの表示”を選択。もしくはダブルクリック。          ↓ ワークブックオブジェクトと関連付けられたモジュールのウィンドウが開きます。          ↓ コードウィンドウ上部左側のオブジェクトボックスより”Workbook”を選択すると、既定のイベントであるOpenイベントのプロシージャ雛型が作成されます。ここにフォームを起動するためのコードを記述します。
Private Sub Workbook_Open()
UserForm1.Show
End Sub
●2.ワークシート上にコマンドボタンを配置して起動●
ワークシート上にコマンドボタンを配置するには・・・

”コントロールツールボックス”のツールバー(表示されていない場合はエクセルのメニューから”表示-ツールバー-コントロールツールボックス”を選択して表示させる)からコマンドボタン(四角い浮き彫り上のアイコン)をクリックし、マウスカーソルが”+”印に変わったらシート上の配置したい任意の位置でクリックし、四角を描くようにドラッグする。
         ↓
自動的にデザインモードになる
※コントロールツールボックスのアイコン(青色の三角定規と鉛筆のアイコン)で確認
         ↓
コマンドボタンを選択して右クリック。表示されたショートカットメニューから”コードの表示”を選ぶ。または、デザインモードでコマンドボタンをダブルクリック。
         ↓
Visual Basic Editor(VBE)が起動し、コマンドボタンクリックイベントプロシージャの雛形がワークシートに関連付けられたモジュールに挿入される。
         ↓
フォームを起動するコードを記述
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
●メニューバーやツールバーからの起動●
ここでは独自のツールバーを手動で作成し、新しいメニューを加えます。

(A)VBEのメニューから”挿入-標準モジュール”を選択し、表示されたモジュールに以下の
  プロシージャを記述。
Sub ShowUserForm()
UserForm1.Show
End Sub
(B)ツールバーと起動メニューの作成
エクセルのメニューから”ツール-ユーザ設定”を選択。
         ↓
ユーザ設定ダイアログで”ツールバー”のタブをクリックし、”新規作成”ボタンを押す。
         ↓
”新しいツールバー”ダイアログでツールバーの名称を指定する(例:MyToolBar)
         ↓
アイコンもメニューもない小さなツールバーが表示される。
         ↓
ユーザ設定ダイアログの”コマンド”タブをクリック。左側のリストから”新しいメニュー”を選択。右側の”コマンド”の中に表示される”新しいメニュー”をクリックして、マウスカーソルが”田”上に変わったらそのまま作成したツールバーの上までドラッグし、マウスボタンを離す。
         ↓
”MyToolBar”に作成された”新しいメニュー”の上で右クリック。表示されたショートカットメニューの”名前”の欄で分かりやすい名前に変更。(例:ユーザフォーム起動)
また、ユーザ設定ダイアログの”選択したボタンの編集”のクリックでも同様のメニューが表示されます。
         ↓
再度”新しいメニュー”の上で右クリックし、”マクロの登録”をクリック。リストの中から
(A)で作成したプロシージャ(ShowUserForm)を選択して”OK”。
         ↓
”ツールバー”タブに戻り、”添付”ボタンをクリック。
         ↓
”ブックへツールバーを登録”のダイアログの左側のリスト(ユーザ設定ツールバー)の中から作成したツールバー(MyBar)を選択し、”コピー”ボタンをクリック。右側のリスト(登録ツールバー)に名前が表示されたのを確認して”OK”。ユーザ設定ダイアログも”閉じる”ボタンをクリックして終了。
※作成したツールバーはフロート状態のままでもかまいませんが、画面上部にドラッグしてその他のツールバーと同様に画面上部に配置することも出来ます。

●補足 - フォームのモードレス表示●
エクセル2000においてはユーザフォームの起動を指示するShowメソッドの引数"Modal"に"False"を指定することでフォームのモードレス表示が可能となります。これにより、フォームを表示したままワークシート上で操作することなどが出来るようになります。(例えば、ワークシー上のデータをフォーム上のテキストボックスにコピー&ペーストするなど。)
Private Sub CommandButton1_Click()
UserForm1.Show False
End Sub
※ユーザフォームのプロパティー"ShowModal"にプロパティーウィンドウから"False"を設定することでもモードレス表示が可能となります。

■ユーザフォームの終了■
VBEで作成したユーザフォームに配置した”終了”ボタン(CmdShuuryo)を右クリックし、”コードの表示”を選んでクリックイベントプロシージャを作成。
Private Sub cmdShuuryo_Click()

Unload Me

End Sub
●終了を必ず”終了”ボタンから行わせるには●
作成したアプリケーションのユーザーによる作成者の意図しない動作を防止するためにはフォーム起動時の"X"ボタン(フォーム右上端の閉じるボタン)を無効にするのが効果的です。
閉じるボタンを無効にするにはユーザフォームの”QueryClose”イベントを用います。
フォームモジュールのオブジェクトボックスからユーザフォームを選択し、プロシージャボックスから”QueryClose”を選択すると雛形が挿入されます。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

End Sub

このイベントプロシージャの引数"CloseMode"にはフォームの終了状態が格納されます。
"X"ボタンによる終了状態は”vbFormControlMenu”です。また、フォームの終了をキャンセルするには、このイベントプロシージャの引数"Cancel"に、イベントプロシージャ内で"True"を格納することによって可能となります。

(サンプル)
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

Select Case CloseMode
Case vbFormControlMenu
    MsgBox "終了ボタンから終了してください"
    Cancel = True
Case Else
    'とじるボタン以外の終了時にはデータブック(住所録.xls)を保存してとじます
    MsgBox "終了します。"
    Workbooks(BOOK_NAME).Close savechanges:=True
End Select

End Sub