[[20170223000247]] 『MsgBox表示されたら、EndSabでマクロを終了させる』(ちゃんぷる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『MsgBox表示されたら、EndSabでマクロを終了させる方法』(ちゃんぷる)

お世話になっております
アドバイスの程よろしくお願いします。

以下のような事はできますでしょうか?

同じModule内のマクロを読み込んで処理をさせたいと構想中です。

やりたいことは

Bマクロ処理を行う前に

Aマクロを実行させて、MsgBoxが表示されたら

EndSab出来ますでしょうか?

ちなみに表示内容は

MsgBox"入力ミス発見。入力内容を確認し再実行してください"

・Aマクロ実行

 →MsgBox表示 → EndSab(終了)

 →MsgBox表示されなかった → Bマクロ実行(処理)

と言った感じです。

どうすればよいのか検討もつかず書き込みしました。

sub 集計()

IF (Aマクロの処理でMsgBoxが表示されたら Then

MsgBox "元のfileを修正してください" '処理中止

Exit Sub'抜ける
EndIF

'※上記でMsgBoxが表示されなければ以下の処理を実行

Bマクロ実行

end sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 ちゃんぷる さん

 Callステートメントを知っていますか?

 下記のマクロをmoduleに記述した後、
  アクティブシートのA1に、
 「1」を入力した後にA_Macroを実行してみてください。次に、
 「2」を入力した後にA_Macroを実行してみてください。
 ****************************************
 Option Explicit

 Sub A_Macro()
     Dim x As Long'★整数型で定義
     x = Range("A1").Value
   If x = 1 Then
     MsgBox "表示"
   Else
    Call 集計'★集計マクロ(プロシージャ)を実行する
   End If
 End Sub

 Sub 集計()
    MsgBox "集計マクロ実行されました"
 End Sub
 ****************************************

 要約すると、下記になりますでしょうか?
 Aマクロでの処理に次のようなコードを書きたい
 ・「MsgBox表示」されたら、終了(【sub 集計】を実行しない)
 ・「MsgBox非表示」なら、【sub 集計】を実行

 どんなときに、AマクロでMsgBoxを表示したいのでしょうか?
 上記の例では、x=1のときだけ、MsgBoxを表示しています。
 それ以外の★整数(xをLong型で定義しているため)を入れたときは、
 集計マクロを実行します。

 余談ですが、…。
 Call 集計
 と書きましたが、
 ★引数がある場合は、集計()のカッコ内に引数を記述します。
 「参照渡しと値渡し」については、下記を参照
 「ByRefとByVal」と同じ意です。
http://officetanaka.net/excel/vba/tips/tips94.htm

(!!!) 2017/02/23(木) 03:31


 横から失礼。

 To !!!さん

 > 余談ですが、…。

 余談というより、唐突なコメントで、チャンプルさんも戸惑うんじゃないですか?
 とくに

 >「参照渡しと値渡し」については、下記を参照
 >「ByRefとByVal」と同じ意です。

 ちゃんぷるさんの質問文にも !!!さんのコメント内にも 「参照渡しと値渡し」という言葉は
 どこにも登場しないのに、いきなり ・・・については・・・ というくだりが出てますから。

 そういう言葉がその前にあって、ちなみに、それについては・・・という説明ならわかりますが。

( β) 2017/02/23(木) 10:00


>『MsgBox表示されたら、EndSabでマクロを終了させる方法』(ちゃんぷる)

あのですね。。。。
Msgboxを表示させるかさせないかの判断をするのも「自分」ですよね?

つまり、Msgboxがどうのこうのというより、

「入力ミスがあったかどうか」で、処理を中止するかしないかを判断するってことですよね?

つまり、

sub メイン()

    もし、入力にミスがあったら、「中断」
  
  任意の処理を行う
End sub

と書けばいいのです。

なので、たとえば、
A1セルの値が1から10の間の数値でなければ、処理したくないなら、

Function ChkValue(ByVal c As Range) As Boolean

    Dim l As Long

    If IsNumeric(c(1).Value) Then
        l = c(1).Value
    Else
        l = -4000
    End If

    If l > 0 And l < 11 Then
        ChkValue = True
    End If
End Function

Sub メイン()

    'もし、入力にミスがあったら、「中断」
    If ChkValue(Range("A1")) = False Then
        MsgBox "不正値です"
        Exit Sub
    End If

    MsgBox "続きの処理"
End Sub

FunctionプロシージャでTrueかFalseを返すように自作で関数をつくり、
それの返す答えによって、条件分岐するといいと思います。
(まっつわん) 2017/02/23(木) 10:25


!!!さん

シートに作業セルA1を設けて、入力チェックマクロでエラー時に「1」が入るようにして
アドバイスのコードを使用して以下のようにしました。

バッチリでした。

'-----★以下のメッセージボックスが表示=A1に値1が入る(エラーあり)の場合は処理を終了-----

        Dim x As Long    '★整数型で定義
        Call 請求用_予定重複エラーチェック    '呼び出しマクロ(予定に重複がないか再度チェック)
        'エラーがあれば、A1に1が入るので・・・
                x = Range("A1").Value
        If x = 1 Then    '   '定数に対し値は1が選択
            '処理中止
            Exit Sub
        Else
            '通常処理

※別のマクロ実行で表示される
 メッセージボックスの表示有無を取得するコードはあるのでしょうか
 探してみましたが、ありませんでした。
 
 何故そのようなことをするのか・・・理由ですが

 →別のマクロをCallする理由は、長いコードなので、本体マクロに組み込むのは避けたいからでした。
(ちゃんぷる) 2017/02/23(木) 11:38


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.