エクセル雑感
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 ・・・新着記事一覧を見る

シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)
新旧マスタの差異比較|Power Query(M言語)入門(2023-02-28)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-26)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-21)
グルーブ内の最小・最大|Power Query(M言語)入門(2023-02-17)
2つのテーブルのマージ|Power Query(M言語)入門(2023-02-15)
「売上」が数値の行のみ取り込む|Power Query(M言語)入門(2023-02-13)
A列のヘッダー名を変更する|Power Query(M言語)入門(2023-02-11)
CSVのA列が日付の行だけを取り込む|Power Query(M言語)入門(2023-02-10)
列数不定のCSVの取り込み|Power Query(M言語)入門(2023-02-09)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門




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


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



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