VBA If, ElseIf, Else (If文の究極のガイド)
In this Article
VBA Ifステートメント
If Then
VBAのIfステートメントでは、式が真か偽かをテストし、その結果に基づいて異なる処理を実行することができます。
簡単な例を見てみましょう。
If Range("a2").Value > 0 Then Range("b2").Value = "Positive"
これは、A2セルの値が0より大きいかどうかをテストします。 もしそうなら、B2セルを “Positive “に設定します。
注:条件をテストするときは、比較演算子 =, >, <, <>, <=, >= を使用します。これらについては、記事の後半でより詳しく説明します。
以下は、簡単な1行のIf文の構文です。
If [test_expression] then [action]
読みやすくするために、行継続文字(アンダースコア)を使って、上の図のようにIfステートメントを2行に展開することができます。
If [test_expression] Then _
[action]
If Range("a2").Value > 0 Then _
Range("b2").Value = "正"
End If
上記の「一行」if文は、1つの条件をテストする場合にはうまく機能します。しかし、IF文が複数の条件によって複雑になると、if文の最後に「End If」を追加する必要があります。
If Range("a2").Value > 0 Then
Range("b2").Value = "正"
End If
構文は以下のようになります。
If [test_expression] Then
[action]
End If
End Ifは、if文の終了を意味します。
今度はサンプルコードにElseIFを加えてみましょう。
ElseIF – 複数の条件
ElseIfは、既存のIf文に追加するものです。ElseIfは、前の条件が満たされていない場合にのみ、その条件が満たされるかどうかをテストします。
前の例では、セルの値が正であるかどうかをテストしました。ここで、ElseIf を使ってセル値がマイナスであるかどうかもテストしてみましょう。
If Range("a2").Value > 0 Then
Range("b2").Value = "正"
ElseIf Range("a2").Value < 0 Then
Range("b2").Value = "負"
End If
複数のElseIfを使用して、複数の条件をテストすることができます。
Sub If_Multiple_Conditions()
If Range("a2").Value = "猫" Then
Range("b2").Value = "ニャー"
ElseIf Range("a2").Value = "犬" Then
Range("b2").Value = "ワンワン"
ElseIf Range("a2").Value = "あひる" Then
Range("b2").Value = "クワッ"
End If
End Sub
次はサンプルコードにElseを追加してみます。
Else
Elseは、それ以前のすべての条件が満たされなかった場合に実行されます。 セルの値が正でも負でもない場合、ゼロでなければならないことを示すのに、Elseを使用する例です。
If Range("a2").Value > 0 Then
Range("b2").Value = "正"
ElseIf Range("a2").Value < 0 Then
Range("b2").Value = "負"
Else
Range("b2").Value = "ゼロ"
End If
If-Else
If文の最も一般的なタイプは、単純なIf-Elseです。
Sub If_Else()
If Range("a2").Value > 0 Then
Range("b2").Value = "正"
Else
Range("b2").Value = "正でない"
End If
End Sub
ネストされたIF
if文の内部を「入れ子」にすることもできます。
Sub Nested_Ifs()
If Range("a2").Value > 0 Then
Range("b2").Value = "正"
Else
If Range("a2").Value < 0 Then
Range("b2").Value = "負"
Else
Range("b2").Value = "ゼロ"
End If
End If
End Sub
IF – Or、And、Xor、Not
次に、論理演算子 Or、And、Xor、Notについて説明します。
If Or
Or演算子は、少なくとも1つの条件を満たしているかどうかをテストします。 次のコードは、A2セルの値が5,000より小さいか10,000より大きいかをテストするものです。
If Range("a2").Value < 5000 Or Range("a2").Value > 10000 Then
Range("b2").Value = "範囲外"
End If
1行に複数のOrを含めることができます。
If Range("a2").Value < 5000 Or Range("a2").Value > 10000 Or Range("a2").Value = 9999 Then
Range("b2").Value = "範囲外"
End If
複数のOrを使用する場合は、コードを読みやすくするために行継続文字を使用することをお勧めします。
If Range("a2").Value < 5000 Or _
Range("a2").Value > 10000 Or _
Range("a2").Value = 9999 Then
Range("b2").Value = "範囲外"
End If
If And
And演算子を使うと、すべての条件を満たすかどうかをテストすることができます。
If Range("a2").Value >= 5000 And Range("a2").Value <= 10000 Then
Range("b2").Value = "範囲内"
End If
If Xor
Xor演算子は、いずれか1つの条件を満たすかどうかをテストすることができます。一つも条件を満たさない場合、XorはFALSEを返し、2つ以上の条件を満たした場合もFALSEを返します。
VBAのプログラミングでXorが使われているのを見ることは、ほとんどありません。
If Not
Not演算子は、FALSEをTRUEに、またはTRUEをFALSEに変換するために使用されます。
Sub IF_Not()
MsgBox Not (True)
End Sub
Not演算子では、切り換える式を括弧で囲む必要があることに注意してください。 Not演算子は、If文にも適用することができます。
If Not (Range("a2").Value >= 5000 And Range("a2").Value <= 10000) Then
Range("b2").Value = "範囲外"
End If
Ifの比較
比較を行う場合、通常、比較演算子のいずれかを使用します。
比較演算子 | 説明 |
---|---|
= | に等しい |
<> | とは等しくない |
> | より大きい |
>= | より大きいか等しい |
< | より小さい |
<= | より小さいか等しい |
ただし、TRUE または FALSE を返す式や関数を使用することもできます。
If – ブール関数
If文の式を作るとき、TRUEまたはFALSEを返す任意の関数を使用することもできます。 VBAには、このような関数がいくつかあります。
関数名 | 説明 |
---|---|
IsDate | 式が日付として有効である場合に TRUE を返す |
IsEmpty | 空白セルや未定義の変数をチェックする |
IsError | エラー値をチェックする |
IsNull | NULL値をチェックする |
IsNumeric | 数値のチェック |
これらは次のように呼び出すことができます。
If IsEmpty(Range("A1").Value) Then MsgBox "セルは空です"
また、ExcelにはWorksheetFunctionを使って呼び出すことができる関数がたくさんあります。ここでは、ExcelのIsText関数の例を示します。
If Application.WorksheetFunction.IsText(Range("a2").Value) Then _
MsgBox "セルはテキストです"
また、ユーザー定義関数(UDF)を独自に作成することも可能です。以下では、TRUEを返す単純なブール関数を作成します。そして、If文の中でその関数を呼び出します。
Sub If_Function()
If TrueFunction Then
MsgBox "True"
End If
End Sub
Function TrueFunction() As Boolean
TrueFunction = True
End Function
テキストを比較する
数字の比較と同じように、テキストの比較もできます。
Msgbox "a" = "b"
Msgbox "a" = "a"
テキストを比較する場合、「大文字と小文字」に注意する必要があります(大文字か小文字か)。 VBAのデフォルトでは、大文字と小文字が異なる文字はマッチングしないものとみなされます。 つまり、”A” <> “a “となります。
VBAに大文字小文字を無視させたい場合は、Option Compare Text宣言をモジュールの先頭に追加する必要があります。
Option Compare Text
その宣言の後、”A” = “a “となります。
Option Compare Text
Sub If_Text()
MsgBox "a" = "A"
End Sub
VBA If Like
VBAのLike演算子を使うと、テキストの厳密でない比較ができます。詳しくは「Like演算子」のリンクをクリックしてご覧ください。
Dim strName as String
strName = "Mr. Charles"
If strName Like "Mr*" Then
MsgBox "True"
Else
MsgBox "False"
End If
ここでは、アスタリスク「*」のワイルドカードを使用しています。「*」は任意の数の任意の文字を表します。 したがって、上記のIf文はTRUEを返すことになります。 このように、Like演算子はテキストを扱う上で非常に強力なツールですが、あまり使われていないことが多いようです。
Ifループ
VBAのループは、アクションを繰り返すことができます。IF-ELSEとLoopを組み合わせることで、多くの計算を素早く処理することができます。 正負の例の続きで、For Eachループを追加して、セルの範囲をループするようにします。
Sub If_Loop()
Dim Cell as Range
For Each Cell In Range("A2:A6")
If Cell.Value > 0 Then
Cell.Offset(0, 1).Value = "正"
ElseIf Cell.Value < 0 Then
Cell.Offset(0, 1).Value = "負"
Else
Cell.Offset(0, 1).Value = "ゼロ"
End If
Next Cell
End Sub
If Else の例
では、もう少し具体的な例を見ていきましょう。
セルが空かどうかをチェックする
このコードは、セルが空であるかどうかをチェックします。もし空なら、そのセルは無視される。空でない場合は、その値を右のセルに出力する。
Sub If_Cell_Empty()
If Range("a2").Value <> "" Then
Range("b2").Value = Range("a2").Value
End If
End Sub
セルに特定の文字列が含まれているかどうかを確認する
Instr関数は、ある文字列が他の文字列の中にあるかどうかを調べる関数です。セルが特定の文字列を含んでいるかどうかを調べるには、If 文と一緒に使用します。
If Instr(Range("A2").value, "text") > 0 Then
Msgbox "textが見つかりました"
End If
セルにテキストが含まれているかどうかを確認する
このコードは、セルがテキストであるかどうかをテストします。
Sub If_Cell_Is_Text()
If Application.WorksheetFunction.IsText(Range("a2").Value) Then
MsgBox "セルはテキストです"
End If
End Sub
If Goto
If文の結果を利用して、別のコードのセクションに「移動」することができます。
Sub IfGoTo()
If IsError(Cell.value) Then
Goto Skip
End If
'任意の処理
Skip:
End Sub
セルが空白の場合、行を削除する
Ifとループを使用すると、セルが空白かどうかをテストし、空白の場合は行全体を削除することができます。
Sub DeleteRowIfCellBlank()
Dim Cell As Range
For Each Cell In Range("A2:A10")
If Cell.Value = "" Then Cell.EntireRow.Delete
Next Cell
End Sub
If とメッセージボックス 「はい / いいえ」
VBAのメッセージボックスを使うと、ユーザーにいくつかの選択肢から選ぶように指示することができます。プロシージャにはい/いいえメッセージボックスを追加して、プロシージャの実行を継続するかどうかをユーザーに尋ねることができます。ユーザーの入力は、If 文を使用して処理します。
ここでは、実際に「はい/いいえ」メッセージボックスを使ってみます。
Sub MsgBoxVariable()
Dim answer As Integer
answer = MsgBox("続けますか?", vbQuestion + vbYesNo)
If answer = vbYes Then
MsgBox "はい"
Else
MsgBox "いいえ"
End If
End Sub
Access VBAのIf、ElseIf、Else
Access VBAのIf、ElseIf、Else関数は、Excel VBAと全く同じ動作をします。 If ステートメントを使用して、レコードセットにレコードがあるかどうかをチェックできます。