エクセル雑感
IF文の整理と論理的思考

ExcelマクロVBAとエクセル関数についての私的雑感
最終更新日:2017-11-18

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つづつ見てみましょう。


処理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文の整理について書きましたが、


プログラム作成では、このような整理が必要になる事が度々あります。


プログラム作成で最も重要な事は、単純化・細分化できるかだと思っています。


知っているプロパティ・メソッドの数なんかではないはずです。

(もちろん、多く知っているに越したことはありませんが)


プロパティやメソッドは、ネットで検索すれば、山ほど出てきます。


しかし、このような論理的思考については、なかなか、書籍・ネットには書かれていないと思います。


問題を整理し、箇条書きで良いので、それを書き出す。


この練習と訓練でしか、身に着ける事はできません。


まずは、処理内容を箇条書きしてみる、そこから始めましょう。




同じテーマ「エクセル雑感」の記事

プログラミングについて
エクセルの日付のお話
素直なプログラミング
IF文の整理と論理的思考
エクセルVBAを覚えるには
EXCELマクロを始める時、まず最初にやるべきことは
Excelマクロを書くと言う事は
もしエクセルにマクロ機能がなかったら
物事には守るべき順序があります。エクセルにも順序があります。
Excelマクロ実行時のトラブル対処方法
だまされるな!RangeとCellsの使い分け!


新着記事NEW ・・・新着記事一覧を見る

Variantの数値型と文字列型の比較|エクセル雑感(7月1日)
VBAのVariant型について|VBA技術解説(6月30日)
VBAのString型の最大文字数について|エクセル雑感(6月20日)
VBAで表やグラフをPowerPointへ貼り付ける|VBAサンプル集(6月19日)
アクティブシート以外の表示(Window)に関する設定|VBA技術解説(6月17日)
マクロ記録での色のマイナス数値について|エクセル雑感(6月16日)
ツイッター投稿用に文字数と特定文字で区切る|エクセル雑感(6月15日)
日付の謎:IsDateとCDate|エクセル雑感(6月14日)
IFステートメントの判定|エクセル雑感(6月13日)
インクリメンタルサーチの実装|ユーザーフォーム入門(6月12日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ