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

 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(または)は、二つ以上の条件式をつないで、

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


 Python-xlwingsのor条件のifとは、

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

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

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

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


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

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

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

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

 という値を入れておきます。

Img6_5_2

 今回は、このように予め

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

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

 という値を入れておいたWorkbookファイル『エックスワイ2列.xlsx』を読みこみます。


 xlwingsをつかいPythonで既存Excelを読みこみ操作するときは、

 Workbookファイルをメモリ上に読みこむと同時にWorkbookオブジェクトを生成、

 ( 『xlwingsをつかい既存Workbookを読みこみファイル保存』参照 )

 更に、sheetオブジェクトを生成して、そのsheetを操作します。

 Workbookオブジェクト名を『wb』、sheetオブジェクト名を『st』としておきます。

 予め、ソースコードパネルに

import xlwings

wb = xlwings.Book(‘エックスワイ2列.xlsx')

st = wb.sheets[0]

 と記述しておきます。


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

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

Img6_5_3


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

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

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

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

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


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

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

 変数『読取列X』の値に1  読取列X = 1

 変数『読取列Y』の値に2  読取列Y = 2

 変数『書込列』の値に3   書込列 = 3

 変数『行番号』の値に1   行番号 = 1 と記述します。

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

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

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

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

 if st.range(行番号, 読取列X).value == "X" \

 or st.range(行番号, 読取列Y).value == "X":

 st.range(行番号, 書込列).value = "一方はエックス"

 と記述します。


 【ソースコードパネル】

import xlwings

wb = xlwings.Book(‘エックスワイ2列.xlsx’)

st = wb.sheets[0]

読取列X = 1

読取列Y = 2

書込列 = 3

行番号 = 1

if st.range(行番号, 読取列X).value == "X": \

or st.range(行番号, 読取列Y).value == "X":

st.range(行番号, 書込列).value = “一方はエックス”


 それでは、そのPythonプログラムを実行してみましょう。

Img6_5_5

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

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



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

 1~9行目の中で、

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

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


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

 if or (条件分岐処理)のブロックを組みこんでみます。

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

Img6_5_6

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

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

読取列X = 1

読取列Y = 2

書込列 = 3

for 行番号 in range(1,10):

if st.range(行番号, 読取列X).value == "X" \

or st.range(行番号, 読取列Y).value == "X":

st.range(行番号, 書込列).value = "一方はエックス"

 と記述します。


 【ソースコードパネル】

import xlwings

wb = xlwings.Book(‘エックスワイ2列.xlsx’)

st = wb.sheets[0]

読取列X = 1

読取列Y = 2

書込列 = 3

for 行番号 in range(1,10):

if st.range(行番号, 読取列X).value == "X" \

or st.range(行番号, 読取列Y).value == "X":

st.range(行番号, 書込列).value = “一方はエックス”


 それでは、そのPythonプログラムを実行してみましょう。

Img6_5_8

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

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



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

 1~9行目の中で、

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

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


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

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

読取列X = 1

読取列Y = 2

書込列 = 3

for 行番号 in range(1,10):

if st.range(行番号, 読取列X).value == "Y" \

or st.range(行番号, 読取列Y).value == "Y":

st.range(行番号, 書込列).value = "一方はワイ"

 と記述します。


 【ソースコードパネル】

import xlwings

wb = xlwings.Book(‘エックスワイ2列.xlsx’)

st = wb.sheets[0]

読取列X = 1

読取列Y = 2

書込列 = 3

for 行番号 in range(1,10):

if st.range(行番号, 読取列X).value == "Y" \

or st.range(行番号, 読取列Y).value == "Y":

st.range(行番号, 書込列).value = “一方はワイ”


 それでは、そのPythonプログラムを実行してみましょう。

Img6_5_10

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

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



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

 1~9行目の中で、

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

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


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

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

読取列X = 1

読取列Y = 2

書込列 = 3

for 行番号 in range(1,10):

if st.range(行番号, 読取列X).value is None \

or st.range(行番号, 読取列Y).value is None:

st.range(行番号, 書込列).value = "一方は空白"

 と記述します。


 【ソースコードパネル】

import xlwings

wb = xlwings.Book(‘エックスワイ2列.xlsx’)

st = wb.sheets[0]

読取列X = 1

読取列Y = 2

書込列 = 3

for 行番号 in range(1,10):

if st.range(行番号, 読取列X).value is None \

or st.range(行番号, 読取列Y).value is None:

st.range(行番号, 書込列).value = “一方は空白”


 それでは、そのPythonプログラムを実行してみましょう。

Img6_5_12

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

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



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

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

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

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

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

 セルに書きこむ値を適当な数字や文字に書きかえて、Pythonプログラムを実行して、

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

 特定の処理を自由自在にすることができることを確かめてみてください。


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

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

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


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

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