ユーザーフォームを表示する

Showメソッドによるフォームの表示と表示方法の違いの注意点

'「UserForm1」を表示する
UserForm1.Show
'他操作不可表示
UserForm1.Show vbModal
'他操作可能表示
UserForm1.Show vbModeless

作成したユーザーフォームを表示するには「Show」メソッドを使用します
ユーザーフォームの「オブジェクト名」を指定して実行します

このコード自体はフォームを表示するメソッドです
コード実行時に対象のフォームがLoadされていなければ、Loadが実行されてから表示処理が行われます
表示するメソッドなので、Hideメソッドで非表示になった状態からもこのメソッドで再表示を行います

引数による表示方法の違い

'他操作不可表示
UserForm1.Show vbModal
'他操作可能表示
UserForm1.Show vbModeless

上記の2つの例コードでは引数を指定しています
ユーザーフォームを表示する際に表示方法の設定を行います

表示の方法とは、ユーザーフォーム表示中はExcelや他のフォームが操作できないようにするかしないかの設定です

ただこの設定に関してはユーザーフォーム自体の「ShowModal」プロパティで設定が可能で、引数を省略してShowメソッドを実行すればその設定が有効になります

モーダル表示で操作不可の状態
vbModal(ShowModalがTrue)の設定時

vbModal(ShowModalがTrue)を設定した場合の画像です
UserForm2は、この設定になっています
なので、このフォームが表示されている間はExcelや他のフォームの操作が行えません
画像のマウスカーソルを確認してください
セル選択時の十字カーソルに変化せず、矢印カーソルのままです
この状態でクリックしてもビープ音がなり操作は出来ません

モードレス表示で操作可能な状態の動き
vbModeless(ShowModalがFalse)の設定時の動き

vbModeless(ShowModalがFalse)を設定した場合の動きの画像です
この設定では、Excelや他のフォームの操作が可能になります
画像でもワークシートのセル選択を変更できています

Showメソッドでの設定をすることはあまり無いかもしれませんがShowModalプロパティはコード中での変更が出来ないため、初期表示とは違う表示方法を選択したい場合には使えるかもしれません

後続処理の動作の違いへの注意

表示方法の違いで続くコードが継続して実行されるか、一時停止するかが変わります

「vbModal」は、ユーザーフォームが終了するまで、このメソッドの行でプロシージャの実行は一時停止されます(こちらが既定値)
「vbModeless」は、ユーザーフォームが表示された時点でプロシージャの後続の処理も実行されます

UserForm1.Show vbModal
MsgBox ""
UserForm2.Show vbModeless
MsgBox ""

上記のようなコードの組み方をして動作を確認します
UserForm1は操作不可の設定で表示、UserForm2は操作可能な設定で表示します
表示処理の後に、メッセージボックスを表示します

後続処理の実行の動き
後続処理の実行の動き

まずは、vbModalでUserForm1が表示されます
そのフォームが終了すると、後続のメッセージボックスの表示処理が実行されます

次に、vbModelessでUserForm2が表示されます
その後のメッセージボックスはフォームが表示されると同時に実行され、フォームより手前に表示されています

さらに処理はそのままEndSubまで実行されます
この時にフォームは表示されたままです

以上の事から、プロシージャでShowメソッドを記載した後になんらかの処理があった場合に注意が必要になります
このメソッドの後続処理が、フォーム表示中に実行するのかフォーム終了後に実行するのかを考慮したうえで作成を行ってください
もちろん後続処理がなければ注意する必要はありません

表示順によりエラーが発生する

「vbModal」で表示されたフォームの後に、別のフォームを「vbModeless」で開くことが出来ません

vbModelessでは、Excelと別フォームの操作が許可されます
しかし、1つ目のフォームでは許可されていません
ここでその許可に矛盾が生じるためエラーが発生し起動が出来ません
後に操作が許可されるのは認められません

逆に先に許可されている状態から、許可されない動きは認められます

つまり、1つ目のフォームがvbModelessで表示されてExcel操作が可能な状態です
この後に2つ目のフォームでvbModelで表示された場合にExcel操作が不能になります
当然この状態では、Excelの操作も1つ目のフォームも操作できません
フォームを終了すれば、また操作が可能になります