IF文の整理と論理的思考
論理的思考でIf文を整理することについて、簡単な例で解説していきます。
Sub sample()
Dim A, B, C
・・・処理・・・
If A = B Then
If A = C Then
If B = C
Then
・・・処理1・・・
Else
・・・処理2・・・
End
If
Else
If B = C
Then
・・・処理3・・・
Else
・・・処理4・・・
End
If
End If
Else
If A = C Then
If B = C
Then
・・・処理5・・・
Else
・・・処理6・・・
End
If
Else
If B = C
Then
・・・処理7・・・
Else
・・・処理8・・・
End
If
End If
End If
End Sub
処理1は、A=B かつ A=C かつ B=Cと言う事になりますが、
A=B かつ A=C なら、絶対にB=Cですよね、つまり、最期のB=Cの判定は無意味です。
ということは、処理2は絶対に実行されることはありません。
次に、処理3と処理4の部分ですが、
A=B かつ A<>C なんですよね、と言う事は、絶対に、B<>Cなんですよ。
つまりは、B=Cの判定は無意味で、処理3はありえないということです。
さらに、処理5と処理6の部分ですが、
A<>B かつ A=C なんですよね、と言う事は、絶対に、B<>Cなんですよ。
つまりは、B=Cの判定は無意味で、処理5はありえないということです。
そこで、不要なIF文と処理を消して書き直すと、
Sub sample2()
Dim A, B, C
If A = B Then
If A = C
Then
・・・処理1・・・
Else
・・・処理4・・・
End
If
Else
If A = C Then
・・・処理6・・・
Else
If B =
C Then
・・・処理7・・・
Else
・・・処理8・・・
End
If
End If
End If
End Sub
と、このようになります。
大分すっきりしました。
でも少し見ずらいですかね、そこで、ElseIf等を使って書き直したりする訳ですが、
その時に、またまた、問題のある記述になっている場合が多く見かけられます。
以下のような書き方です。
Sub sample3()
Dim A, B, C
If A = B And A = C
Then
・・・処理1・・・
ElseIf A = B And A <> C
Then
・・・処理4・・・
ElseIf A <> B And A = C
Then
・・・処理6・・・
ElseIf A <> B And A <> C And B = C
Then
・・・処理7・・・
ElseIf A <> B And A <> C And B <> C
Then
・・・処理8・・・
End If
End Sub
まあ、先のIF文をそのまま書けば、こんなふうになるのは仕方無いのですが・・・
一見、問題なさそうに見えるのですが、これでは無駄が多いんです。
ちょっと考え直してみましょう。
変数A、B、Cが、同じかどうかの判定なんですよね。
どのような組み合わせがあるかなんです。
①A = B = C・・・これは問題なし
②A =
B・・・ここが問題、①以外なのだから、結果として、A<>C,B<>C
③B =
C・・・同上で、結果として、A<>B,A<>C
④A =
C・・・同上で、結果として、A<>B,B<>C
⑤A<>B<>C・・・これも問題なし
②~④が問題なんですね。
①で、A = B = Cの状態判定は終了しているので、
残りは、最低でも、いずれか1つは違う場合なんです。
つまり、①は3つが同じ、
②~④は、2つが同じ、組み合わせは3通り
そして、⑤で全て違う場合と言う事になります。
これで、書き直すと、
Sub sample4()
Dim A, B, C
If A = B And A = C
Then
・・・処理1・・・
ElseIf A = B Then
・・・処理4・・・
ElseIf A = C
Then
・・・処理6・・・
ElseIf B = C
Then
・・・処理7・・・
Else
・・・処理8・・・
End If
End
Sub
どうでしょうか、これなら、すっきり、さっぱりしました。
また、Select Case を使って書くと、
Sub sample5()
Dim A, B, C
Select Case True
Case A = B And A
= C
・・・処理1・・・
Case A = B
・・・処理4・・・
Case A =
C
・・・処理6・・・
Case B = C
・・・処理7・・・
Case
Else
・・・処理8・・・
End Select
End Sub
ちなみに私は、多肢選択では、ElseIfは使いません、
Select Case を使うようにしています。
プログラム作成では、このような整理が必要になる事が度々あります。
プログラム作成で最も重要な事は、単純化・細分化できるかだと思っています。
知っているプロパティ・メソッドの数なんかではないはずです。
(もちろん、多く知っているに越したことはありませんが)
プロパティやメソッドは、ネットで検索すれば、山ほど出てきます。
しかし、このような論理的思考については、なかなか、書籍・ネットには書かれていないと思います。
問題を整理し、箇条書きで良いので、それを書き出す。
この練習と訓練でしか、身に着ける事はできません。
まずは、処理内容を箇条書きしてみる、そこから始めましょう。
同じテーマ「エクセル雑感」の記事
プログラミングについて
エクセルの日付のお話
素直なプログラミング
IF文の整理と論理的思考
エクセルVBAを覚えるには
EXCELマクロを始める時、まず最初にやるべきことは
Excelマクロを書くと言う事は
もしエクセルにマクロ機能がなかったら
物事には守るべき順序があります。エクセルにも順序があります。
Excelマクロ実行時のトラブル対処方法
だまされるな!RangeとCellsの使い分け!
新着記事NEW ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。