※このトピックはテクニック集”ユーザーフォーム入門−住所入力フォームを作成する
(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
|