【条件分岐処理でセルの操作を分ける】
1 もしA列がXのときはエックスを実行
2 もしA列が、Xのときはエックス、Yのときはワイを実行
3 もしA列が、Xのときはエックス、その他のときはソノタを実行
4 もしA列がXかつB列がXのときはエックスを実行
5 もしA列がXまたはB列がXのときはエックスを実行
もしA列が、Xのときはエックス、その他のときはソノタを実行
パイさん
「前回『もしA列が、Xのときはエックス、Yのときはワイを実行』では、
二つ以上の各条件式に当てはまったときにそれぞれの処理を実行するIf_ElseIf文を紹介しました。
今回は、条件式に当てはまったときに特定の処理を実行し、
条件式に当てはまらないときに別の処理を実行するIf_Else文を紹介します。」
ソンくん
「If_Else文とはどういう意味ですか。」
パイさん
「Excel VBA/マクロのIf_Else文とは、
もしA列が、Xのときはエックス、その他のときはソノタを実行するというように、
条件式に当てはまったとき処理Tを実行し、その他のとき処理Fを実行するということです。
信号機に例えてみましょう。
信号機には、赤信号・黄信号・青信号があります。
赤信号は、『止まれ』
黄信号は、『原則止まれ』
青信号は、『進むことができる』
という意味です。
青信号以外、つまり黄信号と赤信号は、『(原則)止まれ』です。
そこで、信号機に例えると、
もし青のときは進むことができる、
その他のときは(原則)止まれ
ということです。
今回も、セルの値が特定の文字のときに、その右隣りのセルに文字を書きこむようにします。
予め、1~5行目・1列目のセルに『X』、『Z』、『Y』、『』、『X』という値を入れておきましょう。」
パイさん
「セルの値がAという条件に当てはまったとき、同じ行で別の列のセルに変数Tを書きこみ、
その他のとき、同じ行で別の列のセルに変数Fを書きこむというケースでは、次のような構文になります。」
1. 『X』のときは『エックス』、その他のときは『その他』
(1)If・Else文(条件分岐処理)
パイさん
「1行目・1列目のセルの値が『X』という条件式に当てはまったときは、
1行目・2列目のセルに『エックス』と、
その条件式に当てはまらないときは、
1行目・2列目のセルに『その他』と書きこんでみましょう。
列番号を定数『読取列』と『書込列』、行番号を変数『行番号』としましょう。」
ソンくん
「1行目・1列目のセルの値を読みとり、1行目・2列目のセルの値に書きこむのだから、
『読取列』の値を1として定数宣言 Const 読取列 = 1
『書込列』の値を2として定数宣言 Const 書込列 = 2
『行番号』を整数型として変数宣言 Dim 行番号 As Integer
そして、変数『行番号』に1を設定 行番号 = 1と記述します。
最後に、セルの値がAという条件に当てはまったとき、同じ行で別の列のセルに変数を書きこみ、
その他のとき、同じ行で別の列のセルに変数を書きこむ構文をつかってみます。
1行目・1列目のセルの値が『X』という条件式に当てはまったときは、
1行目・2列目のセルに『エックス』と、
1行目・1列目のセルの値がその条件式に当てはまらないときは、
1行目・2列目のセルに『その他』と書きこむのだから、
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
Else
Cells(行番号, 書込列).Value = "その他"
End If
で良いのでしょうか。」
Sub 条件式に当てはまらないときにも処理()
Const 読取列 = 1
Const 書込列 = 2
Dim 行番号 As Integer
行番号 = 1
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
Else
Cells(行番号, 書込列).Value = "その他"
End If
End Sub
パイさん
「その通りです。それでは、そのマクロを実行してみましょう。」
ソンくん
「1行目・1列目のセルの値が『X』だったので、
1行目・2列目のセルに『エックス』と書きこまれました。」
(2)For文(ループ処理)とIf・Else文(条件分岐処理)の組み合わせ
パイさん
「1~5行目の中で、
1列目のセルの値が『X』という条件式に当てはまったときは、
2列目のセルに『エックス』と書きこんで、
その条件式に当てはまらないときは、
2列目のセルに『その他』と書きこんでみましょう。」
ソンくん
「1~5行目のセルの値を読みとるということは、
行番号をカウントアップするループ処理が利用できそうですね。」
パイさん
「その通りです。
今回は、For文(ループ処理)のブロックの中に、
If_Else文(条件分岐処理)のブロックを組みこんでみましょう。
次のような構文になります。」
ソンくん
「変数宣言は、先ほどと同じにします。
初期化処理として、セル範囲『B1:B5』の値をクリア。
Range("B1:B5").ClearContents
次に、For文(ループ処理)のブロックの中に、
If_Else文(条件分岐処理)のブロックを組みこむ構文をつかってみます。
1~5行目の中で、
1列目のセルの値が『X』という条件式に当てはまったときは、
2列目のセルに『エックス』と書きこんで、
その条件式に当てはまらないときは、
2列目のセルに『その他』と書きこむのだから、
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
で良いのでしょうか。」
Sub ループブロックで条件式に当てはまらないときにも処理1()
Const 読取列 = 1
Const 書込列 = 2
Dim 行番号 As Integer
Range("B1:B5").ClearContents
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
End Sub
パイさん
「その通りです。それでは、そのマクロを実行してみましょう。」
ソンくん
「1列目、1・5行目のセルの値が『X』だったので、
2列目、1・5行目のセルに『エックス』と書きこまれ、
1列目、2・3・4行目のセルの値が『X』ではなかったので、
2列目、2・3・4行目のセルに『その他』と書きこまれました。」
2. 『X』のときは『エックス』、『Y』のときは『ワイ』、その他のときは『その他』
パイさん
「1~5行目の中で、
1列目のセルの値が『X』という条件式に当てはまったときは、
2列目のセルに『エックス』と書きこんで、
1列目のセルの値が『Y』という条件式に当てはまったときは、
2列目のセルに『ワイ』と書きこんで、
その二つの条件式に当てはまらないときは、
2列目のセルに『その他』と書きこんでみましょう。」
ソンくん
「あれっ、今回の問題は条件式が3個ありますよ。」
パイさん
「いいところに気が付きましたね。If_Else文(条件分岐処理)のブロックの中で、
実は、ElseIf文は何回でもつかうことができます。次のような構文になります。」
パイさん
「ElseIf文は途中で何回でもつかうことができますが、
必ずIf文が最初でElse文が最後になるように組んでください。」
ソンくん
「わかりました。今回は、条件式が3個になるので、
If文を1回、ElseIf文を1回、Else文を1回つかって、
条件式とそのときの処理を3個書いてみます。
変数宣言は、先ほどと同じにします。
初期化処理として、セル範囲『B1:B5』の値をクリア。
そして、For文(ループ処理)のブロックの中に、
If_ElseIf_Else文(条件分岐処理)のブロックを組みこむ構文をつかいます。
1~5行目の中で、
1列目のセルの値が『X』という条件式に当てはまったときは、
2列目のセルに『エックス』と書きこんで、
1列目のセルの値が『Y』という条件式に当てはまったときは、
2列目のセルに『ワイ』と書きこんで、
その二つの条件式に当てはまらないときは、
2列目のセルに『その他』と書きこむのだから、
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
ElseIf Cells(行番号, 読取列).Value = "Y" Then
Cells(行番号, 書込列).Value = "ワイ"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
と記述します。」
Sub ループブロックで条件式に当てはまらないときにも処理2()
Const 読取列 = 1
Const 書込列 = 2
Dim 行番号 As Integer
Range("B1:B5").ClearContents
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
ElseIf Cells(行番号, 読取列).Value = "Y" Then
Cells(行番号, 書込列).Value = "ワイ"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
End Sub
パイさん
「その通りです。それでは、そのマクロを実行してみましょう。」
ソンくん
「1列目、1・5行目のセルの値が『X』だったので、
2列目、1・5行目のセルに『エックス』と書きこまれ、
1列目、3行目のセルの値が『Y』だったので、
2列目、3行目のセルに『ワイ』と書きこまれ、
1列目、2・4行目のセルの値が『X』でも『Y』でもなかったので、
2列目、2・4行目のセルに『その他』と書きこまれました。」
3. 『X』のときは『エックス』、『Y』のときは『ワイ』、『』のときは『空白』、その他のときは『その他』
パイさん
「1~5行目の中で、
1列目のセルの値が『X』という条件式に当てはまったときは、
2列目のセルに『エックス』と書きこんで、
1列目のセルの値が『Y』という条件式に当てはまったときは、
2列目のセルに『ワイ』と書きこんで、
1列目のセルの値が『』という条件式に当てはまったときは、
2列目のセルに『空白』と書きこんで、
その三つの条件式に当てはまらないときは、
2列目のセルに『その他』と書きこんでみましょう。」
ソンくん
「今回は、条件式が4個になるので、
If文を1回、ElseIf文を2回、Else文を1回つかって、
条件式とそのときの処理を4個書いてみます。
変数宣言は、先ほどと同じにします。
初期化処理として、セル範囲『B1:B5』の値をクリア。
そして、For文(ループ処理)のブロックの中に、
If_ElseIf_Else文(条件分岐処理)の
ブロックを組みこむ構文をつかいます。
1~5行目の中で、
1列目のセルの値が『X』という条件式に当てはまったときは、
2列目のセルに『エックス』と書きこんで、
1列目のセルの値が『Y』という条件式に当てはまったときは、
2列目のセルに『ワイ』と書きこんで、
1列目のセルの値が『』という条件式に当てはまったときは、
2列目のセルに『空白』と書きこんで、
その三つの条件式に当てはまらないときは、
2列目のセルに『その他』と書きこむのだから、
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
ElseIf Cells(行番号, 読取列).Value = "Y" Then
Cells(行番号, 書込列).Value = "ワイ"
ElseIf Cells(行番号, 読取列).Value = "" Then
Cells(行番号, 書込列).Value = "空白"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
と記述します。」
Sub ループブロックで条件式に当てはまらないときにも処理3()
Const 読取列 = 1
Const 書込列 = 2
Dim 行番号 As Integer
Range("B1:B5").ClearContents
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "X" Then
Cells(行番号, 書込列).Value = "エックス"
ElseIf Cells(行番号, 読取列).Value = "Y" Then
Cells(行番号, 書込列).Value = "ワイ"
ElseIf Cells(行番号, 読取列).Value = "" Then
Cells(行番号, 書込列).Value = "空白"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
End Sub
パイさん
「その通りです。それでは、そのマクロを実行してみましょう。」
ソンくん
「1列目、1・5行目のセルの値が『X』だったので、
2列目、1・5行目のセルに『エックス』と書きこまれ、
1列目、3行目のセルの値が『Y』だったので、
2列目、3行目のセルに『ワイ』と書きこまれ、
1列目、3行目のセルの値が『』だったので、
2列目、3行目のセルに『空白』と書きこまれ、
1列目、2行目のセルの値が『X』でも『Y』でも『』でもなかったので、
2列目、2行目のセルに『その他』と書きこまれました。」
パイさん
「このように、For文(ループ処理)のブロックの中に、
If_Else文(条件分岐処理)のブロックを組みこむ構文をつかえば、
ループブロックで条件式に当てはまったときに特定の処理をして、
条件式に当てはまらないときに別の処理をすることができます。
試しに、『開始行』・『終了行』の各変数に設定する値、条件式の右辺に設定する値、
セルに書きこむ値を適当な数字や文字に書きかえて、マクロを実行して、
ループブロックで条件式に当てはまったときに特定の処理をして、
条件式に当てはまらないときに別の処理をすることができることを確かめてみましょう。
(1) 1~5行目の中で、
1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、
その条件式に当てはまらないときは、2列目のセルに『その他』と、
(2) 1~5行目の中で、
1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』、
その条件式に当てはまらないときは、2列目のセルに『その他』と、
(3) 2~4行目の中で、
1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、
1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』、
その二つの条件式に当てはまらないときは、2列目のセルに『その他』と、書きこんでみましょう。
-
演習(1):マクロ『ループブロックで条件式に当てはまらないときにも処理』
1~5行目の中で、
1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、
その条件式に当てはまらないときは、2列目のセルに『その他』と書きこむ
-
Sub ループブロックで条件式に当てはまらないときにも処理()
Const 読取列 = 1
Const 書込列 = 2
Dim 行番号 As Integer
Range("B1:B5").ClearContents
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "Y" Then
Cells(行番号, 書込列).Value = "ワイ"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
End Sub
-
演習(2):マクロ『ループブロックで条件式に当てはまらないときにも処理』
1~5行目の中で、
1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』、
その条件式に当てはまらないときは、2列目のセルに『その他』と書きこむ
-
Sub ループブロックで条件式に当てはまらないときにも処理()
Const 読取列 = 1
Const 書込列 = 2
Dim 行番号 As Integer
Range("B1:B5").ClearContents
For 行番号 = 1 To 5
If Cells(行番号, 読取列).Value = "Z" Then
Cells(行番号, 書込列).Value = "ゼット"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
End Sub
-
演習(3):マクロ『ループブロックで条件式に当てはまらないときにも処理』
2~4行目の中で、
1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、
1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』、
その二つの条件式に当てはまらないときは、2列目のセルに『その他』と書きこむ
-
Sub ループブロックで条件式に当てはまらないときにも処理()
Const 読取列 = 1
Const 書込列 = 2
Dim 行番号 As Integer
Range("B1:B5").ClearContents
For 行番号 = 2 To 4
If Cells(行番号, 読取列).Value = "Y" Then
Cells(行番号, 書込列).Value = "ワイ"
ElseIf Cells(行番号, 読取列).Value = "Z" Then
Cells(行番号, 書込列).Value = "ゼット"
Else
Cells(行番号, 書込列).Value = "その他"
End If
Next
End Sub
今回は、For文(ループ処理)のブロックの中に、
If_Else文(条件分岐処理)のブロックを組みこむ構文をつかえば、
ループブロックで条件式に当てはまったときに特定の処理をして、
条件式に当てはまらないときに別の処理をすることができるという話でした。
では、ループブロックで二つの条件式に両方とも当てはまったときに、
特定の処理を実行するには、どうすればよいのでしょうか。
これについては、次回『もしA列がXかつB列がXのときはエックスを実行』で紹介します。」