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

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

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

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

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

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

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

 ループ処理をつかって、多数行×多数列のセルの値を読みとってみます。


 Python-xlwingsでは、二つ以上のループ処理を組み合わせることもできます

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

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

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

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

Img4_5_1

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

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

Img4_5_2

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

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

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

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

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

Img4_5_6

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

Img4_5_8

 1行目から5行目で1列目から5列目のセル値が読みとられて

 『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。

 だけど、3行4列までしか見えないため、3行5列から5行5列までが本当に読みとられているのかが、

 よくわかりません。

 そこで、セルA12の行の高さと書式を変更してみます。

 行番号が『12』となっているマスをクリックします。

Img4_5_9

 12行のセルが線で囲まれました。


 これは、12行のセルが選択されている状態です。

 この状態で、12行のセルにカーソルを置いたまま右クリックします。

Img4_5_10

 下方向にたれ下がったメニューが現れました。

 これは、ドロップダウンメニューとよばれるもので、Excelのいろんな操作や設定ができます。

 このドロップダウンメニューの下から3番目の行の高さをクリックします。


Img4_5_11

 『セルの高さ』というタイトルの小さな画面が現れました。

 この画面で、『行の高さ』を変更できます。

 『行の高さ』を120と書きかえてOKボタンをクリックします。

Img4_5_12

 12行目の幅が大きくなりました。

Img4_5_13

 次に、セルA12を選択して、Ctrlキーと1キーを同時に打ちます。

Img4_5_14

 『セルの書式設定』という画面があらわれました。

 そしたら、配置タブを選んで『文字の制御』の中の『折り返して全体を表示する』をクリックして

 チェックマークがついている状態にしてからOKボタンをクリックします。

Img4_5_15

 折り返して全体を表示するようになったため、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プログラムを実行してみましょう。

Img4_5_17

 1行目から10行目で1列目から10列目のセル値が読みとられて

 『 』(スペース)区切りで文字連結されて、セルA12に書きこまれました。



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

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

 試しに二つのfor開始値終了値を適当な数字に書きかえて、

 Pythonプログラムを実行して、多数行×多数列のセルの値が読みとれる

 ことを確かめてみてください。


 今回は、行数×列数がどんなに増えたとしても、forをつかえば、

 多数行×多数列に係る順次処理が、一つの順次処理にまとめられて、

 多数行×多数列のセルの値を読みとることができるという話でした。

 では、セルからセルへ値を代入するときは、どうすればよいのでしょうか。

 これについては、次回『セルからセルへ値を代入』で紹介します。