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

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2013年5月以前 最終更新日: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 ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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