工場の事務所で、経理担当の方から「請求書の突合作業がしんどい」と相談される現場は多いと思います。
夜勤工場員8年目の筆者は、5年目の終わりに同じ工場の経理担当から「月の請求書突合に4時間半かかっている」という話を聞いて、Pythonのスクリプトで35分に短縮する手伝いをしたことがあります。
そのときの実装と、6年目以降に同じ依頼を別の事業所から受けたときに気づいたことを、現場の感覚から残しておきます。
同じ工場で経理事務の手作業に時間を取られている方の参考になれば、と思って書いています。
8年目で気づいたこと:現場のExcel地獄は「VBAの拡張」ではなく「Pythonへの移行」のほうが現実的
5年目までは、現場の業務効率化といえば「Excelマクロ(VBA)」だと思っていました。
8年目の今、工場の事務処理の自動化はVBAの拡張よりPythonへの移行のほうが結果的に早く回せると気づいています。
VBAは1台のPCのExcelに紐付くので、担当者が変わるとメンテができなくなる事故が起きやすいです。
4年目の頃に、前任者が組んだVBAマクロが急に動かなくなって、結局1日かけて書き直した経験があります。
Pythonは外部スクリプトとしてフォルダに置けるので、引き継ぎ用のREADMEを1枚添えるだけで他の人でも触れます。pandasやopenpyxlのライブラリは検索すれば例が出てくるので、現場の人でも調べながら直せる範囲です。
Claude Codeのような対話型のコーディング支援も併用できると、修正の心理的ハードルが下がります。8年目の感覚では、現場の事務作業の自動化はPython移行のほうが2025年以降は妥当な選択だと思います。
①Before:請求書突合作業に月4時間半かかっていた話
5年目の終わりに、同じ工場の経理担当の方から相談を受けたときの作業フローです。
毎月15〜25日に、取引先30社から請求書がメール添付(Excel/PDF混在)で届きます。経理担当の方は、社内の発注台帳Excelと突合して、金額・品目・数量の不一致がないか目視で確認していました。
- 取引先30社 × 1社あたり平均5明細 = 約150明細を毎月突合
- 1社の請求書を開く → 社内発注台帳の該当行を探す → 金額/品目/数量を目視照合
- 不一致があれば付箋にメモ → 上司に報告 → 取引先に問い合わせメール
- 所要時間:月4時間30分(実測)
- 見落としによるミス:月1〜2件(金額数千円〜数十万円規模)
4時間30分の中身は、純粋な突合作業(約3時間)と、不一致チェック後の問い合わせメール作成(約1時間半)でした。
時給換算で月¥13,500〜¥18,000相当の人件費が、毎月この作業に消えていた計算になります。
経理担当の方は「目視突合は神経を使うので、月末は他の作業が手につかない」とも話していました。集中力の消耗まで含めると、実際の影響はもっと大きかったと思います。
②After:Pythonの突合スクリプトで30秒に圧縮した実装の中身
5年目の終わりの2週間で、Pythonの突合スクリプトを書いて経理担当の方に渡しました。
使ったライブラリは、pandasとopenpyxlの2本だけです。両方とも商用利用可能のオープンソースで、ライセンス費用はかかりません。
スクリプトの動作は、次のとおりです。
- 取引先30社の請求書Excelを1フォルダに放り込む
- 社内発注台帳のExcelを別の場所に置く
- コマンドラインで
python match_invoices.pyを実行 - 30秒以内に「不一致行のみハイライトしたレポートExcel」が出力される
経理担当の方の作業は、出力されたレポートを開いて、ハイライトされた行(数件)だけを目視確認する形に変わりました。
不一致が4件しかなかった月は、確認+問い合わせメール作成で35分で終わるようになりました。
4時間30分が35分に減ったので、削減率は87%でした。
③突合スクリプトで効いた3つの工夫
シンプルなpandasの結合だけだと、現場のExcelには対応しきれません。実際に効いた工夫を3つ残しておきます。
工夫1:表記揺れの正規化(半角全角・空白・記号)
取引先30社のうち、5社の請求書は「品目名の表記が社内台帳と微妙に違う」という問題がありました。
- 社内台帳:「M6ステンレスボルト」
- 取引先A:「M6ステンレスボルト」(M が全角)
- 取引先B:「M6 ステンレス ボルト」(空白挿入)
これを単純に文字列比較すると、全部「不一致」と判定されて毎月100件以上のノイズが出ます。
Pythonのunicodedata.normalize("NFKC", s)で全角を半角に統一して、re.sub(r"\s+", "", s)で空白を全部除去してから比較するようにしました。これで表記揺れによる誤判定がゼロになりました。
工夫2:OUTER JOINで「片方にだけ存在する行」も拾う
普通の結合(INNER JOIN)だと、片方にしかない行は検出から漏れます。
請求書突合で本当に怖いのは、「発注台帳にあるのに請求書に載っていない」「発注台帳にないのに請求書に載っている」の2パターンです。前者は請求漏れ、後者は二重請求や発注外請求の疑いがあります。
pandasのmerge(how="outer", indicator=True)で OUTER JOIN にして、_merge列で「片方だけ」の行を抽出する形にしました。これで請求漏れ・発注外請求の検知が初めて自動化できました。
工夫3:openpyxlで不一致セルを赤背景でハイライト
突合結果を全件並べたExcelを渡すと、経理担当の方が結局目視で見直す手間が発生します。
openpyxlで不一致行のセルだけを赤背景にして、判定区分を「金額不一致/数量不一致/請求漏れ/発注外請求/品目名表記揺れ」の5種類に分けて出力する形にしました。
これで経理担当の方は、レポートを開いた瞬間に「赤い行を上から順に確認するだけ」で済むようになりました。
④失敗したこと2つ:PDF混在と取引先別の様式違い
2週間でスクリプトを書き上げた後、運用に乗せる過程で失敗したことが2つあります。
失敗1:PDF添付の請求書を最初から無視していた
1か月目の運用で、取引先30社のうち4社がPDF添付で請求書を送ってくることに気づきました。
最初のスクリプトはExcelファイル前提だったので、4社分の請求書は経理担当の方が手動でExcelに転記する作業が残っていました。
結局、PDFは pdfplumber ライブラリでテキスト抽出してExcel化する小さなスクリプトを追加で組みました。OCR精度が完璧ではないので、PDFのうち1割程度は手動補正が必要ですが、それでも全件手動転記よりは大幅に楽になりました。
失敗談ベースで言うと、現場の事務作業を自動化するときは「ファイル形式の例外」を最初にヒアリングしておく必要がある、というのが教訓でした。
失敗2:取引先ごとのExcel様式違いを甘く見ていた
取引先30社のExcelは「請求明細」「請求行No」「品目コード」のような共通の列名を使っているはず、と最初は想定していました。
実際には、列の順番・列名の表記・ヘッダー行の位置が取引先ごとに微妙に違っていました。
- 「品目コード」の列が、A列のところもB列のところもあった
- 「数量」を「個数」と書く取引先があった
- ヘッダー行が3行目から始まる取引先と、7行目から始まる取引先があった
これは、取引先コードごとに「列マッピング辞書」を持たせる形で対応しました。スクリプトの中に {"V001": {"qty_col": "数量", "header_row": 3}, ...} のような辞書を置いて、取引先ごとの読み方を切り替える形です。
30社分のマッピングを最初に作り込むのに半日かかりましたが、1度作れば翌月以降は触らずに済むので、結果的に投資対効果は十分でした。
⑤工場員8年目が考えるこの自動化の副業価値
5年目の終わりにこのスクリプトを組んだとき、経理担当の方の業務が月4時間半→35分に減ったので、時給¥3,000換算で月¥12,000相当の業務削減効果が出ました。
同じ規模の中小企業(従業員50〜100人・取引先20〜50社)であれば、ほぼ同じ実装パターンで対応できます。
6年目以降に、別の工場の知人から似た相談を受けて、同じスクリプトをカスタマイズして渡したことが2回ありました。1回あたり3〜5日の作業で、知人からは「お礼」として10〜20万円を受け取りました。
副業として本格的に展開するなら、想定単価は次のとおりです。
- 突合スクリプト単発納品(既存Excel構成のまま):30万〜80万円・所要30〜50時間
- 月次レポート自動化+月額保守:初期20〜50万円+月3〜8万円
- 会計ソフトAPI連携+通知Bot付き:初期80〜150万円+月8〜15万円
工場員の本業がある状態で副業として回すなら、単発納品の30万円コースが現実的です。土日2週間×3社=月90万円の追加収入になる計算ですが、本業との両立を考えると月1社・30万円ペースが体力的に無理がない範囲だと思います。
実体験で検証した感覚では、現場のExcel地獄は「中小企業の経理担当が個人で抱えている問題」なので、リード獲得の難易度より納品後のサポート工数の見積もりのほうが事故ポイントです。月額保守を月3〜5時間で頭打ちにする契約条項を最初に決めておかないと、無限サポート地獄に入ります。
⑥この自動化を試したい工場員向けの最小構成3点
同じ自動化を自分の現場で試したい工場員の方向けに、最小構成を3点だけ残しておきます。
1.Pythonの環境構築(30分)
Windowsの工場PCでも、Python公式インストーラ(python.org)でセットアップ可能です。管理者権限が必要な工場のPCの場合は、情報システム部に申請してから入れるのが安全です。
必要なライブラリは pandas openpyxl pdfplumber の3本だけです。pip install 1コマンドで終わります。
2.ダミーデータで動作確認(1日)
いきなり本番の請求書で試すと事故るので、ダミーの発注台帳と請求書3〜5本で動作確認するのが現実的です。
筆者は経理担当の方の協力で、1か月分の過去データを匿名化したコピーを使って、突合結果が手作業と一致するか1週間検証してから本番投入しました。
3.運用ルールを文書化(半日)
スクリプトを動かす担当者・出力レポートの確認手順・不一致発生時のエスカレーション先の3点だけ、A4 1枚に書いて経理担当の方と上司に渡しました。
担当者が変わったときに引き継げる状態にしておくのが、現場で運用を続ける最低条件です。8年目で気づいたこととしては、自動化の継続率はスクリプトの完成度よりも引き継ぎ書類の有無で決まると思います。
まとめ:現場のExcel地獄は2週間あれば片付く
工場員8年目の体感では、現場の経理事務のExcel突合作業は、Pythonの基本ライブラリ2〜3本で2週間あれば片付く範囲です。
5年目の終わりに4時間30分→35分(87%短縮)の実績を出してから、6年目以降に2回同じパターンの相談を受けました。中小規模の工場や事業所であれば、ほぼ同じ実装で再現できる内容です。
同じ現場で「経理担当が月末に消耗している」状況を見ている工場員の方は、Pythonの突合スクリプトを試してみる価値はあると思います。失敗談ベースで言うと、表記揺れの正規化とOUTER JOINと不一致ハイライトの3点を押さえれば、最低限の品質は出せます。
副業として展開する場合は、納品後のサポート工数を契約で頭打ちにする条項を必ず決めてから受けるのが、現場の感覚では安全な範囲だと思います。
※本記事は工場員8年目の筆者が、現場の経理担当者の協力のもとで実施した業務効率化の記録です。データはすべて匿名化して掲載しています。Pythonスクリプトの導入は社内の情報システム部の許可と、経理担当者・上司との合意のもとで進めてください。導入後の不一致見逃し等の責任は、最終的には運用担当者にあります。実装の判断は自己責任でお願いします。


コメント