dポイントプレゼントキャンペーン実施中!

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

A 回答 (2件)

モーダルの上からモードレスで開くことはできません。

(のはず)

最上位に表示されているフォームがモーダルである必要があるので、
フォーム間の移動をボタンのみに限定して、ボタンをクリックしたら
モーダルなダイアログと移動先のダイアログを一旦閉じて、
それぞれモードレスとモーダルで開き直せば擬似的に実現できるかなぁってところですね。
面倒ですが。

標準モジュールに以下を書きます。
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で読み込むようにすれば表示内容も保てると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
やっぱり無理ですか-

試してみたのですがうまくいきませんね-・・・
片一方しか動かせないですね

お礼日時:2009/05/09 00:10

ええ、残念ながら最上位のフォームからマウスクリックで別のフォームを選択することができません。


だからこそのモーダルフォームと言えます。

他のフォームをアクティブにするためのボタンを作って、サンプルで示したようなやり方でモーダルとモードレスを切り替えれば
エクセル本体にはアクセスさせないままフォームだけを操作できるかなぁ、ということで「擬似的に実現」と書いたわけです。

以上、補足でした
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/09 01:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!