
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へ移るときにブックが閉じてしまいます。
右上の「×」を押したときだけブックを閉じるようにしたいのですが、どういうコードを書いたらいいのですか?
宜しくお願いします。(*´Д`人)
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.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から先に書く癖をつけておきましょう。
理由?
勉強しているうちに分かるでしょう。
以上。
No.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は全ての処理処理終了の直前にする。
思い違いでしょうか。
この回答への補足
VBAを勉強し始めて数ヶ月の初心者なので
正直な話、Load ~/~.Show の違いや、Unload ~/~.Hide の違いが
よくわかっていないのです。ネットで調べながら書いたコードなので
「なぜ毎回Unloadする必要があるか」はわかりません。
もしよければ、上記の詳しい使い方や使い分けを教えていただけないでしょうか?
宜しくお願いします。
No.2
- 回答日時:
UserFormのInitializeイベントを毎回処理しなくてもいいなら
UserForm2.Show 0
Me.Hide
といった具合で 自分自身を非表示にする事で QueryCloseへ飛ばなくてすみますよ
No.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
別のユーザーフォームのコマンドボタンを押す
Visual Basic(VBA)
-
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
-
4
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
5
エクセルVBAでマルチページの切り替え方法の件で
Excel(エクセル)
-
6
Excel ユーザーフォームをモードレスで表示後
Visual Basic(VBA)
-
7
UserForm1.Showでエラーになります。
工学
-
8
Excel VBA:フォーム←→セルのアクティブ切り替え
Excel(エクセル)
-
9
ユーザーフォームのテキストボックスに前回入力した値を表示する Excel
Visual Basic(VBA)
-
10
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
11
Excel VBA ユーザーフォーム 複数のユーザーフォームの閉じ方。
Visual Basic(VBA)
-
12
VBAでのユーザフォームの表示有無の確認について
Visual Basic(VBA)
-
13
エクセルVBA/マルチページ/ページ切り替え時
Access(アクセス)
-
14
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
15
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
16
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
17
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
18
ユーザーフォームでTextBox1にカーソルを移動したい
Excel(エクセル)
-
19
VBA フォームのテキストボックスにセルの値を表示させたいが改行していたら改行もあわせて表示させたい
Excel(エクセル)
-
20
vba userFormのSubを標準モジュールから呼び出す方法を教えてください
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】違うフォルダにある...
-
別ブックをダイアログボックス...
-
VBA 別ブックからコピペしたい...
-
VBA シートをコピーする際に Co...
-
2つ目のコンボボックスが動作...
-
VBSでExcelのオープン確認
-
ワイルドカード「*」を使うとう...
-
エクセル共有化のトラブル
-
Excelマクロ 該当する値の行番...
-
Excelのマクロコードについて教...
-
エクセル vba ある検索値を別ブ...
-
Excel2007VBAファイルの表示に...
-
【前回の続きです、ご教示くだ...
-
エクセルVBAが途中で止まります
-
エクセルのVBAコードについて教...
-
複数シート名とブック名が一致...
-
VBA シート名が一致した場合の...
-
Excel ファイルを指定し、指定...
-
【マクロ】実行時エラー '424':...
-
「段」と「行」の違いがよくわ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数のエクセルファイルとシー...
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
VBA 別ブックからコピペしたい...
-
エクセルVBAが途中で止まります
-
ワイルドカード「*」を使うとう...
-
VBAで別のブックにシートをコピ...
-
VBA コードを実行すると画面が...
-
VBAで別ブックのシートを指定し...
-
【ExcelVBA】zip圧縮されたCSV...
-
【Excel VBA】書き込み先ブック...
-
2つ目のコンボボックスが動作...
-
[Excel]ADODBでNull変換されて...
-
Excelマクロ 該当する値の行番...
-
VBA 実行時エラー 2147024893
-
Excelのマクロコードについて教...
-
Excel にて、 リストボックスの...
-
【ExcelVBA】インデックスが有...
-
VBA アプリケーション定義また...
-
【Excel VBA】表の列の値毎に分...
おすすめ情報