![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
エクセルの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
No.4ベストアンサー
- 回答日時:
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
--------------------------------------------------------------------------
No.5
- 回答日時:
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とかって分岐は同じように書けませんし、修正のしやすさとか汎用性とか犠牲になるように思います。
コードが動いているので正しいことはわかるのですが、下に何個もあるときれいじゃないなぁと思って質問してみました。
関数まで作っていただいてありがとうございました。
No.3
- 回答日時:
これEXIT SUB している部分のELSEいらないんじゃない?
すぐにENDIFでとじれば。
No.2
- 回答日時:
今回に限って言えば「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
--------------------------------------------------------------------------
No.1
- 回答日時:
Selectcaseは使えませんか?
使い方の参考サイトは以下に記します.
http://www.239-programing.com/excel-vba/basic/ba …
http://officetanaka.net/excel/vba/statement/Sele …
答えになる値が3つ以上あればselectcaseも使えると思うのですが、MsgBoxを使い
YESかNOかに区切って条件を出すと使えないのかなあと思って使いませんでした。
使えるときに使ってみたいです。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
<VB>String→Object
-
S9タイプからXタイプにデータ...
-
ハミング窓関数とFFT(高速フー...
-
Fortranで/(スラッシュ)を含...
-
VBAでシートからコンボボックス...
-
Accessで該当データにフラグを...
-
共有メモリへのマッピング(Map...
-
フォートランでの相互相関関数...
-
メモ帳(テキストデータ)をExc...
-
カンマからスラッシュに
-
ブレーカー落ちで壊れたりしな...
-
マクロを使って「円」を消すのは
-
ワイモバイルの速度制限
-
ACCESS VBA インデックスが有効...
-
VBにおいてフォーム間の変数の...
-
EXCELVBAでSQLserverからデータ...
-
[VBA] CountIfに変数を使いたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
あんまり考えたくないけど
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
エクセルで2つの時系列のデー...
-
ブレーカー落ちで壊れたりしな...
-
VBA 空白セルを削除ではない方...
-
S9タイプからXタイプにデータ...
-
Accessで該当データにフラグを...
-
EXCELVBAでSQLserverからデータ...
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
VBAを使ってOutlookメール本文...
-
シーケンサにパソコンからアク...
-
C# ソケット通信でデータ受信時...
-
パースとはなんですか?
-
ユーザーフォームのテキストボ...
おすすめ情報