ユーザーフォーム 第5回

ユーザーフォーム

モーダルとモードレス

 ユーザーフォームの開き方には2種類あります。モーダルとモードレスです。
 モーダルの時は、ユーザーフォームが表示されている間、処理対象がユーザーフォームとなっているためExcel上の操作はできません。
 それに対してモードレスでは、Excel上の操作も並行して出来るようになります。
 最初の設定(デフォルト)では、モーダルとなっています。

 モードレスの方が便利に思われるかもしれませんが処理の仕方によってはExcel上の操作を禁止した方が統制が取れるため、モーダルが標準となっています。

設定の仕方

 モーダルとモードレスの設定の仕方は2種類あります。
 プロパティウインドウであらかじめ設定しておく方法と、呼び出す際にプログラム上で設定する方法です。
 (ユーザーフォームのプログラムでは往々にして2つの方法が選択できます。)

プロパティウインドウによる設定の仕方

 ユーザーフォームのプロパティウインドウの「ShowModal」の項目で設定します。Trueの場合は、モーダルFalseの場合はモードレスになります。既定値はTrueとなっています。

プログラムによる設定の仕方

 ユーザーフォームを立ち上げる際、.Showに引数を渡して設定します。

 UserForm1.Show vbModeless  モードレスで開く
 UserForm1.Show vbModal   モーダルで開く

 既定値はモーダルなので、何もつけなければモーダルで開きます。

動作を確認する

 標準モジュールを用意して、そこに以下のようなコードを書いてください。モーダルとモードレスの違いを観察できます。

’/// Module1 
Sub ufModal()
    UserForm1.Caption = "モーダル"
    UserForm1.Show
End Sub

Sub ufModeless()
    UserForm1.Caption = "モードレス"
    UserForm1.Show vbModeless
End Sub

 ユーザーフォームが立ち上がったらExcelのシート上で操作できるか確かめてみましょう。

 今回はユーザーフォームのキャプションを変更してから立ち上げています。ちなみに Initialize に書いても変更はされません。

モードレスの利点と欠点

 モードレスではExcel上での操作ができるため連続して値を入力したりする時には便利です。
 一方、ユーザーフォーム上のコントロールの初期化したい場合など、辻褄を合わせなければならない処理も増えてくるため、モードレスの方がプログラムは複雑になります。

ユーザーフォームを閉じる・隠す

 ユーザーフォームには閉じる(Unload)メソッドの他に、隠す(Hide)というメソッドがあります。
 閉じる場合にはメモリ上から消去されますが、隠す場合には表示を消すだけでメモリ上に残ります。

 これらの動作を確認するためのプログラムを書いてみましょう。
 まずModule1には以下のようなプログラムを書きます。

’/// Module1 
Sub ufModal()
    UserForm1.Caption = "モーダル"
    UserForm1.Show
End Sub

Sub ufModeless()
    UserForm1.Caption = "モードレス"
    UserForm1.Show vbModeless
End Sub

Sub ufUnload()
    Unload UserForm1
End Sub

Sub ufHide()
    UserForm1.Hide
End Sub

 続いてユーザーフォームにテキストボックスとコマンドボタンを1つずつ追加します。
 コマンドボタンのキャプションは「Hide」とします。


 UserForm1のプログラムは以下のように書きます。

’/// UserForm1 
Private Sub CommandButton1_Click()
    Me.Hide
End Sub

 次はExcelのシート上にボタンを設置します。

 メニューの「開発」>「挿入」からフォームコントロールのボタンを選択して、シート上にボタンを設置します。

全部で3つのボタンを設置してください。ボタン上に右クリックして文字を選択するとキャプション名を変更できます。
 以下を参考にしてキャプション名を変更してください。

 それぞれのボタンにマクロの登録をします。ボタンを右クリックして「マクロの登録」を選択します。

 ボタンに対応するマクロが選択できるようになりますので、以下のように登録してください。

 「Show」ボタン –>  ufModeless
 「Hide」ボタン –>  ufHide
 「Unload」ボタン –>  ufUnload

モードレスでの動作確認

 「Show」ボタンでモードレスでユーザーフォームを開いてみます。
 モードレスではExcel上の他のボタンにもアクセスできます。
 
 テキストボックスに何か文字列を入れて「Hide」ボタンを押します。
 シート上の「Hide」ボタンとフォーム上の「Hide」ボタンは同じプロシージャです。
 テキストボックスの文字列を残した状態でユーザーフォームを閉じますので、再度「Show」ボタンで開くと文字列が表示されます。
  
 このように、Hideメソッドは表示を隠しているだけという事になります。

モーダルでの動作確認

 今度は「Show」ボタンのマクロの登録を ufModal にしてみてください。
 モーダルで開くとExcel上の操作はできないので、シート上の「Hide」「Unload」ボタンは操作できません。

 テキストボックスに何か入力して、フォーム上の「Hide」を押してください。
 ユーザーフォームが閉じました。
 
 再度開くとテキストボックス内には前回の文字列が残された状態で開いたはずです。
 モーダルでもHideメソッドは利用できます。

「終了」ボタンの設置

 ユーザーフォームは、×印で終了する事もできますが、モーダルでもモードレスでも閉じるためのボタンを設置するのが一般的です。
 例えば、メッセージボックスも「OK」ボタンで終了するようになっています。

まとめ

 モーダルで開くと、ユーザーフォームの処理が終わるまで他の処理はできなくなります。
 一方、モードレスでは開いた後もユーザーフォームの処理ができます。ただ、モードレスではプログラムが複雑になるケースがあるためモーダルでプログラムする方が一般的です。
 
 閉じる処理では、Unloadの他にHideがありますが、Hideを使うケースは稀です。
 モーダルで開いてUnloadで終わるのが一般的な手法になります。

タイトルとURLをコピーしました