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条件を指定する例です。
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 SubElseIf 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演算子を使わないで、以下のように書くこともできます。
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文を入れ子にするのではなく、以下のように書くこともできます。
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 SubIfの入れ子ではなく、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条件を指定する