Pythonで名簿・家計シートをExcelごと自動整理する方法
並べ替え・複数シート集計・書式設定までまとめて解説します
この記事は、「Pythonでできる日常の自動化6選」で紹介した③Excelで名簿・家計シートを自動整理の詳しい作り方をまとめた記事です。
町内会やPTAの名簿の並べ替え、複数月に分かれた家計シートの集計を、毎回Excelで手作業していませんか?Pythonのopenpyxlというライブラリを使えば、Excelファイルを直接開いて、並べ替え・集計・書式設定までまとめて自動化できます。ネット接続やアカウント登録は不要です。
- 1
- 2
- 3
- 4
- 5
用意するもの
- Python本体
- コードを書くためのエディタ(VS Codeなど)
- openpyxl(Excelファイルを直接操作するライブラリ)
Pythonのインストール、コードを書くためのエディタ(VS Code)の準備、コードの書き方・実行方法がまだの方は、先に「Pythonを始める前に:インストールとエディタの準備」を済ませてから、この続きに進んでください。
ターミナルで以下のコマンドを実行し、openpyxlをインストールします。
pip install openpyxl
openpyxlの基本を知る
openpyxlでは、Excelファイル全体を「ワークブック」、その中の各タブを「シート」、マス目1つ1つを「セル」として扱います。まずは既存のExcelファイルを読み込んで、中身を確認してみましょう。
import openpyxl
wb = openpyxl.load_workbook("meibo.xlsx")
print(wb.sheetnames) # シート名の一覧
ws = wb["名簿"] # シート名を指定して取得
print(ws["A1"].value) # A1セルの値
print(ws.max_row, ws.max_column) # データが入っている行数・列数
実行すると、シート名の一覧や、指定したセルの値が表示されます。ws["A1"]のように、Excelでおなじみのセル番地をそのままコードで指定できます。
この記事のコードを試すときは、meibo.xlsxの部分を実際に操作したいExcelファイルの名前に書き換えてください。コードと同じフォルダにファイルを置いておくとスムーズです。
名簿を五十音順に自動で並べ替える
A列に名前、B列にフリガナ、C列に住所、D列に電話番号が入った名簿(1行目は見出し)を例に、フリガナを基準に五十音順で並べ替えてみます。
import openpyxl
wb = openpyxl.load_workbook("meibo.xlsx")
ws = wb["名簿"]
# 見出し行(1行目)を除いた全データを読み込む
rows = list(ws.iter_rows(min_row=2, values_only=True))
# フリガナ(2列目、インデックスは1)を基準に並べ替える
rows_sorted = sorted(rows, key=lambda row: row[1])
# 並べ替えた結果を、元のセルに書き戻す
for i, row in enumerate(rows_sorted, start=2):
for j, value in enumerate(row, start=1):
ws.cell(row=i, column=j, value=value)
wb.save("meibo_sorted.xlsx")
print("並べ替えが完了しました")
実行すると、フリガナの五十音順に並べ替えられたmeibo_sorted.xlsxという新しいファイルが作成されます。元のファイルは上書きされないので、安心して試すことができます。
key=lambda row: row[1]のrow[1]をrow[0]に変えれば名前順、row[2]に変えれば住所順というように、並べ替えの基準を自由に変更できます。
複数シートの家計データを1つに自動集計する
「2026-06」「2026-07」「2026-08」のように月ごとにシートが分かれた家計簿ファイル(各シートはA列がカテゴリ、B列が金額、1行目は見出し)を例に、全シートを横断してカテゴリ別に合計してみます。
import openpyxl
wb = openpyxl.load_workbook("kakeibo.xlsx")
total_by_category = {}
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for category, amount in ws.iter_rows(min_row=2, values_only=True):
total_by_category[category] = total_by_category.get(category, 0) + amount
# 集計結果を書き込む新しいシートを作る
summary_ws = wb.create_sheet("集計")
summary_ws.append(["カテゴリ", "合計金額"])
for category, total in total_by_category.items():
summary_ws.append([category, total])
wb.save("kakeibo_summary.xlsx")
print("集計が完了しました")
実行すると、すべての月のシートを横断してカテゴリ別に合計され、「集計」という新しいシートにまとめて書き込まれます。total_by_category.get(category, 0)は、まだ登場していないカテゴリの合計を0として扱うための書き方です。
合計行を目立たせる(書式設定の自動化)
最後に、集計結果の一番下に総合計の行を追加し、太字・色付けで目立たせてみましょう。
from openpyxl.styles import Font, PatternFill
grand_total = sum(total_by_category.values())
summary_ws.append(["合計", grand_total])
last_row = summary_ws.max_row
for cell in summary_ws[last_row]:
cell.font = Font(bold=True)
cell.fill = PatternFill(start_color="FFF2CC", end_color="FFF2CC", fill_type="solid")
wb.save("kakeibo_summary.xlsx")
print("書式設定が完了しました")
このコードを、先ほどの集計コードのwb.save("kakeibo_summary.xlsx")より前に追加すると、合計行が黄色く塗りつぶされ、太字で表示されるようになります。Fontで文字の見た目、PatternFillでセルの塗りつぶし色を指定できます。
start_color・end_colorにはカラーコード(6桁の英数字)を指定します。Excelの「塗りつぶしの色」ダイアログでも同じカラーコードを確認できます。
うまくいかないときのトラブルシューティング
load_workbookのファイル名部分を正しいパスに書き換えてください。Noneになります▼load_workbook("ファイル名", data_only=True)のようにdata_only=Trueを指定してください。ただしこれは、一度Excel側でファイルを開いて保存したことがある場合にのみ、計算済みの値が取得できます。まとめ
openpyxlを使って、Excelの名簿を並べ替え、複数シートの家計データを集計し、合計行を目立たせる書式設定まで自動化する方法を紹介しました。同じ形式のファイルであれば、コードを1回作っておくだけで、毎回同じ手順を繰り返す必要がなくなります。


コメント