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

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

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

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

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

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

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

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


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

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

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

Img4_3_1

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

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

Img4_3_2

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

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

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

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

Img4_3_3

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

Img4_3_4

 ターミナルパネルに、

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

Img4_3_5

 Pythonプログラムが正常に終了しました。


 『Re_workbook.xlsx』を開きます。

Img4_3_6

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

Img4_3_8

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

Img4_3_10

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

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



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

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

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

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


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

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

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

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