【他のレンジ/シート/ブックを更新する】

1 あるレンジから別レンジを更新

2 あるシートから別シートを更新

3 逆Z式並びで更新

4 セルで指定したシートを更新

5 複数シートを連続更新

6 関数の定義と呼び出し

7 Pythonの汎用型プログラム構成

あるシートから別シートを更新

 今回は、Python-xlwingsによって、あるシートからデータを読みとり別シートへデータを書きこんでみます。



1. あるシートから別シートを更新

 Python-xlwingsで、シート内で、あるセルから別のセルに値を代入するときは、次のような構文になります。

Img9_1_10

 シート内で、あるセルから別のセルに値を代入するときは、ワークシート名が無くても、コンピューターは

 どこから、どこに代入するかを判断できます。

 だけど、あるシートから別のシートに値を代入するときは、ワークシート名が無ければ、コンピューターは

 どのワークシートのセルから、どのワークシートのセルに代入するかを判断できなくなります。

 そのため、Python-xlwingsで、あるシートのセルから、別シートのセルに値を代入するときは、

 それぞれのワークシート名を指定します。

 次のような構文になります。

Img9_1_11


2. 別シートに漢字学習帳を作成

 前回は、同一シート内で、『漢字入力帳』レンジからデータを読みとり、

 『漢字学習帳』レンジへデータを書きこみました。

 今回は、『漢字入力帳』シートからデータを読みとり、

 『漢字学習帳』シートへデータを書きこんでみます。

 そこで、その準備として、Excelマクロ有効ブック内に、

 『漢字入力帳』シートと『漢字学習帳』シートを作成しておきます。

 先ずは、Pythonプログラムファイルを保存しているフォルダ内に、

 前回使用したExcelブック『ワークブック810.xlsx』をコピーして

 『ワークブック820.xlsx』を作成します。

Img9_1_21

 次に、『ワークブック820.xlsx』の『ワークシート1』のシート名を『漢字入力帳』に変更します。

Img9_1_22

 そして、シート『漢字入力帳』をコピーして、新シートを作成します。

Img9_1_23

 それから、コピーして作成された『漢字入力帳 (2)』のシート名を『漢字学習帳』に変更します。

Img9_1_24

 最後に、シート『漢字学習帳』のレンジ『A1:J11』をクリアします。

Img9_1_25

 これで、『漢字入力帳』シートからデータを読みとり、『漢字学習帳』シートへデータを書きこむ

 準備ができました。それでは、『漢字入力帳』シートからデータを読みとり、『漢字学習帳』シートへ

 データを書きこむPythonプログラムを作成しましょう。『漢字入力帳』シートを選択します。

Img9_1_27

 Excelの『漢字入力帳』シートのB列に記述されている文を1文字ずつ分解しながら、

 『漢字学習帳』シートに2行目から縦書きで書きこみ、

 『漢字入力帳』シートのC~F列に記述されている漢字が

 『漢字学習帳』シートに書きこんだ文字の中にあれば、

 当セルを空欄のマスにして、併せてそのすぐ右側に、

 『漢字入力帳』シートのG~J列に記述されているふりがなを書きこむ。

 この一連の処理を、『漢字入力帳』シートの最小行から最大行までのループ処理で一気に実行し、

 『漢字学習帳』シートのL列からAD列まで瞬時に書きこみます。

xlwingsをxwとしてインポート

Excelファイル『ワークブック820.xlsx』をメモリ上に読みこみWorkbookオブジェクト『wb』を生成

『wb』のExcelシート『漢字入力帳』を読みこみsheetオブジェクト『Est』を生成

定数『読取列』にB列つまり『2』列を代入

定数『最大枠数』に『4』を代入

定数『漢字最小列』にC列つまり『3』列を代入

定数『漢字最大列』にF列つまり『6』列を代入

定数『読取最小行』に『2』を代入

『wb』のExcelシート『漢字学習帳』を読みこみsheetオブジェクト『Wst』を生成

定数『最小列』にL列つまり『12』列を代入

定数『書込ステップ列』に『2』を代入

定数『最小行』に『2』行目を代入

 

EstのB列つまり『2』列の最大行を取得し、変数『読取最大行』に格納

変数『列番号』に定数『最小列』の値を代入

変数『読取行』を『読取最小行』から『読取最大行』+1までカウントアップしながら以下の処理を繰り返す

変数『txt』にEstのセル(『行番号』,『読取列』)の値を代入

変数『txt』から文字数を取得し、変数『最大文字数』に格納

変数『位置インデックス』を 0 から『最大文字数』までカウントアップしながら以下の処理を繰り返す

変数『行番号』に『最小行』+『位置インデックス』を代入

Wstのセル(『行番号』,『列番号』)の値に変数『txt』から取得した『位置インデックス』の文字を代入

 

変数『漢字列』を『漢字最小列』から『漢字最大列』+1までカウントアップしながら以下の処理を繰り返す

変数『漢字名』にEstのセル(『読取行』,『漢字列』)の値を代入

変数『漢字名』が空白でないとき

Estのセル(『読取行』,『読取列』)の値から『漢字名』の位置を調べて変数『位置インデックス』に格納

変数『位置インデックス』が0以上のとき

変数『行番号』に『最小行』+『位置インデックス』を代入

Wstの『列番号』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

Wstの枠領域のセルの周りを実線で囲う

Wstの枠領域を空白にする

変数『ふりがな読取列』に『漢字列』+『最大枠数』を代入

変数『ふりがな名』にEstのセル(『読取行』,『ふりがな読取列』)の値を代入

変数『ふりがな名』が空白でないとき

変数『ふりがな列』に『列番号』+ 1 を代入

Wstの『ふりがな列』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

Wstの枠領域のセルの値に『ふりがな名』を代入

Wstの枠領域のセルのフォントサイズを8に設定

Wstの枠領域のセルの横方向の配置を左詰めに設定

Wstの枠領域のセルの文字の配置を縦方向に設定

Wstの枠領域のセルの文字を縮小して全体を表示に設定

変数『列番号』に『列番号』+『書込ステップ列』を代入


 Pythonプログラム『PXS8014.py』をコピーして、Pythonプログラム『PXS8021.py』をつくります。


 オブジェクト生成部・定数部を改修します。

xlwingsをxwとしてインポート。

Excelファイル『ワークブック820.xlsx』をメモリ上に読みこみWorkbookオブジェクト『wb』を生成

『wb』のExcelシート『漢字入力帳』を読みこみsheetオブジェクト『Est』を生成

『wb』のExcelシート『漢字学習帳』を読みこみsheetオブジェクト『Wst』を生成

import xlwings as xw

wb = xw.Book(’ワークブック820.xlsx’)

Est = wb.sheets[’漢字入力帳’]

Wst = wb.sheets[’漢字学習帳’]


 処理部を改修します。

 Pythonプログラム『PXS8014.py』では、同一シート内で、あるレンジからデータを読みとり、

 別レンジへデータを書きこみました。

 Pythonプログラム『PXS8021.py』では、

あるシート:Estのレンジからデータを読みとり、別シート:Wstのレンジへデータを書きこみます。

 そのため、変更箇所は、次のようになります。

Img9_1_29

 【ソースコードパネル】

# PXS8021.py

import xlwings as xw

wb = xw.Book(’ワークブック820.xlsx’)

Est = wb.sheets[’漢字入力帳’]

読取列 = 2

最大枠数 = 4

漢字最小列 = 3

漢字最大列 = 6

読取最小行 = 2

Wst = wb.sheets[’漢字学習帳’]

最小列 = 12

書込ステップ列 = 2

最小行 = 2

 

読取最大行 = Est.range(Est.cells.last_cell.row, 2).end('up').row

列番号 = 最小列

# ===== 読取行の最小行から最大行へのループにより読取行をカウントアップ =====

for 読取行 in range(読取最小行, 読取最大行 + 1):

txt = Est.range(読取行, 読取列).value

最大文字数 = len(txt)

# ===== 文字列の先頭文字から最終文字へのループにより位置インデックスをカウントアップ =====

for 位置インデックス in range(0, 最大文字数):

行番号 = 最小行 + 位置インデックス

Wst.range(行番号, 列番号).value = txt[位置インデックス]

# ===== 漢字列の最小列から最大列へのループにより漢字列をカウントアップ =====

for 漢字列 in range(漢字最小列, 漢字最大列 + 1):

漢字名 = Est.range(読取行, 漢字列).value

if 漢字名 is not None:

位置インデックス = Est.range(読取行, 読取列).value.find(漢字名)

if 位置インデックス >= 0:

行番号 = 最小行 + 位置インデックス

列英字名 = Wst.range(1, 列番号).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).api.Borders.LineStyle = 1

Wst.range(枠領域).value = ""

ふりがな読取列 = 漢字列 + 最大枠数

ふりがな名 = Est.range(読取行, ふりがな読取列).value

if ふりがな名 is not None:

ふりがな列 = 列番号 + 1

列英字名 = Wst.range(1, ふりがな列).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).value = ふりがな名

Wst.range(枠領域).api.Font.Size = 8

Wst.range(枠領域).api.HorizontalAlignment = -4131

Wst.range(枠領域).api.Orientation = -4166

Wst.range(枠領域).api.ShrinkToFit = True

列番号 = 列番号 + 書込ステップ列


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

Img9_1_31

 『漢字学習帳』シートのL列からAD列にかけて、漢字の書きこみ問題が作成されました。



 次は、『漢字学習帳』シートのB列からT列にかけて、漢字の書きこみ問題を作成してみましょう。

 『漢字学習帳』シートのB列からK列を削除します。

Img9_1_32

 レンジ『B2:U13』をクリアします。

Img9_1_33

 先ほどは、『漢字学習帳』シートのL列からAD列にかけて、漢字の書きこみ問題を作成しました。

 今度は、Pythonプログラム『シートからシート1』をコピーして、Pythonプログラム『PXS8022.py』とし、

 『漢字学習帳』シートのB列からT列にかけて、漢字の書きこみ問題を作成します。

 書込最小列がL列からB列に変わるだけだから、

 書込最小列『最小列』を『12』列目から『2』列目に変更します。


 オブジェクト生成部・定数部を改修します。

定数『最小列』に『2』列を代入

import xlwings as xw

wb = xw.Book(’ワークブック820.xlsx’)

Est = wb.sheets[’漢字入力帳’]

読取列 = 2

最大枠数 = 4

漢字最小列 = 3

漢字最大列 = 6

読取最小行 = 2

Wst = wb.sheets[’漢字学習帳’]

最小列 = 2

書込ステップ列 = 2

最小行 = 2


 今回は、処理部の変更はありません。


 【ソースコードパネル】

# PXS8022.py

import xlwings as xw

wb = xw.Book(’ワークブック820.xlsx’)

Est = wb.sheets[’漢字入力帳’]

読取列 = 2

最大枠数 = 4

漢字最小列 = 3

漢字最大列 = 6

読取最小行 = 2

Wst = wb.sheets[’漢字学習帳’]

最小列 = 2

書込ステップ列 = 2

最小行 = 2

 

読取最大行 = Est.range(Est.cells.last_cell.row, 2).end('up').row

列番号 = 最小列

# ===== 読取行の最小行から最大行へのループにより読取行をカウントアップ =====

for 読取行 in range(読取最小行, 読取最大行 + 1):

txt = Est.range(読取行, 読取列).value

最大文字数 = len(txt)

# ===== 文字列の先頭文字から最終文字へのループにより位置インデックスをカウントアップ =====

for 位置インデックス in range(0, 最大文字数):

行番号 = 最小行 + 位置インデックス

Wst.range(行番号, 列番号).value = txt[位置インデックス]

# ===== 漢字列の最小列から最大列へのループにより漢字列をカウントアップ =====

for 漢字列 in range(漢字最小列, 漢字最大列 + 1):

漢字名 = Est.range(読取行, 漢字列).value

if 漢字名 is not None:

位置インデックス = Est.range(読取行, 読取列).value.find(漢字名)

if 位置インデックス >= 0:

行番号 = 最小行 + 位置インデックス

列英字名 = Wst.range(1, 列番号).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).api.Borders.LineStyle = 1

Wst.range(枠領域).value = ""

ふりがな読取列 = 漢字列 + 最大枠数

ふりがな名 = Est.range(読取行, ふりがな読取列).value

if ふりがな名 is not None:

ふりがな列 = 列番号 + 1

列英字名 = Wst.range(1, ふりがな列).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).value = ふりがな名

Wst.range(枠領域).api.Font.Size = 8

Wst.range(枠領域).api.HorizontalAlignment = -4131

Wst.range(枠領域).api.Orientation = -4166

Wst.range(枠領域).api.ShrinkToFit = True

列番号 = 列番号 + 書込ステップ列


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

Img9_1_35

 『漢字学習帳』シートのB列からT列にかけて、漢字の書きこみ問題が作成されました。



3. 左方向への列のカウントアップ処理

 『漢字学習帳』シートのT列からB列にかけて右から左へ、漢字問題を書きこむPythonプログラムを作成してみましょう。

 予め、レンジ『B1:U13』をクリアしておきましょう。

Img9_1_36

 Pythonプログラム『PXS8022.py』では、『漢字学習帳』シートのB列からT列にかけて

 左から右へ2列ずつカウントアップしながら、漢字問題を作成しました。

 今度は、Pythonプログラム『PXS8022.py』をコピーして、Pythonプログラム『PXS8023.py』とし、

 『漢字学習帳』シートのT列からB列にかけて右から左へ2列ずつカウントアップしながら、

 漢字問題を作成します。

 書込最小列がB列からT列に変わるから、書込最小列『最小列』を『2』列目から『20』列目に変更します。


 オブジェクト生成部・定数部を改修します。

定数『最小列』に『20』列を代入


 【ソースコードパネル】

# PXS8023.py

import xlwings as xw

wb = xw.Book(’ワークブック820.xlsx’)

Est = wb.sheets[’漢字入力帳’]

読取列 = 2

最大枠数 = 4

漢字最小列 = 3

漢字最大列 = 6

読取最小行 = 2

Wst = wb.sheets[’漢字学習帳’]

最小列 = 20

書込ステップ列 = 2

最小行 = 2

 

読取最大行 = Est.range(Est.cells.last_cell.row, 2).end('up').row

列番号 = 最小列

# ===== 読取行の最小行から最大行へのループにより読取行をカウントアップ =====

for 読取行 in range(読取最小行, 読取最大行 + 1):

txt = Est.range(読取行, 読取列).value

最大文字数 = len(txt)

# ===== 文字列の先頭文字から最終文字へのループにより位置インデックスをカウントアップ =====

for 位置インデックス in range(0, 最大文字数):

行番号 = 最小行 + 位置インデックス

Wst.range(行番号, 列番号).value = txt[位置インデックス]

# ===== 漢字列の最小列から最大列へのループにより漢字列をカウントアップ =====

for 漢字列 in range(漢字最小列, 漢字最大列 + 1):

漢字名 = Est.range(読取行, 漢字列).value

if 漢字名 is not None:

位置インデックス = Est.range(読取行, 読取列).value.find(漢字名)

if 位置インデックス >= 0:

行番号 = 最小行 + 位置インデックス

列英字名 = Wst.range(1, 列番号).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).api.Borders.LineStyle = 1

Wst.range(枠領域).value = ""

ふりがな読取列 = 漢字列 + 最大枠数

ふりがな名 = Est.range(読取行, ふりがな読取列).value

if ふりがな名 is not None:

ふりがな列 = 列番号 + 1

列英字名 = Wst.range(1, ふりがな列).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).value = ふりがな名

Wst.range(枠領域).api.Font.Size = 8

Wst.range(枠領域).api.HorizontalAlignment = -4131

Wst.range(枠領域).api.Orientation = -4166

Wst.range(枠領域).api.ShrinkToFit = True

列番号 = 列番号 + 書込ステップ列

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


Img9_1_38

 『漢字学習帳』シートのT列からB列にかけて右から左へ2列ずつ、漢字問題を作成したかったのに、

 『漢字学習帳』シートのT列からAL列にかけて左から右へ2列ずつ、漢字問題が作成されました。

 これは、このPythonプログラムの列番号カウントアップの代入式

 列番号 = 列番号 + 書込ステップ列が、関わっています。


 【『PXS8023.py』_ 最終行】

 

列番号 = 列番号 + 書込ステップ列


 書込ステップ列 = 2と定数宣言しているから、

 列番号カウントアップの代入式列番号 = 列番号 + 書込ステップ列の中の、書込ステップ列の値は2です。

 入力行のループの中で、列番号 = 列番号 + 2ということは、

 入力行が1行ずつ増える毎に、列番号(列番号)が、左から右に2列ずつ増えていくということになります。

 列番号(列番号)が、右から左に2列ずつ減っていくようにするには、どうしたら良いでしょうか。

 列番号 = 列番号 + 2ならば、列番号(列番号)が、左から右に2列ずつ増えていくのだから、

 列番号 = 列番号 – 2ならば、列番号(列番号)が、右から左に2列ずつ減っていくと思います。

 列番号 = 列番号 + 書込ステップ列という代入式で、列番号 = 列番号 – 2を成り立たせるために、

 書込ステップ列 = -2と定数宣言する必要があります。


 オブジェクト生成部・定数部を改修します。

定数『書込ステップ列』に『-2』を代入


 【ソースコードパネル】

# PXS8023.py

import xlwings as xw

wb = xw.Book(’ワークブック820.xlsx’)

Est = wb.sheets[’漢字入力帳’]

読取列 = 2

最大枠数 = 4

漢字最小列 = 3

漢字最大列 = 6

読取最小行 = 2

Wst = wb.sheets[’漢字学習帳’]

最小列 = 20

書込ステップ列 = -2

最小行 = 2

 

読取最大行 = Est.range(Est.cells.last_cell.row, 2).end('up').row

列番号 = 最小列

# ===== 読取行の最小行から最大行へのループにより読取行をカウントアップ =====

for 読取行 in range(読取最小行, 読取最大行 + 1):

txt = Est.range(読取行, 読取列).value

最大文字数 = len(txt)

# ===== 文字列の先頭文字から最終文字へのループにより位置インデックスをカウントアップ =====

for 位置インデックス in range(0, 最大文字数):

行番号 = 最小行 + 位置インデックス

Wst.range(行番号, 列番号).value = txt[位置インデックス]

# ===== 漢字列の最小列から最大列へのループにより漢字列をカウントアップ =====

for 漢字列 in range(漢字最小列, 漢字最大列 + 1):

漢字名 = Est.range(読取行, 漢字列).value

if 漢字名 is not None:

位置インデックス = Est.range(読取行, 読取列).value.find(漢字名)

if 位置インデックス >= 0:

行番号 = 最小行 + 位置インデックス

列英字名 = Wst.range(1, 列番号).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).api.Borders.LineStyle = 1

Wst.range(枠領域).value = ""

ふりがな読取列 = 漢字列 + 最大枠数

ふりがな名 = Est.range(読取行, ふりがな読取列).value

if ふりがな名 is not None:

ふりがな列 = 列番号 + 1

列英字名 = Wst.range(1, ふりがな列).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).value = ふりがな名

Wst.range(枠領域).api.Font.Size = 8

Wst.range(枠領域).api.HorizontalAlignment = -4131

Wst.range(枠領域).api.Orientation = -4166

Wst.range(枠領域).api.ShrinkToFit = True

列番号 = 列番号 + 書込ステップ列

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


Img9_1_41

 『漢字学習帳』シートのT列からB列にかけて右から左へ2列ずつ、漢字問題が作成されました。



4. 先頭行に問題番号を書き込む

Img9_1_42

 次は、『漢字学習帳』シートのT列からB列にかけて右から左へ2列ずつカウントアップしながら、

 『漢字入力帳』シートのA列に記述されている問題番号を、先頭行に書きこみます。

 今度は、Pythonプログラム『PXS8023.py』をコピーして、Pythonプログラム『PXS8024.py』とし、

 『漢字学習帳』シートのT列からB列にかけて右から左へ2列ずつカウントアップしながら、

 漢字問題を作成すると同時に、先頭行に問題番号を読み書きするプログラムコードを追加します。

xlwingsをxwとしてインポート

Excelファイル『ワークブック820.xlsx』をメモリ上に読みこみWorkbookオブジェクト『wb』を生成

『wb』のExcelシート『漢字入力帳』を読みこみsheetオブジェクト『Est』を生成

定数『読取問題番号列』にA列つまり『1』列を代入

定数『読取列』にB列つまり『2』列を代入

定数『最大枠数』に『4』を代入

定数『漢字最小列』にC列つまり『3』列を代入

定数『漢字最大列』にF列つまり『6』列を代入

定数『読取最小行』に『2』を代入

Excelシート『漢字学習帳』を読みこみsheetオブジェクト『Wst』を生成

定数『最小列』にL列つまり『12』列を代入

定数『書込ステップ列』に『2』を代入

定数『書込問題番号行』に『1』行目を代入

定数『最小行』に『2』行目を代入

 

EstのB列つまり『2』列の最大行を取得し、変数『読取最大行』に格納

変数『列番号』に定数『最小列』の値を代入

変数『読取行』を『読取最小行』から『読取最大行』+1までカウントアップしながら以下の処理を繰り返す

変数『問題番号』にEst のセル(『読取行』,『読取問題番号列』)の値を代入

Wst の『列番号』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

Wst の枠領域のセルの値に『問題番号』を代入

Wst の枠領域のセルのフォントサイズを10に設定

変数『txt』にEstのセル(『行番号』,『読取列』)の値を代入

変数『txt』から文字数を取得し、変数『最大文字数』に格納

変数『位置インデックス』を 0 から『最大文字数』までカウントアップしながら以下の処理を繰り返す

変数『行番号』に『最小行』+『位置インデックス』を代入

Wstのセル(『行番号』,『列番号』)の値に変数『txt』から取得した『位置インデックス』の文字を代入

 

変数『漢字列』を『漢字最小列』から『漢字最大列』+1までカウントアップしながら以下の処理を繰り返す

変数『漢字名』にEstのセル(『読取行』,『漢字列』)の値を代入

変数『漢字名』が空白でないとき

Estのセル(『読取行』,『読取列』)の値から『漢字名』の位置を調べて変数『位置インデックス』に格納

変数『位置インデックス』が0以上のとき

変数『行番号』に『最小行』+『位置インデックス』を代入

Wstの『列番号』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

Wstの枠領域のセルの周りを実線で囲う

Wstの枠領域を空白にする

変数『ふりがな読取列』に『漢字列』+『最大枠数』を代入

変数『ふりがな名』にEstのセル(『読取行』,『ふりがな読取列』)の値を代入

変数『ふりがな名』が空白でないとき

変数『ふりがな列』に『列番号』+ 1 を代入

Wstの『ふりがな列』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

Wstの枠領域のセルの値にふりがな名を代入

Wstの枠領域のセルのフォントサイズを8に設定

Wstの枠領域のセルの横方向の配置を左詰めに設定

Wstの枠領域のセルの文字の配置を縦方向に設定

Wstの枠領域のセルの文字を縮小して全体を表示に設定

変数『列番号』に『列番号』+『書込ステップ列』を代入


 Pythonプログラム『PXS8023.py』をコピーして、Pythonプログラム『PXS8024.py』をつくります。


 オブジェクト生成部・定数部を改修します。

定数『読取問題番号列』にA列つまり『1』列を代入

定数『書込問題番号行』に『1』行目を代入

読取問題番号列 = 1

書込問題番号行 = 1


 処理部を改修します。

『漢字入力帳』シートの最小行:『読取最小行』(2行目)から最大行:『読取最大行』+1(11行目)

にかけて、各行の漢字問題作成処理をループ処理で実行しますが、

この漢字問題作成処理の最初に、先頭行に問題番号を読み書きし、

問題番号のフォントサイズを10にするプログラムコードを追加します。

for 読取行 in range(読取最小行, 読取最大行 + 1):

問題番号 = Est.range(読取行, 読取問題番号列).value

列英字名 = Wst.range(1, 列番号).get_address(False, False).replace("1", "")

枠領域 = 列英字名 + str(書込問題番号行)

Wst.range(枠領域).value = 問題番号

Wst.range(枠領域).api.Font.Size = 10


 ・・・・・・・・・・・・・・・・・・・・・・


 とします。


 【ソースコードパネル】

# PXS8024.py

import xlwings as xw

wb = xw.Book(’ワークブック820.xlsx’)

Est = wb.sheets[’漢字入力帳’]

読取問題番号列 = 1

読取列 = 2

最大枠数 = 4

漢字最小列 = 3

漢字最大列 = 6

読取最小行 = 2

Wst = wb.sheets[’漢字学習帳’]

最小列 = 20

書込ステップ列 = -2

書込問題番号行 = 1

最小行 = 2

 

読取最大行 = Est.range(Est.cells.last_cell.row, 2).end('up').row

列番号 = 最小列

# ===== 読取行の最小行から最大行へのループにより読取行をカウントアップ =====

for 読取行 in range(読取最小行, 読取最大行 + 1):

問題番号 = Est.range(読取行, 読取問題番号列).value

列英字名 = Wst.range(1, 列番号).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(書込問題番号行)

Wst.range(枠領域).value = 問題番号

Wst.range(枠領域).api.Font.Size = 10

 

txt = Est.range(読取行, 読取列).value

最大文字数 = len(txt)

# ===== 文字列の先頭文字から最終文字へのループにより位置インデックスをカウントアップ =====

for 位置インデックス in range(0, 最大文字数):

行番号 = 最小行 + 位置インデックス

Wst.range(行番号, 列番号).value = txt[位置インデックス]

# ===== 漢字列の最小列から最大列へのループにより漢字列をカウントアップ =====

for 漢字列 in range(漢字最小列, 漢字最大列 + 1):

漢字名 = Est.range(読取行, 漢字列).value

if 漢字名 is not None:

位置インデックス = Est.range(読取行, 読取列).value.find(漢字名)

if 位置インデックス >= 0:

行番号 = 最小行 + 位置インデックス

列英字名 = Wst.range(1, ふりがな列).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).api.Borders.LineStyle = 1

Wst.range(枠領域).value = ""

ふりがな読取列 = 漢字列 + 最大枠数

ふりがな名 = Est.range(読取行, ふりがな読取列).value

if ふりがな名 is not None:

ふりがな列 = 列番号 + 1

列英字名 = Wst.range(1, ふりがな列).get_address \

(False, False).replace("1", "")

枠領域 = 列英字名 + str(行番号)

Wst.range(枠領域).value = ふりがな名

Wst.range(枠領域).api.Font.Size = 8

Wst.range(枠領域).api.HorizontalAlignment = -4131

Wst.range(枠領域).api.Orientation = -4166

Wst.range(枠領域).api.ShrinkToFit = True

列番号 = 列番号 + 書込ステップ列

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


Img9_1_45

 『漢字学習帳』シートのT列からB列にかけて、先頭行に問題番号が書きこまれました。