エクセル雑感 | 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・・・これは問題なし
AA = B・・・ここが問題、@以外なのだから、結果として、A<>C,B<>C
BB = C・・・同上で、結果として、A<>B,A<>C
CA = C・・・同上で、結果として、A<>B,B<>C

DA<>B<>C・・・これも問題なし

A〜Cが問題なんですね。

@で、A = B = Cの状態判定は終了しているので、

残りは、最低でも、いずれか1つは違う場合なんです。


つまり、@は3つが同じ、

A〜Cは、2つが同じ、組み合わせは3通り

そして、Dで全て違う場合と言う事になります。


これで、書き直すと、

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の使い分け!

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

数値範囲で表検索するVLOOKUP近似一致|エクセル関数超技(10月5日)
エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.定数と型宣言文字(Const)|ExcelマクロVBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • IF文の整理と論理的思考

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


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





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

    本文下部へ

    ↑ PAGE TOP