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

 1 もしA列がXのときはエックスを実行

 2 もしA列が、Xのときはエックス、Yのときはワイを実行

 3 もしA列が、Xのときはエックス、その他のときはソノタを実行

 4 もしA列がXかつB列がXのときはエックスを実行

 5 もしA列がXまたはB列がXのときはエックスを実行

もしA列が、Xのときはエックス、Yのときはワイを実行

パイさん

「前回『もしA列がXのときはエックスを実行』では、条件分岐処理のもっとも基本的な構文として、

 条件式に当てはまったときに、処理を実行するIfを紹介しました。

 

 今回は、二つ以上の各条件式に当てはまったときにそれぞれの処理を実行する

 If_ElseIfを紹介します。」

Img6_2_1

ソンくん

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

パイさん

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

 もしA列が、Xのときはエックス、Yのときはワイを実行するというように、

 各条件式に当てはまったとき、それぞれの処理を実行するということです。

 

 信号機に例えると、

 もし赤のときは止まれ、

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

 ということです。

 

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

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

Img6_2_2

パイさん

セルの値がAのとき同じ行で別の列のセルに変数Lを書きこみ、

 セルの値がBのとき同じ行で別の列のセルに変数Mを書きこむ

 というケースでは、次のような構文になります。」

Img6_2_3


1. 『X』のときは『エックス』、『Y』のときは『ワイ』

(1)If・ElseIf文(条件分岐処理)

パイさん

「1行目・1列目のセルの値が『X』のときは、1行目・2列目のセルに『エックス』と、

 1行目・1列目のセルの値が『Y』のときは、1行目・2列目のセルに『ワイ』と書きこんでみましょう。

 列番号を定数『読取列』と『書込列』、行番号を変数『行番号』としましょう。」

ソンくん

「1行目・1列目のセルの値を読みとり、1行目・2列目のセルの値に書きこむのだから、

 『読取列』の値を1として定数宣言  Const 読取列 = 1

 『書込列』の値を2として定数宣言  Const 書込列 = 2

 『行番号』を整数型として変数宣言 Dim 行番号 As Integer

 そして、変数『行番号』に1を設定  行番号 = 1と記述します。

 最後に、セルの値がAのとき同じ行で別の列のセルに変数を書きこむ書きこみ、

 セルの値がBのとき同じ行で別の列のセルに変数を書きこむ書きこむ

 構文をつかってみます。

 1行目・1列目のセルの値が『X』のときは、1行目・2列目のセルに『エックス』と、

 1行目・1列目のセルの値が『Y』のときは、1行目・2列目のセルに『ワイ』と書きこむのだから、

 If Cells(行番号, 読取列).Value = "X" Then

   Cells(行番号, 書込列).Value = "エックス"

 ElseIf Cells(行番号, 読取列).Value = "Y" Then

   Cells(行番号, 書込列).Value = "ワイ"

 End If

 で良いのでしょうか。」

Sub 二つ以上の各条件式に当てはまったときに処理()

 Const 読取列 = 1

 Const 書込列 = 2

 Dim 行番号 As Integer

 

 行番号 = 1

 If Cells(行番号, 読取列).Value = "X" Then

   Cells(行番号, 書込列).Value = "エックス"

 ElseIf Cells(行番号, 読取列).Value = "Y" Then

   Cells(行番号, 書込列).Value = "ワイ"

 End If

End Sub

パイさん

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


Img6_2_5

ソンくん

「1行目・1列目のセルの値が『X』だったので、1行目・2列目のセルに『エックス』と書きこまれました。」



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

パイさん

「1~5行目の中で、

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

 1列目のセルの値が『Y』のときは、2列目のセルに『ワイ』と書きこんでみましょう。」

ソンくん

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

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

パイさん

「その通りです。

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

 If_ElseIf(条件分岐処理)のブロック

 組みこんでみましょう。次のような構文になります。」

Img6_2_6

ソンくん

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

 初期化処理として、セル範囲『B1:B5』の値をクリア。

 Range("B1:B5").ClearContents

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

 If_ElseIf(条件分岐処理)のブロック

 組みこむ構文をつかってみます。

 1~5行目の中で、

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

 1列目のセルの値が『Y』のときは、2列目のセルに『ワイ』と書きこむのだから、

 For 行番号 = 1 To 5

   If Cells(行番号, 読取列).Value = "X" Then

     Cells(行番号, 書込列).Value = "エックス"

   ElseIf Cells(行番号, 読取列).Value = "Y" Then

     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 = "エックス"

   ElseIf Cells(行番号, 読取列).Value = "Y" Then

     Cells(行番号, 書込列).Value = "ワイ"

   End If

 Next

End Sub

パイさん

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


Img6_2_8

ソンくん

1列目1・5行目のセルの値が『X』だったので、2列目1・5行目のセルに『エックス』と書きこまれ、

 1列目3行目のセルの値が『Y』だったので、2列目3行目のセルに『ワイ』と書きこまれました。」




2. 『X』のときは『エックス』、『Y』のときは『ワイ』、『』のときは『空白』

パイさん

「1~5行目の中で、

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

 1列目のセルの値が『Y』のときは、2列目のセルに『ワイ』と書きこんで、

 1列目のセルの値が『』のときは、2列目のセルに『空白』と書きこんでみましょう。」

ソンくん

「あれっ、今回の問題は条件式が3個ありますよ。」

パイさん

「いいところに気が付きましたね。

 If_ElseIf(条件分岐処理)のブロックの中で、

 実は、ElseIfは何回でもつかうことができます。

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

Img6_2_9

パイさん

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

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

 黄信号の意味を知っていますか。」

ソンくん

「黄信号は、『注意して止まれ』です。」

パイさん

「その通りです。黄信号は、『原則止まれ』ですが、

 停止位置で止まるためにブレーキをかけると危険な場合もあるため、

 安全に停止できない場合は進むことができるという意味です。」

ソンくん

「信号機に例えると、

 もし赤のときは止まれ、

 もし黄色のときは注意して止まれ、

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

 ということです。」

パイさん

「その通りです。今回は、条件式が3個になるので、Ifを1回、ElseIfを2回つかって、

 条件式とそのときの処理を3個書いてみましょう。」

ソンくん

「変数宣言は、先ほどと同じにします。初期化処理として、セル範囲『B1:B5』の値をクリア。

 そして、For(ループ処理)のブロックの中に、

 If_ElseIf(条件分岐処理)のブロック

 組みこむ構文をつかいます。

 1~5行目の中で、

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

 1列目のセルの値が『Y』のときは、2列目のセルに『ワイ』と書きこんで、

 1列目のセルの値が『』のときは、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 = "空白"

   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 = "ワイ"

   ElseIf Cells(行番号, 読取列).Value = "" Then

     Cells(行番号, 書込列).Value = "空白"

   End If

 Next

End Sub

パイさん

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


Img6_2_11

ソンくん

1列目1・5行目のセルの値が『X』だったので、2列目1・5行目のセルに『エックス』と書きこまれ、

 1列目3行目のセルの値が『Y』だったので、2列目3行目のセルに『ワイ』と書きこまれ、

 1列目4行目のセルの値が『』だったので、2列目4行目のセルに『空白』と書きこまれました。」




3. 『X』のときは『エックス』、『Y』のときは『ワイ』、
 『』のときは『空白』、『』でないときは『その他の英字』

パイさん

「1~5行目の中で、

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

 1列目のセルの値が『Y』のときは、2列目のセルに『ワイ』と書きこんで、

 1列目のセルの値が『』のときは、2列目のセルに『空白』と書きこんで、

 1列目のセルの値が『』でないときは、2列目のセルに『その他の英字』と書きこんでみましょう。」

ソンくん

「今回は、条件式が4個になるので、Ifを1回、ElseIfを3回つかって、条件式とそのときの処理を

 4個書いてみます。

 

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

 初期化処理として、セル範囲『B1:B5』の値をクリア。

 そして、For(ループ処理)のブロックの中に、

 If_ElseIf(条件分岐処理)のブロック

 組みこむ構文をつかいます。

 1~5行目の中で、

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

 1列目のセルの値が『Y』のときは、2列目のセルに『ワイ』と書きこんで、

 1列目のセルの値が『』のときは、2列目のセルに『空白』と書きこんで、

 1列目のセルの値が『』でないときは、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 = "空白"

   ElseIf Cells(行番号, 読取列).Value <> "" Then

     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 = "空白"

   ElseIf Cells(行番号, 読取列).Value <> "" Then

     Cells(行番号, 書込列).Value = "その他の英字"

   End If

 Next

End Sub

パイさん

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


Img6_2_13

ソンくん

1列目1・5行目のセルの値が『X』だったので、2列目1・5行目のセルに『エックス』と書きこまれ、

 1列目3行目のセルの値が『Y』だったので、2列目3行目のセルに『ワイ』と書きこまれ、

 1列目4行目のセルの値が『』だったので、2列目4行目のセルに『空白』と書きこまれ、

 1列目2行目のセルの値が『』でなかったので、2列目2行目のセルに『その他の英字』と書きこまれました。」




パイさん

「このように、For(ループ処理)のブロックの中に、

 If_ElseIf(条件分岐処理)のブロック

 組みこむ構文をつかえば、ループブロック二つ以上の各条件式に当てはまったとき

 それぞれ特定の処理をすることができます

 試しに、『開始行』・『終了行』の各変数に設定する値、条件式の右辺に設定する値、

 セルに書きこむ値を適当な数字や文字に書きかえて、マクロを実行して、

 ループブロック二つ以上の各条件式に当てはまったとき

 それぞれ特定の処理をすることができることを確かめてみましょう。

 (1) 1~5行目の中で、

   1列目のセルの値が『X』のときは、同じ行で2列目のセルに『エックス』、

   1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』と、

 (2) 1~5行目の中で、

   1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、

   1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』と、

 (3) 2~4行目の中で、

   1列目のセルの値が『X』のときは、同じ行で2列目のセルに『エックス』、

   1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、

   1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』と、書きこんでみましょう。

演習(1):マクロ『ループブロックで二つ以上の各条件式に当てはまったときに処理』

1~5行目の中で、

1列目のセルの値が『X』のときは、同じ行で2列目のセルに『エックス』、

1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』と書きこむ

Sub ループブロックで二つ以上の各条件式に当てはまったときに処理()

 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 = "Z" Then

     Cells(行番号, 書込列).Value = "ゼット"

   End If

 Next

End Sub

 

演習(2):マクロ『ループブロックで二つ以上の各条件式に当てはまったときに処理』

1~5行目の中で、

1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、

1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』と書きこむ

Sub ループブロックで二つ以上の各条件式に当てはまったときに処理()

 Const 読取列 = 1

 Const 書込列 = 2

 Dim 行番号 As Integer

 

 Range("B1:B5").ClearContents

 

 For 行番号 = 1 To 5

   If Cells(行番号, 読取列).Value = "Y" Then

     Cells(行番号, 書込列).Value = "ワイ"

   ElseIf Cells(行番号, 読取列).Value = "Z" Then

     Cells(行番号, 書込列).Value = "ゼット"

   End If

 Next

End Sub

 

演習(3):マクロ『ループブロックで二つ以上の各条件式に当てはまったときに処理』

2~4行目の中で、

1列目のセルの値が『X』のときは、同じ行で2列目のセルに『エックス』、

1列目のセルの値が『Y』のときは、同じ行で2列目のセルに『ワイ』、

1列目のセルの値が『Z』のときは、同じ行で2列目のセルに『ゼット』と書きこむ

Sub ループブロックで二つ以上の各条件式に当てはまったときに処理()

 Const 読取列 = 1

 Const 書込列 = 2

 Dim 行番号 As Integer

 

 Range("B1:B5").ClearContents

 

 For 行番号 = 2 To 4

   If Cells(行番号, 読取列).Value = "X" Then

     Cells(行番号, 書込列).Value = "エックス"

   ElseIf Cells(行番号, 読取列).Value = "Y" Then

     Cells(行番号, 書込列).Value = "ワイ"

   ElseIf Cells(行番号, 読取列).Value = "Z" Then

     Cells(行番号, 書込列).Value = "ゼット"

   End If

 Next

End Sub

 

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

 If_ElseIf(条件分岐処理)のブロック

 組みこむ構文をつかえば、

 ループブロック二つ以上の各条件式に当てはまったとき

 それぞれ特定の処理をすることができるという話でした。

 では、ループブロック条件式に当てはまったときに処理を実行し、

 条件式に当てはまらないときにも処理を実行するには、どうすればよいのでしょうか。

 これについては、次回『もしA列が、Xのときはエックス、その他のときはソノタを実行』で紹介します。」