プロが教える店舗&オフィスのセキュリティ対策術

エクセルのVBAでif文でメッセージボックスを表示するコードを自作したら、
最後に必ずEnd Ifを表示しなければならなくなってしまって、最後のEnd ifが何回もあり、面倒です。
動作はしているのですが、if文以外の方法、もしくはif文でもいいのでEnd ifを何回も書かないくてもいい方法はありますか?
(ここでEnd ifは4個ですが、実際のコードはもっとあります。)

Sub xxx()
Dim AAA As Long
AAA = MsgBox("Aをしましたか?", vbYesNo + vbExclamation)
If AAA = vbNo Then
Exit Sub
Else

Dim BBB As Long
BBB = MsgBox("Bをしましたか?", vbYesNo + vbExclamation)
If BBB = vbNo Then
Exit Sub
Else

Dim CCC As Long
CCC = MsgBox("データはCですか?", vbYesNo + vbExclamation)
If CCC = vbYes Then
Call HHH
Call III
Else

Dim DDD As Long
DDD = MsgBox("データはDですか?", vbYesNo + vbExclamation)
If DDD = vbYes Then
Call JJJ
Call KKK
Else
MsgBox "不正なデータです。マクロを停止します。", vbExclamation
Exit Sub
End If
End If
End If
End If

End Sub

A 回答 (5件)

No.2 の訂正です。

(途中で内容が違っていた事に気づきませんでした、すみませんでした)
--------------------------------------------------------------------------
Sub xxx()
If MsgBox("Aをしましたか?", vbYesNo + vbExclamation) = vbNo Then Exit Sub
If MsgBox("Bをしましたか?", vbYesNo + vbExclamation) = vbNo Then Exit Sub
If MsgBox("Cをしましたか?", vbYesNo + vbExclamation) = vbNo Then
Call HHH
Call III
Exit Sub
End If
If MsgBox("Dをしましたか?", vbYesNo + vbExclamation) = vbNo Then
Call JJJ
Call KKK
Exit Sub
End If
MsgBox "不正なデータです。マクロを停止します。", vbExclamation
End Sub
--------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

わざわざMsgBoxの答えを変数宣言?する必要もないですから、これにします。
ありがとうございました。

お礼日時:2016/12/09 13:56

Aをしましたか?



┣━いいえ→不正

はい

Bをしましたか?

┣━いいえ→不正

はい



って4段の条件分岐なら、If~Else~Endifが4段になってるのは至極真っ当です。
ネストが深くなりすぎるって話なら、処理を分けられるなら、そこで関数も分けるとか。

--
> End ifを何回も書かないくてもいい方法はありますか?

コードが分かりにくくなるので、お勧めではないですが…。
例えば、
・メッセージボックスを表示する
・Yes/Noを判断する
・指定されたボタンだったらFalseを返す
関数を作って、

Function MyMsgMox(msg, prompt, jdgbtn)
 MyMsgMox = (MsgBox(msg, prompt)=jdgbtn)
End Function

Sub xxx()
 If MyMsgMox("Aをしましたか?", vbYesNo + vbExclamation, vbNo) Then ExitSub
 If MyMsgMox("Bをしましたか?", vbYesNo + vbExclamation, vbNo) Then ExitSub
 If MyMsgMox("Aをしましたか?", vbYesNo + vbExclamation, vbNo) Then ExitSub
 Call HHH
 Call III
 If MyMsgMox("Aをしましたか?", vbYesNo + vbExclamation, vbNo) Then ExitSub
 Call JJJ
 Call KKK
End Sub

ただし、ボタンが「はい」だったらCall LLL、「いいえ」だったらCall MMMとかって分岐は同じように書けませんし、修正のしやすさとか汎用性とか犠牲になるように思います。
    • good
    • 0
この回答へのお礼

コードが動いているので正しいことはわかるのですが、下に何個もあるときれいじゃないなぁと思って質問してみました。
関数まで作っていただいてありがとうございました。

お礼日時:2016/12/09 13:57

これEXIT SUB している部分のELSEいらないんじゃない?


すぐにENDIFでとじれば。
    • good
    • 0
この回答へのお礼

そうですね。elseを使わずendifをそのすぐにつけるのがよさそうです。ありがとうございました。

お礼日時:2016/12/09 13:56

今回に限って言えば「Else ~」は全く必要ではありません、以下のような物で良いと思います。


--------------------------------------------------------------------------
Sub xxx()
If MsgBox("Aをしましたか?", vbYesNo + vbExclamation) = vbNo Then Exit Sub
If MsgBox("Bをしましたか?", vbYesNo + vbExclamation) = vbNo Then Exit Sub
If MsgBox("Cをしましたか?", vbYesNo + vbExclamation) = vbNo Then Exit Sub
If MsgBox("Dをしましたか?", vbYesNo + vbExclamation) = vbNo Then Exit Sub
MsgBox "不正なデータです。マクロを停止します。", vbExclamation
End Sub
--------------------------------------------------------------------------
    • good
    • 0

Selectcaseは使えませんか?



使い方の参考サイトは以下に記します.
http://www.239-programing.com/excel-vba/basic/ba …
http://officetanaka.net/excel/vba/statement/Sele …
    • good
    • 0
この回答へのお礼

答えになる値が3つ以上あればselectcaseも使えると思うのですが、MsgBoxを使い
YESかNOかに区切って条件を出すと使えないのかなあと思って使いませんでした。
使えるときに使ってみたいです。ありがとうございました。

お礼日時:2016/12/09 13:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!