Pythonで名簿・家計シートをExcelごと自動整理する方法

python
自動化・詳細手順

Pythonで名簿・家計シートをExcelごと自動整理する方法

並べ替え・複数シート集計・書式設定までまとめて解説します

プログラミング未経験OK 所要時間の目安:30分程度

この記事は、「Pythonでできる日常の自動化6選」で紹介した③Excelで名簿・家計シートを自動整理の詳しい作り方をまとめた記事です。

町内会やPTAの名簿の並べ替え、複数月に分かれた家計シートの集計を、毎回Excelで手作業していませんか?Pythonのopenpyxlというライブラリを使えば、Excelファイルを直接開いて、並べ替え・集計・書式設定までまとめて自動化できます。ネット接続やアカウント登録は不要です。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

用意するもの

  • Python本体
  • コードを書くためのエディタ(VS Codeなど)
  • openpyxl(Excelファイルを直接操作するライブラリ)
INFO

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でおなじみのセル番地をそのままコードで指定できます。

MEMO

この記事のコードを試すときは、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という新しいファイルが作成されます。元のファイルは上書きされないので、安心して試すことができます。

POINT

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でセルの塗りつぶし色を指定できます。

MEMO

start_colorend_colorにはカラーコード(6桁の英数字)を指定します。Excelの「塗りつぶしの色」ダイアログでも同じカラーコードを確認できます。

うまくいかないときのトラブルシューティング

「No such file or directory」というエラーが出ます
指定したExcelファイルが、コードを実行しているフォルダの中に見つからないことが原因です。ファイルをコードと同じフォルダに置くか、load_workbookのファイル名部分を正しいパスに書き換えてください。
数式が入ったセルの値を読み込むとNoneになります
数式そのものではなく、計算結果の値を読み込みたい場合は、load_workbook("ファイル名", data_only=True)のようにdata_only=Trueを指定してください。ただしこれは、一度Excel側でファイルを開いて保存したことがある場合にのみ、計算済みの値が取得できます。
列の見出しが日本語でも大丈夫ですか?
問題ありません。openpyxlはセルの値をそのまま文字列として扱うので、日本語の見出しや項目名でも通常どおり読み書きできます。

まとめ

openpyxlを使って、Excelの名簿を並べ替え、複数シートの家計データを集計し、合計行を目立たせる書式設定まで自動化する方法を紹介しました。同じ形式のファイルであれば、コードを1回作っておくだけで、毎回同じ手順を繰り返す必要がなくなります。

他の自動化アイデアも見てみる

家計簿の自動集計やファイル整理など、Pythonでできる生活の自動化アイデアを6つ紹介しています。

6テーマ一覧を見る

コメント

タイトルとURLをコピーしました