• ベストアンサー

複数フォームを1ボタンクリックで終了させる方法

VB6.0 WindowsXP (症状) 複数フォームを1クリックで終了できずに困っています。 理由は他のフォームに移ったときにボタンの位置やテキストの内容を残しておきたい為にunloadさせずに、 Me.Hideだけでフォームを移動しているためだと思います。 終了のときは、下記のコードを用いて、終了させています。 標準モジュールに Public Sub sAllEnd() Dim myObject As Object For Each myObject In Forms Unload myObject Set myObject = Nothing Next End Sub をおいて、 各フォームには Private Sub Form_Unload(Cancel As Integer) Dim myResult As Integer myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult = vbCancel Then Cancel = True End If Call sAllEnd End Sub 終了メッセージのOKボタンを開いたフォームの枚数分だけクリックしないと終了できない状態です。 これを1クリックで終了できるようにするためにはどうしたら良いでしょうか? よろしくお願いします。

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

  • ベストアンサー
回答No.5

>このページにendは使わないほうがいいと書かれていたので、Endは避けておりました。 Private Sub Form_Unload(Cancel As Integer) Dim myResult As Integer myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult = vbOK Then Unload Form1 Else Cancel = True End If End Sub でしたらこのようにやればいいのではないかな。 Form1がメインウィンドウ

その他の回答 (5)

noname#22222
noname#22222
回答No.6

s_husky です。 配列を利用すればどうでしょうか? Access のデータベースを全て一つの変数に収め、1レコードに記録するという無茶なこともやっています。

noname#22222
noname#22222
回答No.4

s_husky です。 1行追加すれば、一応、全てが閉じます。 Private Sub Command2_Click()   Dim myObject As Object   For Each myObject In Forms     SendKeys "{ENTER}", False     Unload myObject     Set myObject = Nothing   Next End Sub

yoshi004
質問者

補足

ありがとうございます。 一応ワンクリックでできましたが、 終了させて、コードを見ると改行の後が出ました。 これはフォームを閉じてる分改行が加わっているのでしょうか? また、キャンセルの場合、元のフォームが前面には出ませんでした。

noname#22222
noname#22222
回答No.3

横から失礼! <フォームを閉じる時の状況を記憶してオープン時に再現する> 1、ユーザ定義の構造体変数に情報を記録する。 2、ランダムファイルに1レコードで記録する。 3、ランダムファイルから1レコードを呼び込む。 私は、こんな手を使っています。 書き込みや呼び込みの手続きは、BLoad()、BSave() などの関数にすればいいと思います。

yoshi004
質問者

お礼

ありがとうございます。 標準モジュールで構造体を宣言すれば、どのフォームでも呼び出せますでしょうか? これはフォームにあるコントロールの数だけ、構造体に変数を用意しなければならないでしょうか? 例えばform1にテキストボックスが2つ、チェックボックスが1つ、form2にチェックボックスが4つあったとすると、 構造体には4つ分格納しておく変数が必要でしょうか?

yoshi004
質問者

補足

ありがとうございます。「構造体変数」「ランダムファイル」「レコード」などが分からないので調べてみます。 すみませんNo.3に記述しましたが、No.2の方に書いていただいたコードを使っても終了には開いたフォームの回数「OK]を押さなければ終了できませんでした。

回答No.2

QueryUnloadイベントを使って、終了確認をするのは 「ユーザーが、フォームのコントロールメニューの [閉じる] をクリックした。」時だけにすれば良いのでは。 Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer)  If unloadmode=vbFormControlMenu Then   myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認")   If myResult <> vbOK Then    Cancel = True    Exit Sub   End If   Call sAllEnd  End if End Sub ※ インデントのために全角スペース使用。

yoshi004
質問者

お礼

ありがとうございます。 できました。 コントロールで「終了」ボタンを作った際に クリックして同じことをさせたいのですが、 どのようにコードを作ればよろしいでしょうか?

yoshi004
質問者

補足

ありがとうございます。 さっそく試してみます。 フォームの中のコントロールのチェックやテキストボックスにかかれた数値などを一括して記憶できる変数や命令などはあるのでしょうか? 一旦unloadして、他のフォームにうつっても戻ってきた時にその変数や命令などを関数を呼び出せば元に戻せそうだと思ったのですが。 よろしくお願いします。

回答No.1

Private Sub Form_Unload(Cancel As Integer) Dim myResult As Integer myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult = vbOK Then End Else Cancel = True End If End Sub これだけでいいんじゃないのか?

yoshi004
質問者

お礼

ありがとうございます。言葉足らずですみません。 http://www.nurs.or.jp/~catty/vbasic/vbform.html このページにendは使わないほうがいいと書かれていたので、Endは避けておりました。

関連するQ&A

  • キャンセルボタンをクリックしたかどうかを取得したい

    InputBoxでもしキャンセルボタンが押されたら・・・ってどうやればいいですか? Sub あああ() Dim a As String a = InputBox("文字を入れてください。") MsgBox a End Sub をした時に、キャンセルボタンをクリックしたかどうかを取得したいのですが、どうすればいいんですか? a = InputBox("文字を入れてください。") の次に Cancel = True をいれても vbCancel = True をいれてもエラーになります。 Sub あああ() Dim a As String a = InputBox("文字を入れてください。") If a = "" Then MsgBox "キャンセルが押されました" End If End Sub これだとOKでもキャンセルでもメッセージが表示されます。

  • フォームのボタンからのみexcelを終了したい

    おねがいします。 都合上、フォームのボタンからだけexcelを終了したのです。 Private Sub CommandButton1_Click() Application.DisplayAlerts=False Application.Quit End Sub それに伴い、 右上のexcelのxボタン、シートのxボタンを無効化または非表示にしたいです。 Private Sub Workbook_BeforeClose(Cancel As Boolean)      If CloseMode = 0 Then     Cancel = 1   End If End Sub これで、エクセルxボタンは無効になりましたが、 フォームからの終了も出来なくなってしまいました。 フォームからのみ終了する方法を教えてください。

  • ExcelVBA:フォームの閉じるボタン「×」を消す方法

    ExcelVBAで、ユーザーフォームの閉じるボタン「×」を使用できなくなる方法は以下のコードで教わったのですが「×」自体消す方法ってあるでしょうか? Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = 1 End Sub 回答よろしくお願いします。

  • フォームを閉じないようにする VB6 SP6

    VB6 でプログラムを作成中です。 プログラムを実行して、フォームが立ち上がった所で右上の×を押し、画面を閉じようとします。 そこで以下のコードで、もし×が押されたらvbYesNoメッセージボックスを表示させ、もし「いいえ」が押されたらフォームを閉じないようにし、実行画面を維持したいのです。 しかし、Exit Sub ですとプログラムが終了してしまい、困っています。宜しくお願い致します。 Private Sub Form_Unload(Cancel As Integer) 'フォームを閉じる Dim last As String last = MsgBox(" プログラムを終了させますか?", vbYesNo, "終了確認1") If (last = vbYes) Then Dim last2 As String last2 = MsgBox(" 本当にプログラムを終了させますか?", vbYesNo, "終了確認2") If (last2 = vbNo) Then Exit Sub End If End If If (last = vbNo) Then Exit Sub End If End Sub

  • access フォームについて

    access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub

  • フォームが見えなくなっちゃう

    フォームに、コマンドがあって、それをクリックすると終了確認が出るようにしました。 Dim MSG as integer MSG = msgbox("終了しますか?",vbYesNo,"確認") If MSG = 6 then end end if ちゃんと終了はできるのですが、Msgboxが出ている時にフォームが表示されないんです。キャンセルすると再び見えるんですが、どうすれば直るでしょうか。

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

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

  • VBA 標準モジュールとフォーム

    ある標準モジュール内で生成した変数の値をフォームのコマンドボタンをクリックしたら表示されるプログラムはどうやってつくるのですか? 標準モジュール sub test() dim a as integer dim b as integer dim sum as string a=5 b=1 sum=a+b End sub フォームのコマンドボタンクリック Sub CommandButton1_Click() MsgBox sum End Sub 標準モジュールで計算した答えがフォームのコマンドボタンをクリックしたら答え6が表示されるようにしたいのですが、どうしたらできますか?

  • クリックするたびに、フォームが複数表示される

    下記のコードだと Private Sub Button1_Click(・・・ Dim f2 As New Form2() f2.Show() End Sub ボタンをクリックするたびに、同じフォームが表示されます。 同じフォームが開かないようにしたいのですが、どうすればいいのでしょうか? バージョンは、Visual Basic .NETです。 よろしくお願いします。

  • ExcelVBAユーザーフォームの終了方法

    ExcelVBAのユーザーフォームについて教えて下さい。 マルチページで作成し、アイコンをクリックしてファイルを開くと、マルチページのみが表示される仕様にしました。 <ThisWorkbook> Private Sub Workbook_Open() Application.Visible = False UserForm.MultiPage1.Value = 0 UserForm.Show End Sub そして、マルチページ内にボタンを配置して、そのボタンをクリックすると、マルチページが終了するとともに、マルチページが埋め込まれているExcelファイルを(他のExcelファイルが動作中はそれらは何もしないでそのまま)閉じたいのです。 <UserForm> Private Sub CommandButton_Click () Dim msg As String, title As String msg = "プログラムを終了します。よろしいですか?" title = "終了確認" Dim res As Integer res = MsgBox(msg, vbYesNo + vbInformation, title) If res = vbYes Then Unload Me End Sub と書いてみました。 マルチページの画面はExcelの作業画面なしに開きます。ボタンをクリックするとマルチページが終了します。 ですが、「マルチページが閉じてExcelの作業画面も表示されず、一見終了したように見えるが、タスクマネージャーのプロセスではEXCEL.EXEが動作している」ことがあったり(他にExcelファイルを開いていないときも同様です)、「マルチページ終了後にExcelの何もない作業画面が表示」されます。そのファイルを閉じてもよいのですが、せっかくマルチページで、単独のアプリのようにしているので、マルチページを閉じて、Excelを閉じて…という、二度手間的なことはしたくないと思っています。 マルチページに配置したボタンをクリックしただけで、マルチページを終了させ、マルチページが埋め込まれているExcelのみも正常に終了させることはできますでしょうか? ご教授頂きたくお願い致します。 ちなみに「×」ボタンでの終了はNGとしています。

専門家に質問してみよう