【他のレンジ/シート/ブックを更新する】
1 あるレンジから別レンジを更新
2 あるシートから別シートを更新
3 逆Z式並びで更新
4 セルで指定したシートを更新
5 複数シートを連続更新
6 関数の定義と呼び出し
7 Pythonの汎用型プログラム構成
あるシートから別シートを更新
今回は、Python-xlwingsによって、あるシートからデータを読みとり別シートへデータを書きこんでみます。
1. あるシートから別シートを更新
Python-xlwingsで、シート内で、あるセルから別のセルに値を代入するときは、次のような構文になります。
シート内で、あるセルから別のセルに値を代入するときは、ワークシート名が無くても、コンピューターは
どこから、どこに代入するかを判断できます。
だけど、あるシートから別のシートに値を代入するときは、ワークシート名が無ければ、コンピューターは
どのワークシートのセルから、どのワークシートのセルに代入するかを判断できなくなります。
そのため、Python-xlwingsで、あるシートのセルから、別シートのセルに値を代入するときは、
それぞれのワークシート名を指定します。
次のような構文になります。
2. 別シートに漢字学習帳を作成
前回は、同一シート内で、『漢字入力帳』レンジからデータを読みとり、
『漢字学習帳』レンジへデータを書きこみました。
今回は、『漢字入力帳』シートからデータを読みとり、
『漢字学習帳』シートへデータを書きこんでみます。
そこで、その準備として、Excelマクロ有効ブック内に、
『漢字入力帳』シートと『漢字学習帳』シートを作成しておきます。
先ずは、Pythonプログラムファイルを保存しているフォルダ内に、
前回使用したExcelブック『ワークブック810.xlsx』をコピーして
『ワークブック820.xlsx』を作成します。
次に、『ワークブック820.xlsx』の『ワークシート1』のシート名を『漢字入力帳』に変更します。
そして、シート『漢字入力帳』をコピーして、新シートを作成します。
それから、コピーして作成された『漢字入力帳 (2)』のシート名を『漢字学習帳』に変更します。
最後に、シート『漢字学習帳』のレンジ『A1:J11』をクリアします。
これで、『漢字入力帳』シートからデータを読みとり、『漢字学習帳』シートへデータを書きこむ
準備ができました。それでは、『漢字入力帳』シートからデータを読みとり、『漢字学習帳』シートへ
データを書きこむPythonプログラムを作成しましょう。『漢字入力帳』シートを選択します。
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のレンジへデータを書きこみます。
そのため、変更箇所は、次のようになります。
【ソースコードパネル】
# 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プログラムを実行してみます。
『漢字学習帳』シートのL列からAD列にかけて、漢字の書きこみ問題が作成されました。
次は、『漢字学習帳』シートのB列からT列にかけて、漢字の書きこみ問題を作成してみましょう。
『漢字学習帳』シートのB列からK列を削除します。
レンジ『B2:U13』をクリアします。
先ほどは、『漢字学習帳』シートの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プログラムを実行してみます。
『漢字学習帳』シートのB列からT列にかけて、漢字の書きこみ問題が作成されました。
3. 左方向への列のカウントアップ処理
『漢字学習帳』シートのT列からB列にかけて右から左へ、漢字問題を書きこむPythonプログラムを作成してみましょう。
予め、レンジ『B1:U13』をクリアしておきましょう。
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プログラムを実行してみます。
『漢字学習帳』シートの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プログラムを実行してみます。
『漢字学習帳』シートのT列からB列にかけて右から左へ2列ずつ、漢字問題が作成されました。
4. 先頭行に問題番号を書き込む
次は、『漢字学習帳』シートの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プログラムを実行してみます。
『漢字学習帳』シートのT列からB列にかけて、先頭行に問題番号が書きこまれました。