【ループ処理でセルからセルへ値を代入する】

 1 セルからセルへ値を代入

 2 行のループ処理でセルからセルへ値を代入

 3 列のループ処理でセルからセルへ値を代入

 4 行×列のダブルループ処理でセルからセルへ値を代入

行×列のダブルループ処理でセルからセルへ値を代入

 ループ処理をつかって、行番号列番号をカウントアップしながら

 セルからセルへ値を代入してみます。


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

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

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

 セルの値を読みとり別のセルに書きこむ順次処理をくり返し実行する

 二重forは、次のようになります。

Img5_4_1

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

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

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

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

Img5_2_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~3列のセルから10行下・10列右のセルへ

Img5_4_2

 行を1行目から3行目まで1行ずつカウントアップしていきながら、

 列を1列目から3列目まで1列ずつカウントアップしていき、

 そのつどセルの値を読みとり、その1010のセルに書きこんでみます。

 このとき行番号を変数『読取行』と変数『書込行』、

 列番号を変数『読取列』と変数『書込列』とします。

 行を1行目から3行目まで1行ずつカウントアップしていきながら、

 そのつどセルの値を読みとり、その10のセルに書きこむということを考えてみます。

 『読取行』を開始行『1』から終了行『3』まで1ずつカウントアップしていくループコード

 for 読取行 in range(1,4):

 『書込行』を『読取行』より10増やす処理コード

 書込行 = 読取行 + 10

 書込セル読取セルの値を代入する処理コード

 st.range(書込行, 書込列).value = st.range(読取行, 読取列).value

 そして、これら二つの処理コードを、読取行』をカウントアップしていくループコード

 組み合わせます。

 for 読取行 in range(1,4):

 書込行 = 読取行 + 10

 st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 次に、列を1列目から3列目まで1列ずつカウントアップしていきながら、

 そのつどセルの値を読みとり、その10のセルに書きこむということを考えてみます。

 『読取列』を開始列『1』から終了列『3』まで1ずつカウントアップしていくループコード

 for 読取列 in range(1,4):

 『書込列』を『読取列』より10増やす処理コード

 書込列 = 読取列 + 10

 書込セル読取セルの値を代入する処理コード

 st.range(書込行, 書込列).value = st.range(読取行, 読取列).value

 そして、これら二つの処理コードを、読取列』をカウントアップしていくループコード

 組み合わせます。

 for 読取列 in range(1,4):

 書込列 = 読取列 + 10

 st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 最後に、番号をカウントアップしながらセルからセルへ値を代入するループ処理と、

 番号をカウントアップしながらセルからセルへ値を代入するループ処理を、組み合わせます。

for 読取行 in range(1,4):

書込行 = 読取行 + 10

for 読取列 in range(1,4):

書込列 = 読取列 + 10

st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 【ソースコードパネル】

import xlwings

wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)

st = wb.sheets[0]

for 読取行 in range(1,4):

書込行 = 読取行 + 10

for 読取列 in range(1,4):

書込列 = 読取列 + 10

st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 それでは、そのPythonプログラムを実行してみましょう。

Img5_4_4

 1~3行目1~3列目のセルの値が読みとられて、

 その101011~13行目11~13列目のセルに書きこまれました。



2. 4~6行・4~6列のセルから10行下・10列右のセルへ

Img5_4_5

 4行目から6行目まで1行ずつカウントアップしていきながら、

 4列目から6列目まで1列ずつカウントアップしていき、

 そのつどセルの値を読みとり、その1010のセルに書きこんでみます。


 今度の問題も、の二つのループ処理を利用します。

 一つ前の問題は、『1行目から3行目まで1行ずつカウントアップしていきながら、

 1列目から3列目まで1列ずつカウントアップ』するのに対して、

 今度の問題は、『4行目から6行目まで1行ずつカウントアップしていきながら、

 4列目から6列目まで1列ずつカウントアップ』するということで、

 カウントアップの開始行終了行開始列終了列が変わるだけですね。

 さきほどのPythonプログラムの、for 読取 in range(1,4):for 読取 in range(4,7):に、

 for 読取 in range(1,4):for 読取 in range(4,7):に書きかえます。

for 読取行 in range(4,7):

書込行 = 読取行 + 10

for 読取列 in range(4,7):

書込列 = 読取列 + 10

st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 【ソースコードパネル】

import xlwings

wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)

st = wb.sheets[0]

for 読取行 in range(4,7):

書込行 = 読取行 + 10

for 読取列 in range(4,7):

書込列 = 読取列 + 10

st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 それでは、そのPythonプログラムを実行してみましょう。

Img5_4_7

 4~6行目4~6列目のセルの値が読みとられて、

 その101014~16行目14~16列目のセルに書きこまれました。



3. 7~10行・7~10列のセルから10行下・10列右のセルへ

Img5_4_8

 7行目から10行目まで1行ずつカウントアップしていきながら、

 7列目から10列目まで1列ずつカウントアップしていき、

 そのつどセルの値を読みとり、その1010のセルに書きこんでみます。


 一つ前の問題は、『4行目から6行目まで1行ずつカウントアップしていきながら、

 4列目から6列目まで1列ずつカウントアップ』するのに対して、

 今度の問題は、『7行目から10行目まで1行ずつカウントアップしていきながら、

 7列目から10列目まで1列ずつカウントアップ』するということで、

 カウントアップの開始行終了行開始列終了列が変わるだけです。

 さきほどのPythonプログラムの、for 読取 in range(4,7):for 読取 in range(7,11):に、

 for 読取 in range(4,7):for 読取 in range(7,11):に書きかえます。

for 読取行 in range(7,11):

書込行 = 読取行 + 10

for 読取列 in range(7,11):

書込列 = 読取列 + 10

st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 【ソースコードパネル】

import xlwings

wb = xlwings.Book(‘PythonExcel_10_10.xlsx’)

st = wb.sheets[0]

for 読取行 in range(7,11):

書込行 = 読取行 + 10

for 読取列 in range(7,11):

書込列 = 読取列 + 10

st.range(書込行, 書込列).value = st.range(読取行, 読取列).value


 それでは、そのPythonプログラムを実行してみましょう。

Img5_4_10

 7~10行目7~10列目のセルの値が読みとられて、

 その101017~20行目17~20列目のセルに書きこまれました。


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

 多数の行×列のセルから多数の行×列のセルへ一瞬で値を代入することができます。

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

 プログラムを実行して、多数の行×列のセルから多数の行×列のセルへ値を代入できることを

 確かめてみてください。


 今回は、二つのループ処理をつかえば、

 多数の行×列のセルから多数の行×列のセルへ値を代入できるという話でした。

 ただ無条件にセルからセルへ値を移すだけでしたら、

 順次処理ループ処理だけでプログラムは完成します。

 しかし、Excel操作は、条件によって処理を分けることが必要になることもあります。

 Excel操作で、条件によって処理を分けることが必要になったときは、どうしたらよいのでしょうか。

 そのようなときは、プログラムの3つの基本構造の内、

 三つ目の基本構造である条件分岐処理の出番となります。

 条件分岐処理をつかえば、条件によって処理を分けることができます。

 条件分岐処理については、次回『もしA列がXのときはエックスを実行』で紹介します。