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

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

3 逆Z式並びで更新

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

5 複数シートを連続更新

6 関数の定義と呼び出し

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

8 定数で指定したブックを更新

複数シートを連続更新

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


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

 または、『漢字学習帳B』シートへデータを書きこんでみました。

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

 及び、『漢字解答集』シートへ連続してデータを書きこんでみます。

 『漢字問題集』シートは出題漢字を空欄にして、

 『漢字解答集』シートは出題漢字を消さずにそのまま残します。

 そこで、その準備として、Excelブック内に、『漢字入力帳』シートと

 『漢字問題集』・『漢字解答集』シートを作成しておきます。

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

 前回使用した『ワークブック841.xlsx』をコピーして『ワークブック842.xlsx』を作成します。


『ワークブック842.xlsx』
『漢字入力帳』シート
Img9_3_41
『漢字問題集』シート
Img9_3_42
『漢字解答集』シート
Img9_3_43

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

 一つ目に『漢字問題集』シート、二つ目に『漢字解答集』シートを作成してみます。

 Pythonプログラム『PXS8040.py』をコピーして、Pythonプログラム『PXS8050.py』に名前を変えます。


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

 

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

 

定数『WSheetMD』に『漢字問題集』を代入

定数『WSheetKT』に『漢字解答集』を代入

 

 

 

 

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

 

WSheetMD = '漢字問題集'

WSheetKT = '漢字解答集'

 

 

 


 処理部を改修します。

一つ目に、『漢字問題集』を作成します。

 書込ワークシート『WSheet』に定数『WSheetMD』つまり『漢字問題集』を格納します。

 WSheet = Est.range(読取行, 書込ワークシート列).value を

 WSheet = WSheetMD に変更します。

 『wb』のExcelシート『WSheet』を読みこみsheetオブジェクト『Wst』を生成します。

 Wst = wb.sheets[WSheet]

 出題漢字の空白化の箇所をしっかりと残しておきます。

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


二つ目に、一つ目の『漢字問題集』の作成をコピーし、『漢字解答集』を作成するように書き換えます。

 書込ワークシート『WSheet』に定数『WSheetKT』つまり『漢字解答集』を格納します。

 WSheet = Est.range(読取行, 書込ワークシート列).value を

 WSheet = WSheetKT に変更します。

 『wb』のExcelシート『WSheet』を読みこみsheetオブジェクト『Wst』を生成します。

 Wst = wb.sheets[WSheet]

 出題漢字の空白化の箇所をコメントアウトします。

 # Wst.Range(枠領域).value = ""


  コメントアウトとは、特定の箇所をコメント化してコードを無効にすることです。

  Pythonでは、『#』をコードの先頭につけることで、そのコードをコメントにすることができます。

  コメントアウトは、一時的に除外するが、後で復活させるかもしれない内容を消さずに

  そのまま残しておきたいときに便利な技術です。


 【ソースコードパネル】

# PXS8050.py

import xlwings as xw

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

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

WSheetMD = '漢字問題集'

WSheetKT = '漢字解答集'

読取問題番号列 = 1

読取列 = 2

最大枠数 = 4

漢字最小列 = 3

漢字最大列 = 6

# 書込ワークシート列 = 11

読取最小行 = 2

最大列 = 10

書込列数 = 5

書込ステップ列 = -2

書込問題番号最小行 = 1

書込ステップ行 = 15

 

WSheet = WSheetMD

Wst = wb.sheets[WSheet]

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

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

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

# WSheet = Est.range(読取行, 書込ワークシート列).value

# Wst = wb.sheets[WSheet]

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

書込問題番号行 = int((問題番号 - 1) / 書込列数) * 書込ステップ行 \

+ 書込問題番号最小行

最小行 = 書込問題番号行 + 1

列番号 = 最大列 + ((問題番号 - 1) % 書込列数) * 書込ステップ列

列英字名 = 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

 

WSheet = WSheetKT

Wst = wb.sheets[WSheet]

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

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

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

# WSheet = Est.range(読取行, 書込ワークシート列).value

# Wst = wb.sheets[WSheet]

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

書込問題番号行 = int((問題番号 - 1) / 書込列数) * 書込ステップ行 \

+ 書込問題番号最小行

最小行 = 書込問題番号行 + 1

列番号 = 最大列 + ((問題番号 - 1) % 書込列数) * 書込ステップ列

列英字名 = 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プログラムを実行してみます。

『ワークブック842.xlsx』
     _ 『漢字問題集』シート
Img9_3_61
『ワークブック842.xlsx』
     _ 『漢字解答集』シート
Img9_3_62

 『漢字入力帳』シートに用意した10問の漢字文字列が、

 出題漢字を空欄にした『漢字問題集』シートと、

 出題漢字をそのまま残した『漢字解答集』シートへ、

 書きこまれました。