• ベストアンサー

ACCESS VBAのMSGBOXで以降の処理を中止したい時・・・。

こんばんは。 ACCESS VBAにて、MSGBOXの返り値がVBNOの際に以降の処理を中止したいと思っています。 以前はEndと記載していましたが、グローバル変数の値が初期化されたり弊害があると言われたためExit functionやExit subに置き換えた所、そのFunction以降のFunction(元々コマンドボタンクリックでいくつかのPublic Functionが動くようになっています)に処理が移ってしまい困っています。 そもそも書き方に問題があるのかもしれませんが、ご存知の方いたら教えてください。連休中の宿題って感じです。(涙)よろしくお願いします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

大規模に現状のコードを修正しないで済みそうな方法としては、エラー トラップを利用する方法かと思います。 下記のコードはあくまでテスト用なので、関数は中身のない適当なものです。 読み取ってほしいのは、MsgBox で No が選択された場合にエラーを発生させ、 MainProc のエラーハンドラに戻している点です。 10回「Resume?」に Yes をクリックすると、コード中のコメント(A)により "SampleFuncA を抜けます" と表示されますが、途中 No をクリックした場合 これが表示されません。つまり、SampleFuncA の実行は途中で終了されます。 Public Const FORCE_BREAK_CODE As Long = 50000 Public gsTest As String Sub MainProc()   Dim n As Long      On Error GoTo Err_   gsTest = "テストです"   MsgBox "完走しましたよ N:=" & CStr(SampleFuncA(1)) Bye_:   MsgBox "Public 変数 gsTest:=" & gsTest   Exit Sub Err_:   Select Case Err.Number     Case FORCE_BREAK_CODE        MsgBox "ユーザーキャンセル", vbInformation     Case Else        MsgBox Err.Description, vbCritical   End Select   Resume Bye_ End Sub ' // サンプル関数A Public Function SampleFuncA(ByVal n As Long) As Long   While n < 10     n = SampleFuncB(n)   Wend   SampleFuncA = n   MsgBox "SampleFuncA を抜けます" ' // (A) End Function ' // サンプル関数B Public Function SampleFuncB(ByVal n As Long) As Long   If MsgBox("N:=" & CStr(n), vbYesNo, "Resume?") = vbNo Then     Err.Raise FORCE_BREAK_CODE '// <--- ココでエラーを発生させる   End If   SampleFuncB = n + 1 End Function

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

前回の質問で回答した者です。 http://oshiete1.goo.ne.jp/qa3398452.html MsgBoxでvbNoを選択した場合に、Functionの戻り値を変えることはできないでしょうか。 とりあえず、ごく簡単なサンプルを以下に書きます。 内容としては、  ・コマンドボタンをクリックすると、ParentFunc関数が呼び出される  ・ParentFunc関数は、さらにChildFunc1及びChildFunc2関数を呼び出す  ・ChildFunc1関数は、引数がNullだった場合、0に置換するかを確認・実行する  ・ChildFunc2関数は、2つの引数の大小をMsgBoxで表示する となっています。 「テキスト1=1」「テキスト2=Null」の状態でコマンド1をクリックすると、「0とみなしますか」の MsgBoxが表示されます。 これに対してvbNoを選択した場合・・・  ・現状のコード:    ChildFunc2がそのまま続行され、Nullには等号・不等号の関係が成り立たないので    評価結果は「Else」となるため、 「ともに等しい」のMsgBoxが表示されます。  ・変更後のコード:    処理が途中で中止され、大小関係についてのMsgBoxは表示されなくなります。 <現状の例> Private Sub コマンド1_Click() On Error Resume Next   Call ParentFunc(テキスト1,テキスト2) End Sub Public Function ParentFunc(IntA, IntB) On Error Resume Next   Call ChildFunc1(IntA, IntB)   Call ChildFunc2(IntA, IntB) End Function Private Function ChildFunc1(IntA, IntB) On Error Resume Next   If IsNull(IntA)=False And IsNull(IntB)=False Then Exit Function   If MsgBox("Nullを0とみなしますか?",vbYesNo,"確認")=vbYes Then     IntA=Nz(IntA,0)     IntB=Nz(IntB,0)   End If End Function Private Function ChildFunc2(IntA,IntB) On Error Resume Next   If IntA > IntB Then     MsgBox "前者が大"   ElseIf IntA < IntB Then     MsgBox "後者が大"   Else     MsgBox "ともに等しい"   End If End Function <変更後の例> ParentFunc関数とChildFunc1関数を、以下のように変更します。 Public Function ParentFunc(IntA, IntB) On Error Resume Next   'ChildFunc1関数の戻り値を記録する変数Contを宣言   Dim Cont As Integer   'ChildFunc1関数の戻り値を変数Contに記録   Cont=ChildFunc1(IntA, IntB)   'ChildFunc関数の戻り値が0(→MsgBoxでvbNoを選択)なら処理を中止   If Cont=0 Then Exit Function   Call ChildFunc2(IntA, IntB) End Function Private Function ChildFunc1(IntA, IntB) As Integer On Error Resume Next   If IsNull(IntA)=False And IsNull(IntB)=False Then Exit Function   If MsgBox("Nullを0とみなしますか?",vbYesNo,"確認")=vbYes Then     IntA=Nz(IntA,0)     IntB=Nz(IntB,0)     'vbYes選択時は、ChildFunc1の戻り値を-1(True相当)に設定     ChildFunc1=-1   Else     'vbNo選択時は、ChildFunc1の戻り値を0(False相当)に設定     ChildFunc1=0   End If End Function

関連するQ&A