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

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

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

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

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

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

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

パイさん

「条件分岐処理をつかって、場合によって処理を分けてみましょう。

 今回は、二つの条件式に両方とも当てはまったときに処理してみましょう。

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

Img6_4_1

ソンくん

And条件のIfとはどういう意味ですか。」

パイさん

「Excel VBA/マクロのAnd条件のIfとは、

 もしA列がXのとき、かつ、B列がXのときは

 エックスを実行するというように、

 条件式Aと条件式Bの両方とも当てはまったとき、

 処理を実行するということです。

 

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

 信号機には、赤信号・黄信号・青信号の他に右折・直進・左折といった矢印信号があります。

 矢印信号は、矢印が指し示す方向だけに進むことができます。

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

 もし右折矢印信号、かつ、右方向に進みたいときは、

 右方向に進むことができる

 ということです。

 

 『And(かつ)は、二つ以上の条件式をつないで、

 いずれも成り立つ状態ということを示す演算子です。

 今回は、1列目と2列目のセルの値が両方とも特定の文字のときに、

 3列目のセルに文字を書きこむようにします。予め、

 1~9行目・1列目のセルに、『X』、『X』、『X』、『』、『』、『』、『Y』、『Y』、『Y

 1~9行目・2列目のセルに、『X』、『Y』、『』、『X』、『Y』、『』、『X』、『Y』、『』

 という値を入れておきましょう。」

Img6_4_2

パイさん

読取列Xのセルの値がAかつ読取列Yのセルの値がBのとき、

 書込列のセルに変数を書きこむというケースでは、次のような構文になります。」

Img6_4_3

パイさん

「『_(アンダーバー)は、非常に長いコードを、読みやすくするために、

 複数行に分けて表示したいときにつかう行接続文字です。

 1行のコードを複数行に改行するには、改行したい位置に、

 半角スペースと『_(アンダーバー)の2文字を入力します。



1. 両方が『X』のときは『両方エックス』

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

パイさん

「1行目で、1列目のセルの値が『X』、かつ、2列目のセルの値が『X』のとき、

 3列目のセルに『両方エックス』と書きこんでみましょう。

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

 そして、初期化処理でクリアするセルの範囲を『C1:C9』としておきましょう。」

ソンくん

「1行目・1列目のセルと1行目・2列目のセルの値を読みとり、

 1行目・3列目のセルの値に書きこむのだから、

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

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

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

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

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

 最後に、読取列Xのセルの値がAかつ読取列Yのセルの値がBのとき、

 書込列のセルに変数を書きこむ構文をつかってみます。

 1列目のセルの値が『X』、かつ、2列目のセルの値が『X』のとき、

 3列目のセルに『両方エックス』と書きこむのだから、

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

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

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

 End If

 で良いのでしょうか。」

Sub 二つの条件式に両方とも当てはまったときに処理()

 Const 読取列X = 1

 Const 読取列Y = 2

 Const 書込列 = 3

 Dim 行番号 As Integer

 

 行番号 = 1

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

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

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

 End If

End Sub

パイさん

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


Img6_4_5

ソンくん

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

 3列目のセルに『両方エックス』と書きこまれました。」



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

パイさん

「1~9行目の中で、

 1列目のセルの値が『X』、かつ、2列目のセルの値が『X』のとき、

 3列目のセルに『両方エックス』と書きこんでみましょう。」

ソンくん

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

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

パイさん

「その通りです。

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

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

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

Img6_4_6

ソンくん

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

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

 Range("C1:C9").ClearContents

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

 If And (条件分岐処理)のブロックを組みこむ構文をつかいます。

 1~9行目の中で、

 1列目のセルの値が『X』、かつ、2列目のセルの値が『X』のとき、

 3列目のセルに『両方エックス』と書きこむのだから、

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

 で良いのでしょうか。」

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

 Const 読取列X = 1

 Const 読取列Y = 2

 Const 書込列 = 3

 Dim 行番号 As Integer

 

 Range("C1:C9").ClearContents

 

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

End Sub

パイさん

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


Img6_4_8

ソンくん

1行目で、1列目のセルの値が『X』、かつ、2列目のセルの値が『X』だったので、

 3列目のセルに『両方エックス』と書きこまれました。」




2. 両方が『Y』のときは『両方ワイ』

パイさん

「1~9行目の中で、

 1列目のセルの値が『Y』、かつ、2列目のセルの値が『Y』のとき、

 3列目のセルに『両方ワイ』と書きこんでみましょう。」

ソンくん

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

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

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

 If And (条件分岐処理)のブロックを組みこむ構文をつかいます。

 1~9行目の中で、

 1列目のセルの値が『Y』、かつ、2列目のセルの値が『Y』のとき、

 3列目のセルに『両方ワイ』と書きこむのだから、

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

 と記述します。」

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

 Const 読取列X = 1

 Const 読取列Y = 2

 Const 書込列 = 3

 Dim 行番号 As Integer

 

 Range("C1:C9").ClearContents

 

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

End Sub

パイさん

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


Img6_4_10

ソンくん

8行目で、1列目のセルの値が『Y』、かつ、2列目のセルの値が『Y』だったので、

 3列目のセルに『両方ワイ』と書きこまれました。」




3. 両方が『』のときは『両方空白』

パイさん

「1~9行目の中で、

 1列目のセルの値が『』、かつ、2列目のセルの値が『』のとき、

 3列目のセルに『両方空白』と書きこんでみましょう。」

ソンくん

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

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

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

 If And (条件分岐処理)のブロックを組みこむ構文をつかいます。

 1~9行目の中で、

 1列目のセルの値が『』、かつ、2列目のセルの値が『』のとき、

 3列目のセルに『両方空白』と書きこむのだから、

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

 と記述します。」

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

 Const 読取列X = 1

 Const 読取列Y = 2

 Const 書込列 = 3

 Dim 行番号 As Integer

 

 Range("C1:C9").ClearContents

 

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

End Sub

パイさん

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


Img6_4_12

ソンくん

6行目で、1列目のセルの値が『』、かつ、2列目のセルの値が『』だったので、

 3列目のセルに『両方空白』と書きこまれました。」




パイさん

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

 If And (条件分岐処理)のブロックを組みこむ構文をつかえば、

 ループブロック二つの条件式に両方とも当てはまったとき

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

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

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

 ループブロック二つの条件式に両方とも当てはまったとき

 特定の処理を自由自在にすることができることを確かめてみましょう。

 (1) 1~9行目の中で、1列目のセルの値が『X』、かつ、2列目のセルの値が『Y』のとき、

   3列目のセルに『エックスかつワイ』と、

 (2) 1~9行目の中で、1列目のセルの値が『Y』、かつ、2列目のセルの値が『X』のとき、

   3列目のセルに『ワイかつエックス』と、

 (3) 1~9行目の中で、1列目のセルの値が『』でなく、かつ、2列目のセルの値が『』でないとき、

   3列目のセルに『両方空白でない』と、書きこんでみましょう。

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

1~9行目の中で、

1列目のセルの値が『X』、かつ、2列目のセルの値が『Y』のとき、

3列目のセルに『エックスかつワイ』と書きこむ

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

 Const 読取列X = 1

 Const 読取列Y = 2

 Const 書込列 = 3

 Dim 行番号 As Integer

 

 Range("C1:C9").ClearContents

 

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

End Sub

 

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

1~9行目の中で、

1列目のセルの値が『Y』、かつ、2列目のセルの値が『X』のとき、

3列目のセルに『ワイかつエックス』と書きこむ

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

 Const 読取列X = 1

 Const 読取列Y = 2

 Const 書込列 = 3

 Dim 行番号 As Integer

 

 Range("C1:C9").ClearContents

 

 For 行番号 = 1 To 9

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

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

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

   End If

 Next

End Sub

 

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

1~9行目の中で、

1列目のセルの値が『』でなく、かつ、2列目のセルの値が『』でないとき、

3列目のセルに『両方空白でない』と書きこむ

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

 Const 読取列X = 1

 Const 読取列Y = 2

 Const 書込列 = 3

 Dim 行番号 As Integer

 

 Range("C1:C9").ClearContents

 

 For 行番号 = 1 To 9

   If Cells(行番号, 読取列X).Value <> "" _

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

       Cells(行番号, 書込列).Value = "両方空白でない"

   End If

 Next

End Sub

 

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

 if And (条件分岐処理)のブロックを組みこむ構文をつかえば、

 ループブロック二つの条件式に両方とも当てはまったとき

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


 では、ループブロック二つの条件式の一方が当てはまったときに、

 特定の処理を実行するには、どうすればよいのでしょうか。

 これについては、次回『二つの条件式の一方に合ったら実行』で紹介します。」