![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
エクセルの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を探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
VBA 空白セルを削除ではない方...
-
エクセルで2つの時系列のデー...
-
VisualBasicでデータ検索プログ...
-
多量のSUMIF式を軽くしたい
-
win7でvbsファイルが実行できない
-
ACCESS VBA インデックスが有効...
-
Web画面を遷移してもデータを保...
-
この行は既に別のテーブルに属...
-
VBAで「"」[']をエスケープする...
-
<VB>String→Object
-
メモ帳(テキストデータ)をExc...
-
Matlab:plotで特定の値だけをプ...
-
S9タイプからXタイプにデータ...
-
C言語の度数分布の問題
-
C#にてDropDownListの値を動的...
-
CString型の文字列連結について
-
パースとはなんですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
S9タイプからXタイプにデータ...
-
Excelのマクロでワードのテキス...
-
エクセルで2つの時系列のデー...
-
Accessで該当データにフラグを...
-
ユーザーフォームのテキストボ...
-
シーケンサにパソコンからアク...
-
EXCELVBAでSQLserverからデータ...
-
[C言語] コメント文字列を無視...
-
VBAを使ってOutlookメール本文...
-
プログラミング python pandas ...
-
VBA 毎日取得するデータを順番...
-
<VB>String→Object
-
カンマからスラッシュに
おすすめ情報