【条件分岐処理でセルの操作を分ける】

 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を紹介します。」

Img6_3_1

ソンくん

If_Elseとはどういう意味ですか。」

パイさん

「Excel VBA/マクロのIf_Elseとは、

 もしA列が、Xのときはエックス、その他のときはソノタを実行するというように、

 条件式に当てはまったとき処理Tを実行し、その他のとき処理Fを実行するということです。

 

 信号機に例えてみましょう。

 信号機には、赤信号・黄信号・青信号があります。

 赤信号は、『止まれ』

 黄信号は、『原則止まれ』

 青信号は、『進むことができる』

 という意味です。

 青信号以外、つまり黄信号と赤信号は、『(原則)止まれ』です。

 そこで、信号機に例えると、

 もし青のときは進むことができる、

 その他のときは(原則)止まれ

 ということです。

 

 今回も、セルの値が特定の文字のときに、その右隣りのセルに文字を書きこむようにします。

 予め、1~5行目・1列目のセルに『X』、『Z』、『Y』、『』、『X』という値を入れておきましょう。」

Img6_3_2

パイさん

セルの値がAという条件に当てはまったとき同じ行で別の列のセルに変数Tを書きこみ、

 その他のとき同じ行で別の列のセルに変数Fを書きこむというケースでは、次のような構文になります。」

Img6_3_3


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

パイさん

「その通りです。それでは、そのマクロを実行してみましょう。」


Img6_3_5

ソンくん

「1行目・1列目のセルの値が『X』だったので、

 1行目・2列目のセルに『エックス』と書きこまれました。」



(2)For文(ループ処理)とIf・Else文(条件分岐処理)の組み合わせ

パイさん

「1~5行目の中で、

 1列目のセルの値が『X』という条件式に当てはまったときは、

 2列目のセルに『エックス』と書きこんで、

 その条件式に当てはまらないときは、

 2列目のセルに『その他』と書きこんでみましょう。」

ソンくん

「1~5行目のセルの値を読みとるということは、

 行番号をカウントアップするループ処理が利用できそうですね。」

パイさん

「その通りです。

 今回は、For(ループ処理)のブロックの中に、

 If_Else(条件分岐処理)のブロックを組みこんでみましょう。

 次のような構文になります。」

Img6_3_6

ソンくん

「変数宣言は、先ほどと同じにします。

 初期化処理として、セル範囲『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

パイさん

「その通りです。それでは、そのマクロを実行してみましょう。」


Img6_3_8

ソンくん

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は何回でもつかうことができます。次のような構文になります。」

Img6_3_9

パイさん

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

パイさん

「その通りです。それでは、そのマクロを実行してみましょう。」


Img6_3_11

ソンくん

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

パイさん

「その通りです。それでは、そのマクロを実行してみましょう。」


Img6_3_13

ソンくん

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のときはエックスを実行』で紹介します。」