【ループ処理でセルの値を読みとる】

 1 多数のセルの行番号と列番号を直接指定して値を読みとる

 2 多数のセルの行番号と列番号を変数で指定して値を読みとる

 3 ループ処理で多数行のセルの値を読みとる

 4 ループ処理で多数列のセルの値を読みとる

 5 ダブルループ処理で多数行×多数列のセルの値を読みとる

ループ処理で多数列のセルの値を読みとる

 ループ処理をつかって、列番号をカウントアップしながら多数列のセルの値を読みとってみます。


 Python-xlwingsのループ処理をつかえば、
 一つの順次処理で多数列のセルの値を読みとることができます

 変数『列番号を、開始列から終了列になるまで1ずつカウントアップさせながら、

 セルの値を読みとる順次処理をくり返し実行するforは、次のようになります。

Img4_4_1

 forの後に、変数の値を別のセルに格納します。

 変数の値を読みとってセル番地のセルに格納する順次処理は次のようになります。

Img4_4_2

 今回も、多数のセルの値を読みとることになるので、

 『ループ処理で多数行×多数列のセルに値を書きこむ』のときに、

 Pythonプログラムで10行×10列のセルに値を書きこんでおいたWorkbookファイル

 『PythonExcel_10_10.xlsx』を読みこみます。

Img4_4_4

 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プログラムを実行してみましょう。

Img4_4_6

 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プログラムを実行してみましょう。

Img4_4_8

 1行目・1~10列目のセル値が読みとられて『 』(スペース)区切りで文字連結されて、

 セルA12に書きこまれました。



 このように、forをつかってループ処理を行えば、

 多数列のセルの値を一瞬で読みとることができます。

 試しに、forの開始列・終了列と行番号の変数に設定する値を適当な数字に書きかえて、

 Pythonプログラムを実行して、多数列のセルの値が読みとれることを確かめてみてください。


 今回は、列数がどんなに増えたとしても、forをつかえば、多数列に係る順次処理が、

 一つの順次処理にまとめられて、多数列のセルの値を読みとることができるという話でした。

 では、行数列数の両方とも増えたときは、どうすればよいのでしょうか。

 これについては、次回『ループ処理で多数行×多数列のセルの値を読みとる』で紹介します。