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

 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_5_1

ソンくん

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

パイさん

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

 もしA列がXのとき、または、B列がXのときは

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

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

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

 

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

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

 旧型の信号機なら青信号と言いつつ緑色をしていました。

 最近のLED信号機なら青信号が旧型の信号機と比べれば

 だいぶ本当の青色に近い色となっています。

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

 もし青、または、緑のときは、

 進むことができる

 ということです。

 

 『Or(または)は、二つ以上の条件式をつないで、

 少なくとも一つは成り立つ状態ということを示す演算子です。

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

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

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

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

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

Img6_5_2

パイさん

読取列Xのセルの値がAまたは読取列Yのセルの値がBのとき、

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

Img6_5_3


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" _

  Or 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" _

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

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

 End If

End Sub

パイさん

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


Img6_5_5

ソンくん

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

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



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

パイさん

「1~9行目の中で、

 1列目のセルの値が『X』、または、2列目のセルの値が『X』のとき、

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

ソンくん

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

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

パイさん

「その通りです。

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

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

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

Img6_5_6

ソンくん

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

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

 Range("C1:C9").ClearContents

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

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

 1~9行目の中で、

 1列目のセルの値が『X』、または、2列目のセルの値が『X』のとき、

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

 For 行番号 = 1 To 9

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

    Or 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" _

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

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

   End If

 Next

End Sub

パイさん

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


Img6_5_8

ソンくん

1・2・3・4・7行目で、1列目のセルの値が『X』、または、2列目のセルの値が『X』だったので、

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




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

パイさん

「1~9行目の中で、

 1列目のセルの値が『Y』、または、2列目のセルの値が『Y』のとき、

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

ソンくん

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

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

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

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

 1~9行目の中で、

 1列目のセルの値が『Y』、または、2列目のセルの値が『Y』のとき、

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

 For 行番号 = 1 To 9

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

    Or 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" _

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

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

   End If

 Next

End Sub

パイさん

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


Img6_5_10

ソンくん

2・5・7・8・9行目で、1列目のセルの値が『Y』、または、2列目のセルの値が『Y』だったので、

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




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

パイさん

「1~9行目の中で、

 1列目のセルの値が『』、または、2列目のセルの値が『』のとき、

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

ソンくん

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

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

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

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

 1~9行目の中で、

 1列目のセルの値が『』、または、2列目のセルの値が『』のとき、

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

 For 行番号 = 1 To 9

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

    Or 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 = "" _

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

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

   End If

 Next

End Sub

パイさん

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


Img6_5_12

ソンくん

3・4・5・6・9行目で、1列目のセルの値が『』、または、2列目のセルの値が『』だったので、

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




パイさん

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

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

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

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

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

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

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

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

 (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" _

     Or 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" _

     Or 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 <> "" _

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

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

   End If

 Next

End Sub

 

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

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

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

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


 プログラムの3つの基本構造順次処理ループ処理条件分岐処理に関する基本を学習しました。

 あるセルから文字列全部を読み取り、別のセルに文字列全部を書きこむことは、

 どんな行数でも、どんな条件でも、今までに学習した内容で実現できます。

 

 では、ある文字列から一部の文字列を取得するには、どうすればよいのでしょうか。

 これについては、次回『文字列から一部の文字列を取得』で紹介します。」