
こんばんは。
ACCESS VBAにて、MSGBOXの返り値がVBNOの際に以降の処理を中止したいと思っています。
以前はEndと記載していましたが、グローバル変数の値が初期化されたり弊害があると言われたためExit functionやExit subに置き換えた所、そのFunction以降のFunction(元々コマンドボタンクリックでいくつかのPublic Functionが動くようになっています)に処理が移ってしまい困っています。
そもそも書き方に問題があるのかもしれませんが、ご存知の方いたら教えてください。連休中の宿題って感じです。(涙)よろしくお願いします。
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
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) こんにちは。ExcelVBA初心者につき困っています。Functionで始まっている処理の中で、処理 1 2022/06/18 21:40
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
このQ&Aを見た人はこんなQ&Aも見ています
-
「それ、メッセージ花火でわざわざ伝えること?」
「それ、メッセージ花火でわざわざ伝えること?」というメッセージを教えて下さい
-
ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
ゴリラ向け動画配信サイト「ウホウホ動画」にありがちなことを教えて下さい。
-
人生で一番思い出に残ってる靴
皆さんの人生で一番思い入れのある靴の話を伺ってみたいです。
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
あなたが好きな本屋さんを教えてください
どのくらいの規模間で、どのような本が並んでいるか、どのような雰囲気なのかなどなど...
-
途中で処理を中断させたい (アクセスVBA)
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
お助けください!VBAのファイル...
-
UserForm1.Showでエラーになり...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
VBA データ(特定値)のある最...
-
VBAでfunctionを利用しようとし...
-
【VB.NET】 パワポ操作を非表示で
-
String""から型'Double'への変...
-
オブジェクト型の変数にフォー...
-
「実行時エラー '3167' レコー...
-
文字列内で括弧を使うには
-
実行時エラー 438 の解決策をお...
-
Excel vbaについての質問
-
エクセルVBAで埋め込みグラフ(C...
-
matlabでのエラー コールバッ...
-
VB6.0の組み込みマクロ
-
VB.NETでMessageBoxが表示され...
-
OpenOffice Basicで簡単な関数...
-
Filter関数を用いた結果、何も...
-
VBA Find でオートメーションエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
文字列内で括弧を使うには
-
Excel vbaについての質問
-
On ErrorでエラーNoが0
-
String""から型'Double'への変...
-
実行時エラー 438 の解決策をお...
-
VBA データ(特定値)のある最...
-
【VB.NET】 パワポ操作を非表示で
-
ApplicationとWorksheetFunctio...
-
Filter関数を用いた結果、何も...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
「実行時エラー '3167' レコー...
-
オブジェクト型の変数にフォー...
おすすめ情報