エクセル雑感 | 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文の整理について書きましたが、


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


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


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

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


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


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


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


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


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




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

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

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

VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)
ユーザーフォームの各種イベント|Excelユーザーフォーム(3月13日)
レジストリの操作|MOS VBAエキスパート対策(3月12日)
変数と配列|MOS VBAエキスパート対策(3月12日)
Colorプロパティの設定値一覧|VBA技術解説(3月12日)
APIとOLEオートメーション|MOS VBAエキスパート対策(3月11日)
エラーへの対処|MOS VBAエキスパート対策(3月10日)

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

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



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

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


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





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

    本文下部へ

    ↑ PAGE TOP