【ループ処理でセルの値を読みとる】
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行・1~3列
行を1行目に固定して、列を1列目から3列目まで1列ずつカウントアップしていきながら、
そのつどセル値を読みとり『 』(スペース)区切りで文字連結し変数『val』に格納。
その後、セルA12に変数『val』を設定します。
このとき行番号を変数『行』、列番号を変数『列』とします。
今度の問題は、『多数のセルの行番号と列番号を変数で指定して読みとる』の
3.1行・1~3列とほぼ同じ問題です。
そのときにつくった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』を格納、変数『val』に空文字を格納、セルA12に変数『val』を格納、
はそのままのこして、for文をつかって、3回の順次処理を一つにまとめてみます。
行 = 1
val = ""
for 列 in range(1,4):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
今回のコードを解説します。
『val + " " + st.range(行, 列).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
val = ""
for 列 in range(1,4):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
それでは、そのPythonプログラムを実行してみましょう。
1行目・1~3列目のセル値が読みとられて『 』(スペース)区切りで文字連結されて、
セルA12に書きこまれました。
2. 1行・1~10列
行を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行目・1~10列目のセル値が読みとられて『 』(スペース)区切りで文字連結されて、
セルA12に書きこまれました。
このように、for文をつかってループ処理を行えば、
多数列のセルの値を一瞬で読みとることができます。
試しに、for文の開始列・終了列と行番号の変数に設定する値を適当な数字に書きかえて、
Pythonプログラムを実行して、多数列のセルの値が読みとれることを確かめてみてください。
今回は、列数がどんなに増えたとしても、for文をつかえば、多数列に係る順次処理が、
一つの順次処理にまとめられて、多数列のセルの値を読みとることができるという話でした。
では、行数と列数の両方とも増えたときは、どうすればよいのでしょうか。
これについては、次回『ループ処理で多数行×多数列のセルの値を読みとる』で紹介します。