エクセルの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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
【EXCEL VBA】ブック内の特定の...
-
python, 空のタプルの必要性
-
VBSからPOST送信したいです。
-
VBA 空白セルを削除ではない方...
-
[COBOL]日付比較
-
VB RS-232C 通信プログラム
-
VBA(多くの数値データの最小値...
-
[C言語] コメント文字列を無視...
-
ACCESSからEXCELに出力する際、...
-
携帯電話を水につけるとデータ...
-
この行は既に別のテーブルに属...
-
PHPのフォームでPOSTした変数を...
-
特定のデータの抽出方法を教え...
-
サムチェックのルール
-
【エクセル】測定時間がバラバ...
-
エクセルVBAプログラミング...
-
ExcelVBAでデータ不一致のもの...
-
StringTokenizerで連続するデリ...
-
ブレーカー落ちで壊れたりしな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
多量のSUMIF式を軽くしたい
-
VBA 空白セルを削除ではない方...
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
ブレーカー落ちで壊れたりしな...
-
特定のデータの抽出方法を教え...
-
この行は既に別のテーブルに属...
-
EXCELVBAでSQLserverからデータ...
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
Accessで該当データにフラグを...
-
エクセルで2つの時系列のデー...
-
S9タイプからXタイプにデータ...
-
プログラミング python pandas ...
-
ユーザーフォームのテキストボ...
-
カンマからスラッシュに
-
Excel VBAでのオートフィルター...
-
C# でDataTableの更新を高速化...
おすすめ情報