こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ユーザーフォームの切り替えについて・・・

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へ移るときにブックが閉じてしまいます。
右上の「×」を押したときだけブックを閉じるようにしたいのですが、どういうコードを書いたらいいのですか?
宜しくお願いします。(*´Д`人)

投稿日時 - 2008-05-06 15:14:39

QNo.4001720

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>というコードを記述しているため、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から先に書く癖をつけておきましょう。
理由?
勉強しているうちに分かるでしょう。
以上。

投稿日時 - 2008-05-06 18:40:55

ANo.3

何か適当な機会(または初期化で)に
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は全ての処理処理終了の直前にする。
思い違いでしょうか。

投稿日時 - 2008-05-06 17:59:22

補足

VBAを勉強し始めて数ヶ月の初心者なので
正直な話、Load ~/~.Show の違いや、Unload ~/~.Hide の違いが
よくわかっていないのです。ネットで調べながら書いたコードなので
「なぜ毎回Unloadする必要があるか」はわかりません。
もしよければ、上記の詳しい使い方や使い分けを教えていただけないでしょうか?
宜しくお願いします。

投稿日時 - 2008-05-06 18:06:23

ANo.2

UserFormのInitializeイベントを毎回処理しなくてもいいなら

UserForm2.Show 0
Me.Hide

といった具合で 自分自身を非表示にする事で QueryCloseへ飛ばなくてすみますよ

投稿日時 - 2008-05-06 16:31:03

ANo.1

フラグを使用して制御してあげると実現可能です。
(他にもっと良いやり方があるかもしれませんが・・・)

・標準モジュールへグローバル変数を用意する
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

投稿日時 - 2008-05-06 15:54:44

あなたにオススメの質問