【条件分岐処理でセルの操作を分ける】
1 もしA列がXのときはエックスを実行
2 もしA列が、Xのときはエックス、Yのときはワイを実行
3 もしA列が、Xのときはエックス、その他のときはソノタを実行
4 もしA列がXかつB列がXのときはエックスを実行
5 もしA列がXまたはB列がXのときはエックスを実行
もしA列がXのときはエックスを実行
条件分岐処理をつかえば、条件によって処理を分けることができます。
ここで、条件分岐処理のもっとも基本的な構文として、if文を紹介します。
Python-xlwingsのif文とは、
もしA列がXのときはエックスを実行するというように、
条件式に当てはまったとき、処理を実行するということです。
今回は、セルの値が特定の文字のときに、その右隣りのセルに文字を書きこむようにします。
予め、1~5行目・1列目のセルに『X』、『Z』、『Y』、『』、『X』という値を入れておきます。
今回は、このように1~5行目・1列目のセルに『X』、『Z』、『Y』、『』、『X』という値を入れておいた
Workbookファイル『エックスワイ.xlsx』を読みこみます。
xlwingsをつかいPythonで既存Excelを読みこみ操作するときは、
Workbookファイルをメモリ上に読みこむと同時にWorkbookオブジェクトを生成、
( 『xlwingsをつかい既存Workbookを読みこみファイル保存』参照 )
更に、sheetオブジェクトを生成して、そのsheetを操作します。
Workbookオブジェクト名を『wb』、sheetオブジェクト名を『st』としておきます。
予め、ソースコードパネルに
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx')
st = wb.sheets[0]
と記述しておきます。
セルの値がAのとき、同じ行で別の列のセルに変数を書きこむ
というケースでは、次のような構文になります。
1. 『X』のときは『エックス』
(1) if文(条件分岐処理)
1行目・1列目のセルの値が『X』のときは、
1行目・2列目のセルに『エックス』と書きこんでみます。
列番号を変数『読取列』と『書込列』、行番号を変数『行番号』とします。
1行目・1列目のセルの値を読みとり、
1行目・2列目のセルの値に書きこむのだから、
変数『読取列』の値に1 読取列 = 1
変数『書込列』の値に2 書込列 = 2
変数『行番号』の値に1 行番号 = 1 と記述します。
次に、セルの値がAのとき、同じ行で別の列のセルに変数を書きこむ書きこむ構文をつかってみます。
1行目・1列目のセルの値が『X』のときは、
1行目・2列目のセルに『エックス』と書きこむのだから、
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = "エックス"
と記述します。
読取列 = 1
書込列 = 2
行番号 = 1
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = "エックス"
『if st.range(行番号, 読取列).value == "X":』の
次の行から一段階インデント(半角スペース4文字分)されているコードが
条件分岐処理のブロックとなっていて、if文の条件式に当てはまったときだけ
『st.range(行番号, 書込列).value = "エックス"』が実行される処理となっています。
if文の条件式でつかわれる『==』は、左辺と右辺が等しいことを意味する等号記号です。
『st.range(行番号, 読取列).value == "X"』は、
指定したセルの値と『X』が等しいという意味です。
つまり、
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = "エックス"
とは、指定したセルの値が『X』のとき、特定のセルに『エックス』と書きこむという意味です。
ソースコードパネルは、
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx’)
st = wb.sheets[0]
読取列 = 1
書込列 = 2
行番号 = 1
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = “エックス”
となります。
それでは、そのPythonプログラムを実行してみましょう。
1列目、1行目のセルの値が『X』だったので、
2列目、1行目のセルに『エックス』と書きこまれました。
一つ前の問題は、『1行目・1列目のセルの値が『X』のときは、
1行目・2列目のセルに『エックス』と書きこむ』のに対して、
今度の問題は、『2行目・1列目のセルの値が『X』のときは、
2行目・2列目のセルに『エックス』と書きこむ』ということで、
変数『行』の値が変わるだけです。
さきほどのプログラムの『行番号 = 1』を『行番号 = 2』に書きかえます。
読取列 = 1
書込列 = 2
行番号 = 2
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = "エックス"
『行番号 = 2』に書きかえました。
ソースコードパネルは、
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx’)
st = wb.sheets[0]
読取列 = 1
書込列 = 2
行番号 = 2
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = “エックス”
となります。
それでは、そのPythonプログラムを実行してみましょう。
1列目、2行目のセルの値は『X』ではないので、
2列目、2行目のセルに『エックス』は書きこまれませんでした。
(2) for文(ループ処理)とif文(条件分岐処理)の組み合わせ
1~5行目・1列目のセルの値が『X』のときは、
同じ行で2列目のセルに『エックス』と書きこんでみます。
今回は、for文(ループ処理)のブロックの中に、
if文(条件分岐処理)のブロックを組みこんでみます。
次のような構文になります。
for文(ループ処理)のブロックの中に、
if文(条件分岐処理)のブロックを組みこむ構文をつかってみます。
1~5行目・1列目のセルの値が『X』のときは、
同じ行で2列目のセルに『エックス』と書きこむのだから、
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = "エックス"
と記述します。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx’)
st = wb.sheets[0]
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value == "X":
st.range(行番号, 書込列).value = “エックス”
それでは、そのPythonプログラムを実行してみましょう。
1列目、5行目のセルの値が『X』だったので、
2列目、5行目のセルに『エックス』と書きこまれました。
2. 『Y』のときは『ワイ』
1~5行目・1列目のセルの値が『Y』のときは、
同じ行で2列目のセルに『ワイ』と書きこんでみます。
for文(ループ処理)のブロックの中に、
if文(条件分岐処理)のブロックを組みこむ構文をつかってみます。
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value == "Y":
st.range(行番号, 書込列).value = "ワイ"
と記述します。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx’)
st = wb.sheets[0]
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value == "Y":
st.range(行番号, 書込列).value = “ワイ”
それでは、そのPythonプログラムを実行してみましょう。
1列目、3行目のセルの値が『Y』だったので、
2列目、3行目のセルに『ワイ』と書きこまれました。
3. 値が入っていないときは『空白』
1~5行目・1列目のセルに値が入ってないときは、
同じ行で2列目のセルに『空白』と書きこんでみます。
Pythonでは、空白のセルを指定すると、『None』が返ってきます。
セルに値が入ってない状態は、
『st.range(行番号, 列番号).value is None』と表すことができます。
for文(ループ処理)のブロックの中に、
if文(条件分岐処理)のブロックを組みこむ構文をつかいます。
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value is None:
st.range(行番号, 書込列).value = "空白"
と記述します。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx’)
st = wb.sheets[0]
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value is None:
st.range(行番号, 書込列).value = “空白”
それでは、そのPythonプログラムを実行してみましょう。
1列目、4行目のセルの値が『』、つまり、値が入っていなかったので、
2列目、4行目のセルに『空白』と書きこまれました。
4. 値が入っているときは『英字』
1~5行目・1列目のセルに値が入っているときは、
同じ行で2列目のセルに『英字』と書きこんでみます。
Pythonでは、空白のセルを指定すると、『None』が返ってきます。
逆に、セルに値が入っている状態は、
『st.range(行番号, 列番号).value is not None』と表すことができます。
for文(ループ処理)のブロックの中に、
if文(条件分岐処理)のブロックを組みこむ構文をつかいます。
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value is not None:
st.range(行番号, 書込列).value = "英字"
と記述します。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx’)
st = wb.sheets[0]
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value is not None:
st.range(行番号, 書込列).value = “英字”
それでは、そのPythonプログラムを実行してみましょう。
1列目、1・2・3・5行目のセルの値が『』でなかった、つまり、値が入っていたので、
2列目、1・2・3・5行目のセルに『英字』と書きこまれました。
5. 『X』でないときは『エックスでない』
1~5行目・1列目のセルの値が『X』でないときは、
同じ行で2列目のセルに『エックスでない』と書きこんでみます。
セルの値が『X』でない状態は、
『st.range(行番号, 列番号).value != "X"』と表すことができます。
if文の条件式でつかわれる『!=』は、左辺と右辺が等しくないことを意味する不等号記号です。
for文(ループ処理)のブロックの中に、
if文(条件分岐処理)のブロックを組みこむ構文をつかいます。
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value != "X":
st.range(行番号, 書込列).value = "エックスでない"
と記述します。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘エックスワイ.xlsx’)
st = wb.sheets[0]
読取列 = 1
書込列 = 2
for 行番号 in range(1,6):
if st.range(行番号, 読取列).value != "X":
st.range(行番号, 書込列).value = “エックスでない”
それでは、そのPythonプログラムを実行してみましょう。
1列目、2・3・4行目のセルの値が『X』でなかったので、
2列目、2・3・4行目のセルに『エックスでない』と書きこまれました。
このように、for文(ループ処理)のブロックの中に、
if文(条件分岐処理)のブロックを組みこむ構文をつかえば、
ループブロックで一つの条件式に当てはまったときに
特定の処理をすることができます。
試しに、『開始行』・『終了行』の各変数に設定する値、条件式の右辺に設定する値、セルに書きこむ値を
適当な数字や文字に書きかえて、プログラムを実行して、
ループブロックで一つの条件式に当てはまったときに
特定の処理を自由自在にすることができることを確かめてみてください。
それでは、ループブロックで二つ以上の各条件式に当てはまったときに、
それぞれの処理を実行するにはどうすればよいのでしょうか。
これについては、次回『もしA列が、Xのときはエックス、Yのときはワイを実行』で紹介します。