- 締切済み
ユーザーフォームの切り替えについて・・・
UserForm1とUserForm2の2つのユーザーフォームがあります。 UserForm1の中にあるcommandButton1をクリックすると、UserForm2が表示される仕組みになっています。 (ちなみに、UserForm2にもコマンドボタンがあり、クリックするとUserForm1に戻るようになっています) UserForm1の方に、 Private Sub CommandButton1_Click() UserForm2.Show 0 Unload UserForm1 End Sub UserForm2の方に、 Private Sub CommandButton1_Click() UserForm1.Show 0 Unload UserForm2 End Sub と記述してあります。 ところが、それぞれのユーザーフォームには、閉じると同時にブックが閉じるように Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ActiveWorkbook.Save 'ブックを保存 ActiveWorkbook.Close 'ブックを閉じる Application.Quit 'excelを終了 End If End Sub というコードを記述しているため、UserForm1からUserForm2へ移るときにブックが閉じてしまいます。 右上の「×」を押したときだけブックを閉じるようにしたいのですが、どういうコードを書いたらいいのですか? 宜しくお願いします。(*´Д`人)
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- onlyrom
- ベストアンサー率59% (228/384)
>というコードを記述しているため、UserForm1からUserForm2へ移るときにブックが閉じてしまいます。 >右上の「×」を押したときだけブックを閉じるようにしたいのですが QueryCloseイベントプロシージャ Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) これを見て、何故、引数Cancel、CloseModeを調べてみないのですか? 答えは、そこにあるのですよ。 と、偉そうなことを言ってみる、、(^^;;; 詳しくはヘルプを見てください。 UserFormの閉じるボタンを押してUserFormを閉じるときは、 QueryCloseイベントの引数CloseModeが0となりますので、 それをきけばいいわけです。 '------------------------------------------------- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then ActiveWorkbook.Save Application.Quit ActiveWorkbook.Close End If End Sub '-------------------------------------------------- そしてまた、Application.Quitは、ActiveWrokbook.CLoseより先におかないと、ブックは終了しますが、エクセルは終了しません。 それから、 Private Sub CommandButton1_Click() UserForm2.Show 0 Unload UserForm1 End Sub これでは、 Unload UserForm1 Userform2.Show 0 と、Unloadから先に書く癖をつけておきましょう。 理由? 勉強しているうちに分かるでしょう。 以上。
- imogasi
- ベストアンサー率27% (4737/17069)
何か適当な機会(または初期化で)に Sub test01() Load UserForm1 UserForm1.Show End Sub ーー Userform1のコマンドボタン1の Private Sub CommandButton1_Click() Me.Hide UserForm2.Show vbModeless End Sub ーー Userform2のコマンドボタン1の Private Sub CommandButton1_Click() UserForm1.Show vbModeless Me.Hide End Sub でそれぞれのコマンドボタンクリックでを行うと、フォームを交互に何度も表示が入れ替わりましたが。 なぜ毎回Unloadする必要があるのですか。 1時的に書いて見てもらう黒板と思って毎回それぞれのフォームに表示する前にプログラムで内容を細工すれば良いと思いましたが。 Unloadは全ての処理処理終了の直前にする。 思い違いでしょうか。
- redfox63
- ベストアンサー率71% (1325/1856)
UserFormのInitializeイベントを毎回処理しなくてもいいなら UserForm2.Show 0 Me.Hide といった具合で 自分自身を非表示にする事で QueryCloseへ飛ばなくてすみますよ
- B_Taka-B
- ベストアンサー率50% (1/2)
フラグを使用して制御してあげると実現可能です。 (他にもっと良いやり方があるかもしれませんが・・・) ・標準モジュールへグローバル変数を用意する Publc lngFlg as Long ・UserForm1 Private Sub UserForm_activate() 'フラグ初期化 lngFlg = 0 End Sub Private Sub CommandButton1_Click() 'フラグ設定 lngFlg = 1 Unload UserForm1 UserForm2.Show 0 End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If lngFlg = 0 Then ActiveWorkbook.Save 'ブックを保存 ActiveWorkbook.Close 'ブックを閉じる Application.Quit 'excelを終了 End If End Sub ・UserForm2 Private Sub UserForm_activate() 'フラグ初期化 lngFlg = 0 End Sub Private Sub CommandButton1_Click() 'フラグ設定 lngFlg = 1 Unload UserForm2 UserForm1.Show 0 End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If lngFlg = 0 Then ActiveWorkbook.Save 'ブックを保存 ActiveWorkbook.Close 'ブックを閉じる Application.Quit 'excelを終了 End If End Sub
補足
VBAを勉強し始めて数ヶ月の初心者なので 正直な話、Load ~/~.Show の違いや、Unload ~/~.Hide の違いが よくわかっていないのです。ネットで調べながら書いたコードなので 「なぜ毎回Unloadする必要があるか」はわかりません。 もしよければ、上記の詳しい使い方や使い分けを教えていただけないでしょうか? 宜しくお願いします。