Home » エクセルマクロ・Excel VBAの使い方 » 条件分岐 » ExcelマクロでAnd演算子を使わずAND条件を指定する

ExcelマクロでAnd演算子を使わずAND条件を指定する

対象:Excel2007, Excel2010, Excel2013

Excel VBA(Visual Basic for Applications)のAnd演算子についてご紹介した昨日の記事の最後のほうに、
 If tmp < 50 Then
 ElseIf 50 <= tmp And tmp < 70 Then
 ElseIf 70 <= tmp And tmp < 85 Then
 ElseIf 85 <= tmp Then
 Else
 End If
というコードを書きました。

VBAの比較演算子の前後は入れ替えられることと、コードの読みやすさについて実感していただくための例として書いたものです。

ですが、プログラミングの経験がある方や、Excelのワークシート関数のIF関数でAND条件を指定する方法をしっかり理解できている方、論理的思考の得意な方は、このコードについて疑問を持つはずです。

その疑問を元に、And演算子を使わなくても、AND条件を指定していることになるケースについて書いておきます。

[スポンサードリンク]

And演算子を使ったAND条件

まずは、And演算子を使って、AND条件を指定する例です。

Sub AND条件の例_1()

 Dim tmp As Long
 Dim msg As String

 tmp = InputBox("数値を入力してね。")

 If tmp < 70 Then
  msg = "70未満"
 ElseIf 70 <= tmp And tmp < 85 Then
  msg = "70以上85未満"
 Else
  msg = "85以上"
 End If

 MsgBox msg

End Sub
And演算子を使った、
 ElseIf 70 <= tmp And tmp < 85 Then
  msg = "70以上85未満"
で、もちろんAND条件を指定しているわけで、このときに「70以上85未満」というメッセージが表示されます。
昨日の、
 If tmp < 50 Then
 ElseIf 50 <= tmp And tmp < 70 Then
 ElseIf 70 <= tmp And tmp < 85 Then
では疑問を感じなかった方も、上記のようなマクロの形になると疑問を感じるかもしれません。

If文の入れ子によるAND条件

同じ処理を、And演算子を使わないで、以下のように書くこともできます。

Sub AND条件の例_2()

 Dim tmp As Long
 Dim msg As String

 tmp = InputBox("数値を入力してね。")

 If tmp < 70 Then
  msg = "70未満"
 Else

  If tmp < 85 Then
   msg = "70以上85未満"
  Else
   msg = "85以上"
  End If

 End If

 MsgBox msg

End Sub

外側のIf文、
 If tmp < 70 Then
を抜けたあとの、
 Else
の中にある、内側のIf文の
  If tmp < 85 Then
部分は、「70未満ではなくて(70以上で)」という条件が既にかかっているわけですから、結局「70以上かつ85未満」というAND条件になっています。このことを、まずは理解・納得してください。

このマクロについては、気持ち悪さを感じる方が、相当いらっしゃるのではないかと想像しますが、ワークシート関数のIF関数を入れ子にするのは、この例と同じ考え方をしていることも、思い出していただきたいところです。

ElseIfによるAND条件

同じ処理を、If文を入れ子にするのではなく、以下のように書くこともできます。

Sub AND条件の例_3()

 Dim tmp As Long
 Dim msg As String

 tmp = InputBox("数値を入力してね。")

 If tmp < 70 Then
  msg = "70未満"
 ElseIf tmp < 85 Then
  msg = "70以上85未満"
 Else
  msg = "85以上"
 End If

 MsgBox msg

End Sub

Ifの入れ子ではなく、ElseIfを使うことでスッキリしたコードになりました。

このマクロでも、
 ElseIf tmp < 85 Then
の条件判断が行われる前に、
 If tmp < 70 Then
が行われているわけですから、やっぱり「70以上かつ85未満」という、AND条件を指定しているわけです。

はじめにご紹介した、
 If tmp < 70 Then
 ElseIf 70 <= tmp And tmp < 85 Then
 Else
 End If
は、結局、
 If tmp < 70 Then
 ElseIf tmp < 85 Then
 Else
 End If
で済ませられるわけです。

ですから、プログラミングの経験がある方は、昨日の、
 If tmp < 50 Then
 ElseIf 50 <= tmp And tmp < 70 Then
 ElseIf 70 <= tmp And tmp < 85 Then
といったコードをご覧になって疑問を感じたはずなのです。

ElseIfにAnd演算子を使わないほうがいいのか

ここにあげたようなシンプルな例ならば、
 If tmp < 70 Then
 ElseIf 70 <= tmp And tmp < 85 Then
より、
 If tmp < 70 Then
 ElseIf tmp < 85 Then
のほうが、いいでしょう。

大切なのはこの、コードの意味をしっかりと理解することです。
And演算子を使わなくてもAND条件になっているということを納得してください。

今回のようなシンプルな例であれば、
 If tmp < 70 Then
 ElseIf tmp < 85 Then
のほうが、まあ、いいとは思います。が、
 If tmp < 70 Then
 ElseIf 70 <= tmp And tmp < 85 Then
のようなコードを、絶対に否定しなければならない、と私は考えていません。

マクロ初心者の中に、
 If tmp < 70 Then
 ElseIf tmp < 85 Then
のElseIfが、AND条件になっていることを納得し辛いという方が、やっぱりいらっしゃいます。そんな場合に、より文章に近い、
 ElseIf 70 <= tmp And tmp < 85 Then
と書くことを、頭ごなしに否定すべきではないと考えています。

また、
 If tmp < 70 Then
のあとに何らかの処理がたくさんあってElseIfまでの行数が多いようなケースでは、
 ElseIf tmp < 85 Then
で済ませられるけれど、冗長であっても、あえて、
 ElseIf 70 <= tmp And tmp < 85 Then
と書いておくほうが、将来コードを読む人が、理解しやすくなるということもあるはずです。

Excelマクロは、Excelを自動的に動かすための作業指示書でもありますが、人が読んで理解し修正することになる作業指示書でもあります。Excelマクロは、将来読む人が理解しやすいように書いておくことを、まずは、優先すべきだと考えています。そのために、場合によっては、敢えて冗長なコードを書くこともありだと思っています。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 条件分岐 » ExcelマクロでAnd演算子を使わずAND条件を指定する

「条件分岐」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.