よく利用される条件分岐のIf文について解説します。
If文の使い方
If文の書式は下記の通り。
If 条件式 Then
条件に一致していたら処理が実行される
End If
白・・・コード
紫・・・コメント
青・・・プロシージャの宣言
その他・・・コードを見やすくするために使うかも
指定した条件式に一致した場合には内部の処理が実行されて、一致しない場合は処理はスキップされます。
If文を使ってみる
If文で条件分岐をしてみます。今回は変数yにあらかじめ文字列を格納しておき
条件に一致した場合にイミディエイトウィンドウに出力されるようにしていきます。
Sub test()
Dim y As String
y = "値は100です"
If Cells(3, 3).Value = 100 Then
Debug.Print y
End If
End Sub
If Cells(3, 3).Value = 100 Then では指定したExcelの位置に100の値があれば条件を一致としています。
指定したセルの位置に100と記載があれば、変数yに格納されている文字列がイミディエイトウィンドウに出力されます。
反対に記載が無い、または100以外の整数の場合は何も出力されずスキップされるのでそのまま処理を終了します。
条件に一致しないときの処理 (else)
条件に一致しない場合に対して何かしらの処理を入れるにはIf文の中にelseを追加します。
If 条件式 Then
条件一致で処理が実行される
Else
条件不一致で処理が実行される
End If
条件に一致しないときの処理を追加してみる
条件に一致しなかったときの処理を追加して処理を実行する。下記ではセルに100以外の値が入力されている場合は”100ではありません”と表示されます。
Sub test()
Dim y As String
y = "値は100です"
If Cells(3, 3).Value = 100 Then
Debug.Print y
Else
Debug.Print "100ではありません"
End If
End Sub
複数の条件を確認する(ElseIf)
If文は複数の条件を指定することができます。
If 条件式 Then
条件一致で処理が実行される
EleseIf 条件式 Then
条件一致で処理が実行される
Else
どちらも条件不一致で処理が実行される
End If
複数条件で確認してみる
整数型の変数xを定義してセルの値を取得できるようにしました。最初のIfでセルの値が100かどうかを確認し、一致しない場合はElseIfで値が100以下かどうかを確認しています。
値が100以下であればその値を取得してイミディエイトウィンドウに出力します。一致しない場合は”値は100以上です”と出力します
Sub test()
Dim y As String
Dim x As Long
y = "値は100です"
If Cells(3, 3).Value = 100 Then
Debug.Print y
ElseIf Cells(3, 3).Value <= 100 Then
x = Cells(3, 3).Value
Debug.Print "値は" & x & "です"
Else
Debug.Print "値は100以上です"
End If
End Sub
論理演算子を利用したIf文(And Or Not)
複数の条件判定を一度に指定したい場合や条件式の否定文を利用したいときには論理演算子を利用することで実装できます。論理演算子を利用できるケースは以下の通りです
- すべての条件を満たす
- いずれかの条件を満たす
- ~ではない
論理演算子 | 説明 | 例 |
---|---|---|
A And B | AかつB (AとBの両方の条件を満たす) | If x > 10 And x < 30 Then xが10以上かつ30以下 |
A Or B | AまたはB (AかBのいずれか1つでも条件を満たす) | If x < 10 Or x > 30 Then xが10以下もしくは30以上 |
Not A | Aではない | If Not x = “” Then xが空ではない |
複数条件を指定するサンプル構文(And Or)
上記はよくあるテストの合否判定を記入する表となります。今回は例として全教科が60点以上を合格ラインとします。
例として作成した表はたった3人で教科も2科目ととても少ないですがこれが5教科でクラスが40人となると結構大変ですね。
下記のコードは指定した点数に到達している人のD列(合否)に”合格”もしくは”不合格”を記入するサンプル構文です
Sub sample()
Dim x, i As Long
x = 2
i = 2
Do While Cells(i, 3).Value <> ""
If Cells(x, 2) >= 60 And Cells(x, 3) >= 60 Then
Cells(x, 4) = "合格"
Else
Cells(x, 4) = "不合格"
End If
x = x + 1
i = i + 1
Loop
End Sub
サンプル構文を実行した結果が以下となります。
想定通りに全員分の合否を一括で判定することができました。
サンプルではすべての行を一括で処理するためにループ文も使用しています。そちらの内容がわからない方は下記の記事に詳細を記載しているのでご覧ください。
ツール作成でループ処理は必須の知識ですのでぜひ習得しましょう。
条件式を否定するIf文(Not)
前述のAndを利用したサンプル構文でも利用した上記の表を例に紹介していきます。
また、合否の中に”合格”もしくは”不合格”を記入していくサンプルとなります。
Sub sample()
Dim x, i As Long
x = 2
i = 2
Do While Cells(i, 3).Value <> ""
If Not (Cells(x, 2) <= 60) And Not (Cells(x, 3) <= 60) Then
Cells(x, 4) = "合格"
Else
Cells(x, 4) = "不合格"
End If
x = x + 1
i = i + 1
Loop
End Sub
このような使用方法はあまり理想的ではありませんが、先ほどとは異なり条件式は指定したセルが60以下であることを判定しています。
ですが、条件式を個別にNot演算子で囲っているので下記のように判定が変わります。
- Cells(x, 2) <= 60 ⇒ セルが60以下であればTrue
- Not(Cells(x, 2) <= 60 ) ⇒ セルが60以上であればTrue
このように結果が反転させたいときに利用することができます。条件に一致しない場合に処理を行いたいときに利用できますが通常のIf文でもelseなどを利用すれば使う必要がないケースもあります。
状況に応じて使い分けるようにしましょう。
ちなみにですが、出力結果は前述したサンプル構文と同じ結果となります。
補足1 セルの位置を指定
セルの位置指定の方法を紹介
プロパティ | 書式 | セル単体の指定 | 行の指定 | 列の指定 | 複数行の指定 | 複数列の指定 | 全セルを指定 |
Range | Range("列+行") | Range("A1") セルA1を指定 |
Range("1:1") 行1を指定 |
Range("A:A") 列Aを指定 |
Range("1:5") 行1~5を指定 |
Range("A:E") 列A~Eを指定 |
取得できない |
cells | Cells(行, 列) | Cells(1,2) セルB1を指定 |
取得できない | 取得できない | 取得できない | 取得できない | cells.select |