• ベストアンサー

エクセルVBAでサブフォーラムの作成方法

親となるフォームをモーダルで開き、親フォームから子となるフォームをモードレスで開く方法はあるのでしょうか? フォーム表示中、エクセル本体の操作を不可にさせておきたいのです。 わかる方がいらっしゃいましたら、ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.1

モーダルの上からモードレスで開くことはできません。(のはず) 最上位に表示されているフォームがモーダルである必要があるので、 フォーム間の移動をボタンのみに限定して、ボタンをクリックしたら モーダルなダイアログと移動先のダイアログを一旦閉じて、 それぞれモードレスとモーダルで開き直せば擬似的に実現できるかなぁってところですね。 面倒ですが。 標準モジュールに以下を書きます。 Public Sub TerminateForm(obj As Object) On Error GoTo EXIT_Term obj.Hide Set obj = Nothing EXIT_Term: End Sub フォーム1(親)にボタンをつけて、フォーム2(子)を呼び出すコード Private Sub CommandButton1_Click() '子フォームをモーダルで呼び出す Call TerminateForm(UserForm1) 'モーダルなフォームを消す Call TerminateForm(UserForm2) '移動先のフォームを消す UserForm1.Show vbModeless '元フォームをモードレスで表示 UserForm2.Show vbModal '移動先フォームをモーダルで表示 End Sub フォーム2(子)から、フォーム1(親)に戻るコード Private Sub CommandButton1_Click() '親フォームに戻る Call TerminateForm(UserForm2) Call TerminateForm(UserForm1) UserForm2.Show vbModeless UserForm1.Show vbModal End Sub それぞれのフォームのプロパティかInitializeイベントでフォームの表示位置を決定しておくといいかもしれません。 TerminateFormを呼ぶと親フォームの表示内容(リストボックスとか)が初期化されてしまうので、 削除する前にグローバル変数に内容を格納しておいて、Initializeで読み込むようにすれば表示内容も保てると思います。

ester09
質問者

お礼

ありがとうございます。 やっぱり無理ですか- 試してみたのですがうまくいきませんね-・・・ 片一方しか動かせないですね

その他の回答 (1)

  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.2

ええ、残念ながら最上位のフォームからマウスクリックで別のフォームを選択することができません。 だからこそのモーダルフォームと言えます。 他のフォームをアクティブにするためのボタンを作って、サンプルで示したようなやり方でモーダルとモードレスを切り替えれば エクセル本体にはアクセスさせないままフォームだけを操作できるかなぁ、ということで「擬似的に実現」と書いたわけです。 以上、補足でした

ester09
質問者

お礼

どうもありがとうございます。 フォームのヘルプ画面として親フォームの横にくっつけて表示させたかったのですが、シートにヘルプを作って表示させることにしました。

関連するQ&A