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 を使うようにしています。
プログラム作成では、このような整理が必要になる事が度々あります。
プログラム作成で最も重要な事は、単純化・細分化できるかだと思っています。
知っているプロパティ・メソッドの数なんかではないはずです。
(もちろん、多く知っているに越したことはありませんが)
プロパティやメソッドは、ネットで検索すれば、山ほど出てきます。
しかし、このような論理的思考については、なかなか、書籍・ネットには書かれていないと思います。
問題を整理し、箇条書きで良いので、それを書き出す。
この練習と訓練でしか、身に着ける事はできません。
まずは、処理内容を箇条書きしてみる、そこから始めましょう。
同じテーマ「エクセル雑感」の記事
エクセルVBAを覚えるには
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。