【ループ処理でセルの値を読みとる】
1 多数のセルの行番号と列番号を直接指定して値を読みとる
2 多数のセルの行番号と列番号を変数で指定して値を読みとる
3 ループ処理で多数行のセルの値を読みとる
4 ループ処理で多数列のセルの値を読みとる
5 ダブルループ処理で多数行×多数列のセルの値を読みとる
ダブルループ処理で多数行×多数列のセルの値を読みとる
ループ処理をつかって、多数行×多数列のセルの値を読みとってみます。
Python-xlwingsでは、二つ以上のループ処理を組み合わせることもできます。
Python-xlwingsのダブルループ処理をつかえば、
一つの順次処理で多数行×多数列のセルの値を読みとることができます。
変数『行番号』を、開始行から終了行になるまで1ずつカウントアップさせながら、
併せて、変数『列番号』を、開始列から終了列になるまで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~3列
行を1行目から3行目まで1行ずつカウントアップしていきながら、
列を1列目から3列目まで1列ずつカウントアップしていき、
3行×3列のセル値を読みとり『 』(スペース)区切りで文字連結し変数『val』に格納。
その後、セルA12に変数『val』を設定します。
このとき行番号を変数『行』、列番号を変数『列』とします。
今度の問題は、『行番号と列番号を変数で指定して読みとるの
4.1~3行・1~3列とほぼ同じ問題です。
そのときにつくったPythonプログラムの一部を記載します。
行 = 1
列 = 1
val = st.range(行,列).value
列 = 2
val = val + st.range(行,列).value
列 = 3
val = val + st.range(行,列).value
行 = 2
列 = 1
val = val + st.range(行,列).value
列 = 2
val = val + st.range(行,列).value
列 = 3
val = val + st.range(行,列).value
行 = 3
列 = 1
val = val + st.range(行,列).value
列 = 2
val = val + st.range(行,列).value
列 = 3
val = val + st.range(行,列).value
st.range('A12').value = val
変数『val』に空文字を格納、セルA12に変数『val』を格納、はそのままのこして、
for文をつかって、9回の順次処理を一つにまとめてみます。
val = ""
for 行 in range(1,4):
for 列 in range(1,4):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
今回のコードを解説します。
行を1行目から3行目まで1行ずつカウントアップするということから、
開始行は『1』、終了行は『3』となり、行に関するfor文は、
for 行 in range(1,4):
-----
になります。
列を1列目から3列目まで1列ずつカウントアップするということから、
開始列は『1』、終了列は『3』となり、列に関するfor文は、
for 列 in range(1,4):
-----
になります。
変数『val』に対して、一つ前の変数『val』と " " と変数『行』と変数『列』のセル値を
文字連結した値を設定するということから、処理は、
val = val + " " + st.range(行, 列).valueになります。
次に、『行と列の二つのループ処理を行うための構文』を参考にしながら、
二つのfor文と順次処理を組み合わせていきます。
for 行 in range(1,4):
for 列 in range(1,4):
val = val + " " + st.range(行, 列).value
と記述します。
【ソースコードパネル】
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)
st = wb.sheets[0]
val = ""
for 行 in range(1,4):
for 列 in range(1,4):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
それでは、そのPythonプログラムを実行してみましょう。
1行目から3行目で1列目から3列目のセル値が読みとられて
『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。
2. 1~5行・1~5列
行を1行目から5行目まで1行ずつカウントアップしていきながら、
列を1列目から5列目まで1列ずつカウントアップしていき、
5行×5列のセル値を読みとり『 』(スペース)区切りで文字連結し変数『val』に格納。
その後、セルA12に変数『val』を設定します。
このとき行番号を変数『行』、列番号を変数『列』とします。
for文では、range関数の第2引数に、終了値を記述することになっているから、
さきほどのPythonプログラムの
『for 行 in range(1,4):』を、『for 行 in range(1,6):』に
『for 列 in range(1,4):』を、『for 列 in range(1,6):』に
書きかえるだけです。
ソースコードパネルは、
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)
st = wb.sheets[0]
val = ""
for 行 in range(1,6):
for 列 in range(1,6):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
となります。
それでは、そのPythonプログラムを実行してみましょう。
1行目から5行目で1列目から5列目のセル値が読みとられて
『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。
だけど、3行4列までしか見えないため、3行5列から5行5列までが本当に読みとられているのかが、
よくわかりません。
そこで、セルA12の行の高さと書式を変更してみます。
行番号が『12』となっているマスをクリックします。
12行のセルが線で囲まれました。
これは、12行のセルが選択されている状態です。
この状態で、12行のセルにカーソルを置いたまま右クリックします。
下方向にたれ下がったメニューが現れました。
これは、ドロップダウンメニューとよばれるもので、Excelのいろんな操作や設定ができます。
このドロップダウンメニューの下から3番目の行の高さをクリックします。
『セルの高さ』というタイトルの小さな画面が現れました。
この画面で、『行の高さ』を変更できます。
『行の高さ』を120と書きかえてOKボタンをクリックします。
12行目の幅が大きくなりました。
次に、セルA12を選択して、Ctrlキーと1キーを同時に打ちます。
『セルの書式設定』という画面があらわれました。
そしたら、配置タブを選んで『文字の制御』の中の『折り返して全体を表示する』をクリックして
チェックマークがついている状態にしてからOKボタンをクリックします。
折り返して全体を表示するようになったため、3行5列から5行5列までが
本当に読みとられていることが、よくわかるようになりました。
このように、セルを折り返して全体を表示するようにすれば、
右はしの値が見えなくなるということがなくなり、見やすい表をつくることができます。
『PythonExcel_10_10.xlsx』を開いて、12行目の高さを『120』に変更し、
セルA12の配置タブを選んで『文字の制御』の中の『折り返して全体を表示する』を
チェックして保存しておきます。
3. 1~10行・1~10列
行を1行目から10行目まで1行ずつカウントアップしていきながら、
列を1列目から10列目まで1列ずつカウントアップしていき、
10行×10列のセル値を読みとり『 』(スペース)区切りで文字連結し変数『val』に格納。
その後、セルA12に変数『val』を設定します。
このとき行番号を変数『行』、列番号を変数『列』とします。
for文では、range関数の第2引数に、終了値を記述することになっているから、
さきほどのPythonプログラムの
『for 行 in range(1,6):』を、『for 行 in range(1,11):』に
『for 列 in range(1,6):』を、『for 列 in range(1,11):』に
書きかえるだけです。
ソースコードパネルは、
import xlwings
wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)
st = wb.sheets[0]
val = ""
for 行 in range(1,11):
for 列 in range(1,11):
val = val + " " + st.range(行,列).value
st.range('A12').value = val
となります。
それでは、そのPythonプログラムを実行してみましょう。
1行目から10行目で1列目から10列目のセル値が読みとられて
『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。
このように、for文をつかってループ処理を行えば、
多数行×多数列のセルの値を一瞬で読みとることができます。
試しに二つのfor文の開始値と終了値を適当な数字に書きかえて、
Pythonプログラムを実行して、多数行×多数列のセルの値が読みとれる
ことを確かめてみてください。
今回は、行数×列数がどんなに増えたとしても、for文をつかえば、
多数行×多数列に係る順次処理が、一つの順次処理にまとめられて、
多数行×多数列のセルの値を読みとることができるという話でした。
では、セルからセルへ値を代入するときは、どうすればよいのでしょうか。
これについては、次回『セルからセルへ値を代入』で紹介します。