Excelでフォームを用いる際、モーダルフォームだけならそれほど問題はおきないだろう。
しかし、Excel2000以降に使えるようになった、モードレスフォームを使うなら注意が必要である。
最大の相違点は、モーダルフォームはフォームのShowメソッドを実行した時点でフォームに制御が移り、そのフォームがHideされるとShowメソッドの次の行から処理が継続するが、モードレスフォームはShowをして、フォーム上で実行される処理をしたらさっさと抜け、Show以降の処理をしてしまうのである。例えばフォームオブジェクトをNewしてインスタンスを作り、Showした後にオブジェクトを破棄する処理があったとしたら、実行上は破棄まで一気に走ってしまうが、フォームは表示されたままである。
ここで、「破棄されたのになんで?」と悩まないでほしい。おそらくは「処理は流れるのよ~」というのをステップ実行などで見せるとそうせざるを得ないだけである。実際のところ、メッセージループ(C言語などでは出てくる。概念の説明は申し訳ないけれど省略)のようなもので実現しているのだろう。
話を元に戻そう。
モードレスの特徴は、フォームを表示したままExcelシートとの行き来ができることである。何に使うかは色々考えていただきたい。私の場合はフォームのボタンを押すとシート上でエラーチェック、その修正をフォームを出したまま実施し再びフォームのボタンを、というようなことに使ったりしている。
モードレスのフォームを1つ出して終わり、ならあまり気に病むことはない。
しかし、こんな欲が出てきたらどうなるだろうか?
・モードレスフォームからモーダルフォームを表示したい。つまり、モーダルフォーム表示中はモードレスフォームに遷移できないようにしたい。
・モードレスフォームから別のモードレスフォームを表示したい。つまり、フォームを自由に行き来したい。
後者は「利用者が訳分からなくなる」のであまり使われることはなかと思われるが、ない話ではないだろう。では前者はどうだろう。補助的なフォームを出すことはあるだろう。実際、私もそれをしたかった。
しかし、C言語関連の記事(出典を失念!見つけ次第明記します)によると、モーダルフォームとモードレスフォームは相性が悪く混在しない方がいい(できたとして、制御がかなり難しいと思う)とのこと。こちとらVBAではそんな制御ができるとは思えない。
次回になるか、もう少し先になるか、実務上対応した例を簡単に紹介する。