【ループ処理でセルの値を読みとる】
1 多数のセルの行番号と列番号を直接指定して値を読みとる
2 多数のセルの行番号と列番号を変数で指定して値を読みとる
3 ループ処理で多数行のセルの値を読みとる
4 ループ処理で多数列のセルの値を読みとる
5 ダブルループ処理で多数行×多数列のセルの値を読みとる
ループ処理で多数行のセルの値を読みとる
ループ処理をつかって、行番号をカウントアップしながら多数行のセルの値を読みとってみます。
Python-xlwingsのループ処理をつかえば、
一つの順次処理で多数行のセルの値を読みとることができます。
変数『行番号』を、開始行から終了行になるまで1ずつカウントアップさせながら、
セルの値を読みとる順次処理をくり返し実行するfor文は、次のようになります。
for文の後に、変数の値を別のセルに格納します。
変数の値を読みとってセル番地のセルに格納する順次処理は次のようになります。
今回も、多数のセルの値を読みとることになるので、
『ループ処理で多数行×多数列のセルに値を書きこむ』のときに、
Pythonプログラムで10行×10列のセルに値を書きこんでおいたWorkbookファイル
『PythonExcel_10_10.xlsx』を読みこみます。
xlwingsをつかいPythonで既存Excelを読みこみ操作するときは、
Workbookファイルをメモリ上に読みこむと同時にWorkbookオブジェクトを生成、
( 『xlwingsをつかい既存Workbookを読みこみファイル保存』参照 )
更に、sheetオブジェクトを生成して、そのsheetを操作します。
Workbookオブジェクト名を『wb』、sheetオブジェクト名を『st』としておきます。
予め、ソースコードパネルに
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx')
st = wb.sheets[0]
と記述しておきます。
1. 1~3行・1列
列を1列目に固定して、行を1行目から3行目まで1行ずつカウントアップしていきながら、
そのつどセル値を読みとり文字連結し変数『val』に格納。
その後、セルA12に変数『val』を設定します。
このとき行番号を変数『行』、列番号を変数『列』とします。
今度の問題は、『多数のセルの行番号と列番号を変数で指定して読みとる』の
2.1~3行・1列と同じ問題です。
そのときにつくったPythonプログラムの一部を記載します。
列 = 1
行 = 1
val = st.range(行,列).value
行 = 2
val = val + st.range(行,列).value
行 = 3
val = val + st.range(行,列).value
st.range('A12').value = val
変数『列』に値『1』を格納、セルA12に変数『val』を格納、はそのままのこして、
for文をつかって、3回の順次処理を一つにまとめてみます。
列 = 1
for 行 in range(1,4):
val = val + st.range(行,列).value
st.range('A12').value = val
今回のコードを解説します。
『for 行 in range(1,4):』の次の行から
一段階インデント(半角スペース4文字分)されているコードが
ループ処理のブロックとなっていて、
『val = val + st.range(行, 列).value』
がくり返し実行される処理となっています。
『for 行 in range(1,4):』は、
変数『行』を開始行『1』から終了行『3』まで1ずつカウントアップしていく
ということです。
つまり、
for 行 in range(1,4):
val = val + st.range(行, 列).value
とは、
変数『行』を開始行『1』から終了行『3』まで1ずつカウントアップしながら、
変数『val』に対して、一つ前の変数『val』と変数『行』と変数『列』のセル値を
文字結合した値を設定するという意味です。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)
st = wb.sheets[0]
列 = 1
for 行 in range(1,4):
val = val + st.range(行,列).value
st.range('A12').value = val
それでは、そのPythonプログラムを実行してみます。
ターミナルパネルに、
File "c:/Python_Excel_PG/Python_Excel_xlwings/Python_Excel441ERR.py", line 6, in <module>
val = val + st.range(行,列).value
NameError: name 'val' is not defined
と表示されました。
これは、『Pythonファイルの6行目、val = val + st.range(行,列).valueで名前エラー:
名前『val』は、定義されていません。』という意味です。
そもそも、Pythonでは、変数のデータ型宣言の明記が不要です。
初めて変数に値を代入したときに、データ型が自動判定されます。
Pythonファイルの6行目、val = val + st.range(行,列).valueでは、
変数『val』に変数『val』(とセルの値の結合値)を代入することになります。
変数『val』に変数『val』を代入できるようにするためには、
その上の行で、変数『val』にデータ型が自動判定できるように
何らかの初期値を代入しておく必要があります。
変数『val』を数値型としたければ変数『val』に数値の初期値『0』、
変数『val』を文字列型としたければ変数『val』に文字列の初期値『""』(空文字)を
代入しておく必要があります。
今回は、変数『val』に文字列型の初期値として『””』(空文字)を代入するコードを
for文の一つ上の行に書き加えます。
Pythonファイルの5行目に、val = ""を追加しました。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)
st = wb.sheets[0]
列 = 1
val = ""
for 行 in range(1,4):
val = val + st.range(行,列).value
st.range('A12').value = val
それでは、そのPythonプログラムを実行してみます。
Pythonプログラムが正常に終了しました。
『Re_workbook.xlsx』を開きます。
1~3行目・1列目のセル値が読みとられて文字連結されて、セルA12に書きこまれましたが、
セル値どうしがピッタリくっついているので読みにくいです。
そこで、セル値とセル値の間に『 』(スペース)を入れてみます。
for文の処理部分
val = val + st.range(行, 列).value
を少し書きかえます。
セル値とセル値の間に『 』(スペース)を追加するのだから、
val = val + " " + st.range(行, 列).value
と書きかえました。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)
st = wb.sheets[0]
列 = 1
val = ""
for 行 in range(1,4):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
それでは、そのPythonプログラムを実行してみましょう。
1~3行目・1列目のセル値が読みとられて『 』(スペース)区切りで文字連結されて、
セルA12に書きこまれました。
2. 1~10行・1列
列を1列目に固定して、行を1行目から10行目まで1行ずつカウントアップしていきながら、
そのつどセル値を読みとり『 』(スペース)区切りで文字連結し変数『val』に格納。
その後、セルA12に変数『val』を設定します。
このとき行番号を変数『行』、列番号を変数『列』とします。
一つ前の問題は、『行を1行目から3行目まで1行ずつカウントアップ』するのに対して、
今度の問題は、『行を1行目から10行目まで1行ずつカウントアップ』するということで、
カウントアップの終了値が変わるだけです。
for文では、range関数の第2引数に、終了値を記述することになっているから、
さきほどのPythonプログラムの『for 行 in range(1,4):』を、『for 行 in range(1,11):』に
書きかえるだけです。
ソースコードパネルは、
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)
st = wb.sheets[0]
列 = 1
val = ""
for 行 in range(1,11):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
となります。
それでは、そのPythonプログラムを実行してみましょう。
1~10行目・1列目のセル値が読みとられて『 』(スペース)区切りで文字連結されて、
セルA12に書きこまれました。
このように、for文をつかってループ処理を行えば、
多数行のセルの値を一瞬で読みとることができます。
試しに、for文の開始行・終了行と列番号の変数に設定する値を適当な数字に書きかえて、
Pythonプログラムを実行して、多数行のセルの値が読みとれることを確かめてみてください。
今回は、行数がどんなに増えたとしても、for文をつかえば、多数行に係る順次処理が、
一つの順次処理にまとめられて、多数行のセルの値を読みとることができるという話でした。
では、列数が増えたときは、どうすればよいのでしょうか。
これについては、次回『ループ処理で多数列のセルの値を読みとる』で紹介します。