• ベストアンサー

Access2002 終了時の処理

フォーム及びアクセスを誤って終了させることのないよう、フォーム内ボタンもしくは右上×をクリックした時、以下のモジュールで確認ボタンを表示させようとしています。 ======================== Private Sub Form_Close() '閉じるとき確認 2004/6/9 If MsgBox("システムを終了しますか?", vbYesNo + vbQuestion, _ "終了確認") = vbNo Then Cancel = False End If End Sub ======================== システムを終了しますか?のコメントとともにYes No ボタンも出ますが、Noを押しても終了してしまいます。終了しないようにするにはどのようにすればよいのでしょうか? いつもすみません。よろしくお願いします。

  • Swim
  • お礼率79% (248/313)

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

  • ベストアンサー
  • guruguru2
  • ベストアンサー率29% (39/132)
回答No.7

#1です。 どうしても、終了ボタンを押した時とFrom_Unlaod時で 同一の関数を呼び出したい時は、フラグを引数として 共通関数を呼び出してみたらいかがでしょう? ↓サンプルです。 Private Sub cmdEnd_Click() Dim intFlg As Integer intFlg = 1 Call Terminate(intFlg) End Sub Private Sub Form_Unload(Cancel As Integer) Dim intFlg As Integer intFlg = 2 Cancel = Terminate(intFlg) End Sub Public Function Terminate(intFlg As Integer) As Boolean On Error Resume Next Terminate = False Select Case intFlg Case 1 '呼び出し元が終了ボタンクリック時 DoCmd.Close acForm, Me.Name Case 2 '呼び出し元がForm_Unload時 If MsgBox("システムを終了しますか?", vbYesNo + vbQuestion, "終了確認") = vbNo Then Terminate = True End If End Select End Function ただ、コード的には前に書いたほうが短いんですけどね。(^^; こっちのほうがすっきりしているように見えますが、 ま、お好みのほうをご使用ください。 ではでは。ご参考までに。

Swim
質問者

お礼

ありがとうございます。何度もすみません。 実は終了時に別の作業をするために標準モジュールにひとつ入っています。途中のアドバイスではterminateとうまく連結できたのですが、最後の二つはうまくいきませんでした・・・。 アクセス知識レベルが低く、こなすことも出来ず・・。沢山お時間を割いていただいたのに本当にすみませんでした。ありがとうございました。

その他の回答 (6)

  • guruguru2
  • ベストアンサー率29% (39/132)
回答No.6

またまた失礼いたします。 #4さんへの補足への質問です。 >でも、隣にあるLoginボタンも、終了しますか?の 画面(Yes+No)が出てきてしまうのです。 どういったコードを書かれたのかを知りたいのですが…。 >ところで、現在、アクセス内にある全部の終了ボタン及び右上×クリック時にCloseするとき、システム終了という全体モジュールに飛ぶようになっているのですがそこで操作できないのでしょうか? Private Sub End_Click() On Error Resume Next DoCmd.Close acForm, Me.Name End Sub Private Sub Form_Unload(Cancel As Integer) Cancel = Terminate End Sub Public Function Terminate() As Boolean On Error Resume Next Terminate = False If MsgBox("システムを終了しますか?", vbYesNo + vbQuestion, "終了確認") = vbNo Then Terminate = True End If End Function 終了ボタンからはフォームの終了だけで良いです。 フォームの終了がForm_Unloadを勝手に呼び出すので 必要ないですね。Form_Unloadだけで呼び出してください。 ではでは。

  • guruguru2
  • ベストアンサー率29% (39/132)
回答No.5

#1です。 #4さんとほとんど同じなのですが、 Private Sub End_Click() On Error Resume Next '←(1)エラー無視 DoCmd.Close acForm, Me.Name '←(2)フォームを閉じる End Sub でやってみてください。(1)を記入する理由は(2)でForm_Unloadイベントが キャンセルした時にエラーが発生してしまうのを抑制する為です。 テスト済みなので大丈夫です。やってみてください。(^^)

Swim
質問者

補足

ありがとうございます。 終了ボタンクリック時1回目は成功したのですが、もう1度終了しますかが出てきて、Noとすると閉じてしまいます。#4さんの補足でお願いしたのですが、全体モジュールで対応する策はないのでしょうか?

回答No.4

#2です。 #1さんへの回答に対する補足でのことなんですが、ボタン内の終了をどうやってるのかわからないんで、自信はありませんが。 実際、自分で質問者さんと同じ状態と思われるフォームを作ってみましたが。 終了ボタンのClickイベントのコードを、 Private Sub ボタン_Click() On Error GoTo Err_Trap DoCmd.Close acForm, Me.Name Exit Sub Err_Trap: Resume Next End Sub としてみてください。 おそらくうまくいくと思います。

Swim
質問者

補足

再度の回答ありがとうございます。 終了ボタンで成功しました。 でも、隣にあるLoginボタンも、終了しますか?の 画面(Yes+No)が出てきてしまうのです。 ところで、現在、アクセス内にある全部の終了ボタン及び右上×クリック時にCloseするとき、システム終了という全体モジュールに飛ぶようになっているのですがそこで操作できないのでしょうか? 何度もすみません。

  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.3

> Private Sub Form_Close() 閉じる時イベントには、Cancel 引数がないので、読み込み解除時イベントを 使ってみてください。

Swim
質問者

お礼

回答ありがとうございます。

回答No.2

はじめまして。 上記コードを、Closeイベントでなくて、UnLoadイベント(読み込み解除時)の中にコードを記述し、 さらにコードを、 Cancel=False から Cancel=True に変更してください。

  • guruguru2
  • ベストアンサー率29% (39/132)
回答No.1

こんにちわ。 きっと↓こうですね。 UnloadイベントでCacelが使用できます。 あとイベントを中止したい時はCacelはTrueですね。 Private Sub Form_Unload(Cancel As Integer) If MsgBox("システムを終了しますか?", vbYesNo + vbQuestion, "終了確認") = vbNo Then Cancel = True End If End Sub ではでは。

Swim
質問者

補足

早速の回答ありがとうございます。 右上の閉じるをクリックした場合、Noはきちんと反応して終了しないのですが、フォーム内のボタンを押すと、Noで終了してしまいます。 ボタン内に、同じモジュール入れましたが結果は2回Yes Noの確認を聞かれるだけで・・・。 お時間ありましたら、もう一度よろしくお願いいたします。

関連するQ&A

  • EXCEL2010 VBA 複数処理の終了

    EXCEL2010 VBAでコマンドボタンを押すと複数の処理を実行するようにしています。 Sub 実行() 処理A 処理B Ens sub 処理Aでは実行時に確認画面が出てNOを選択すると処理が終了するようにしています。 確認画面は下記の様な形です。 If MsgBox("処理を実行しますか?", vbYesNo + vbQuestion, "確認") = vbNo Then Exit Sub End If この処理Aの確認画面でNOを選択すると処理Aだけでなく処理Bも実行せず 終了するようにしたいのですが何か良い方法はないでしょうか? Exit Subにかわるすべての処理を終了させるコマンドがあれば良いのですが。。。

  • VBAでエクセル終了

    エクセル2000です。 VBAで「閉じる」ボタンを作りました。 Sub closeボタン() myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbNo Then Exit Sub ThisWorkbook.Close End Sub ところが作動させると「いいえ」を選ぶとすんなり終了してくれますが、「はい」にすると「変更を保存しますか?」を何故か続けて2回も聞いてきます。 2回目も「はい」にすると今度はブック保存のダイアログが出てきて、ブック名が「:」(半角コロン)になってます。 変だなあ、と思い上記のマクロを別ブックを新たに作って標準モジュールに張ってみると正常に作動します。 もとのブックに何かあって、こんな現象が起きているのでしょうか? とっても困ってます。

  • フォームを閉じないようにする 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 VBA エラートラップでの終了処理

    お世話様です。 Access2003 VBA にて、各プロシージャに貼ったエラートラップで、 メッセージを出力した後にAccessを終了したいと考えております。 ここで、通常終了時(フォームの×ボタン押下時)の 終了確認メッセージをForm_Unloadイベントで記述しているのですが、 エラートラップでの終了時にも、このメッセージが表示されてしまいます。 エラートラップでの終了時は、終了確認メッセージを表示させたくないので、 標準モジュールにパブリック変数のエラーフラグを用意し、 それで判断しようと考えたのですが、 エラートラップ内でエラーフラグに値を設定しても保持されず、 Form_Unloadイベントで終了確認メッセージがどうしても表示されてしまいます。 何か良い方法はありますでしょうか?よろしくお願いいたします。 例: '***ボタンAクリックイベント******************* Private Sub btn_A_Click() On Error GoTo ERR_LINE   <何らかの処理> Exit Sub ERR_LINE:   MsgBox "予期せぬエラーが発生しました。終了します。" & Chr(13) & _       "エラー番号: " & Err.Number & Chr(13) & _       "エラー内容: " & Err.Description, vbCritical + vbOKOnly, "例外エラー"   bl_ErrFlg = True 'エラーフラグ設定←保持されない   Application.Quit End Sub '***フォームアンロードイベント******************* Private Sub Form_Unload(Cancel As Integer)   If bl_ErrFlg = False Then     Cancel = MsgBox("終了します。よろしいですか?",vbQuestion + vbYesNo, "終了確認") = vbNo   End If End Sub

  • プログラムのイベント処理中断方法

    VB2008のイベンド中止処理についてお教え頂けませんでしょうか。 Formにボタンが1つあり、クリックするとCSVファイルが出力される処理をしたいです。 やりたい処理: 1. 「CSVファイル出力しますか?」というメッセージを出す。YESなら処理続行。Noなら処理中止。 2. CSVファイル出力処理。 3. 「CSVファイルを出力しました。」 (プログラム自体を終了したいわけではありません) VBAだと下記のようなコードを書きたいです。 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end end if 'CSV出力処理~~~ end sub VBにendというステートメントがあれば、良いのですが無さそうです・・・ 何か上手な処理はあるでしょうか?VBAのコードになってしまいますが、下記のような処理方法しかないでしょうか? '''''''''''''''''1 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end else 'CSV出力処理~~~ end if end sub ''''''''''''''''2 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then goto here end if 'CSV出力処理~~~ here: end sub

  • ACCESS2000 ボタンメッセージについて

    ACCESS2000を使用しております。 フォームのボタンを押すとレポートが開くようになっています。 フォームのフィールド「終了日」がうるう年の2/28だったら、ボタンを押した時に警告のメッセージが出るようにしたいです。 現在は以下の通り、「終了日」を更新した時にメッセージが出るようにしています。 --- Private Sub 終了日_BeforeUpdate(Cancel As Integer) Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?" If Format(Me.終了日.Text, "mdd") = "228" And _ IsLeapYear(Year(Me.終了日.Text)) Then If MsgBox(cMsg, vbYesNo) = vbNo Then Cancel = True End If End If End Sub --- これをボタンの方にも流用しようと思い、(終了日を更新しない状態でもボタンを押すことがある為、その時点でもチェックを掛けたい) 以下を「マウスボタン解放時」に入れてみましたが、エラーが出てしまいました。 --- Private Sub Ctl_新_証書新規_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?" If Format(Me.終了日.Text, "mdd") = "228" And _ IsLeapYear(Year(Me.終了日.Text)) Then If MsgBox(cMsg, vbYesNo) = vbNo Then Cancel = True End If End If End Sub --- エラー内容は以下の通りです。 実行時エラー'2185' コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。 そのままコピペしたので、値の更新をするとかしないとか、 ボタンを押した場合では関係ないので、その辺がエラーになっているのだと思うのですが、 どこを直したら良いのか分からず、お知恵をお貸し下さい。 要は、ボタンを押した時に警告メッセージを出し、「はい」であればレポートを開き(クリック時に開くマクロが入ってます)、「いいえ」であれば、開かずに元の画面のままが良いです。 宜しくお願いいたします。

    • ベストアンサー
    • Skype
  • ACCESSのフォーム

    ACCESSのフォームでデータを入力しています。 既に入力したデータを誤って上書きしないように、更新前処理で下記のコードを入れました。 Private Sub 単価_BeforeUpdate(Cancel As Integer) If MsgBox("変更を保存しますか?", vbYesNo) = vbNo Then Me.Undo End If End Sub 入力済のデータを上書きする時はこの方法で良いのですが、新規に入力する時にも同じように確認メッセージが出てしまいます。 新規入力の時には確認メッセージを出さない方法があったら教えて下さい。 よろしくお願いします。

  • アクセスの登録について。(その2)

    先ほど質問したばかりなのですが、追加で質問です。 登録が自動でされないように下記のように記述するように教えてもらい登録のたびに確認がでるようになりまいた。でも、変更したらいけないところを間違って変更した場合、登録を「いいえ」にすると、登録はされないのですが、「指定したレコードに移動できません」のコメントがでます。登録しない場合は、元のデータのままにもどしたいのですが、元のデータにはもどれません。どのようにしたらよいでしょうか? 何度もすみません。 <フォームのイベントの中の、「更新前処理」に次のモジュールを書い<てみてください。 <Private Sub Form_BeforeUpdate(Cancel As Integer) <If MsgBox("登録しますか?", vbYesNo) = vbNo Then <Cancel = -1 <End If <End Sub <いいえを押した場合は、登録されません。

  • 複数フォームを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クリックで終了できるようにするためにはどうしたら良いでしょうか? よろしくお願いします。

  • IF文の使い方を教えてください

    もし A5001 に データがあるのなら処理を中止し、データが無ければ処理を継続する。内容のマクロを考えてますが、 A5001にデータがないなら処理を中止は下記の記述で良いかと思いますが、 逆にあったら処理を中止する記述はどうすればよいのですか? Value が怪しいかと思うのですが・・・・ お願いします。 If Range("読み込み!A5001").Value = "" Then MsgBox "データがありません", vbOKOnly, "データ有無確認" Exit Sub End If ret = MsgBox("過去のシュミレーションデータを削除します。よろしいですか?", vbYesNo + vbQuestion, "データ削除実行確認") If ret = vbNo Then Exit Sub End If

専門家に質問してみよう