はじめに
大学で経理業務に携わる中で、毎月必ず発生する「振替伝票の作成」という作業がありました。
過去の伝票データを参照して、決まったルールで振替伝票を作成する。単純作業だけど、件数が多いと地味に時間がかかる。しかもミスが許されない。
「これ、自動化できるよね?」
そう思い立って作ったのが、今回紹介する 振替伝票自動生成システム です。
解決したかった課題
Before: 手作業での振替伝票作成
- 過去伝票データ(Excel)から対象の伝票を探す
- 振替先の予算コード・財源コードを確認
- GLOVIAのインポート形式に合わせて手入力
- 借方・貸方のペアを確認
問題点:
- 1件あたり3〜5分かかる
- 月に数十件あると半日仕事
- 予算コードの入力ミスが怖い
After: 自動生成システム
- 振替対象の伝票番号リストをアップロード
- 振替先の科目・予算コードを選択
- ボタンを押す
- 完成!
効果:
- 数十件でも数分で完了
- マスタ連携でミス防止
- Excelでそのままダウンロード
技術スタック
| 技術 | 選定理由 | |-----|---------| | Python | データ処理の定番。pandasが強い | | Streamlit | 最速でWebアプリ化。デプロイも簡単 | | pandas | Excelとの相性が最高 | | openpyxl | Excel書き込み用 |
なぜStreamlit?
「社内ツールなのでWeb公開しない」という前提で、ローカルで動くデスクトップアプリっぽいものが欲しかった。
Streamlitなら:
- Pythonだけで完結
- インストール不要(ブラウザで動く)
- UIコンポーネントが豊富
- デプロイしなくても使える
アプリの構成
振替伝票自動生成/
├── app.py # メインアプリ
├── lib/
│ ├── data_loader.py # データ読み込み
│ ├── voucher_processor.py # 伝票処理ロジック
│ ├── excel_writer.py # Excel出力
│ ├── data_validator.py # バリデーション
│ └── data_manager_ui.py # データ管理UI
├── data/ # マスタデータ
└── output/ # 出力先
主要機能
1. 振替伝票生成
過去伝票データとマスタを突合し、借方・貸方のペアを自動生成。
# 借方(振替先)
row['財源コード'] = target_zaigen
row['予算コード'] = target_yosan
row['K'] = 0 # 借方フラグ
# 貸方(元伝票から引き継ぎ)
row['K'] = 1 # 貸方フラグ
2. 2段階の予算コード選択
予算コードが1000件以上あるので、まず科目で絞り込んでから選択できるようにした。
① 科目を選択:K110000 - 科研費
② 予算コードを選択:K110001 - ○○教授(基盤C)
3. データ管理機能
マスタデータを安全に更新できるUI。Excelを直接編集させるとデータ構造が壊れるリスクがあるため。
- 閲覧:検索・フィルタリング・CSVエクスポート
- 編集:セル単位の編集、行の削除
- 追加:フォームからの新規追加
- 検証:バリデーションエラーの一覧表示
Claude Codeでの開発
今回の開発は Claude Code をフル活用しました。
開発の流れ
-
要件を伝える
「過去伝票データから振替伝票を自動生成したい。借方は指定した予算、貸方は元伝票のまま。」
-
基本実装
- データ構造を説明してコード生成
- Streamlitでプロトタイプ作成
-
改善要望
「予算コードの選択がしづらい。科目ごとにフィルタしたい」 「Macのデスクトップアプリにしたい」 「データ更新時にユーザーが構造を壊さないようにしたい」
-
イテレーション
- 動作確認 → 修正依頼 → 反映 のサイクル
良かった点
- コード全体を把握してくれる:ファイル間の依存関係を理解した上で修正
- バグ修正が速い:エラーメッセージを見せるだけで原因特定
- ドキュメント生成:マニュアルも自動作成
注意点
- 大きな変更は確認しながら進める
- 「とりあえず動く」と「本番品質」は別物
- セキュリティやエッジケースは人間が確認
配布の工夫
社内配布用に以下を整備:
Windows向け
セットアップ.bat:Python仮想環境を構築起動.bat:アプリを起動
Mac向け
setup_mac.sh:セットアップ.appバンドル:ダブルクリックで起動
共通
docs/マニュアル.md:使い方ガイドdocs/create_distribution.sh:配布用Zip作成
まとめ
開発にかかった時間
- 基本実装:2時間
- UI改善・機能追加:3時間
- 配布準備・ドキュメント:1時間
- 合計:約6時間
Claude Codeなしだと2〜3日はかかっていたと思います。
学んだこと
-
Streamlitは社内ツールに最適
- 学習コストが低い
- Pythonの資産をそのまま活用
- デプロイ不要で配布可能
-
バリデーションは最初から入れる
- 後からだと手戻りが大きい
- ユーザーの入力ミスを防ぐのが最重要
-
AI活用の肝は「要件の言語化」
- 曖昧な指示より具体的な例
- 動作確認 → フィードバック のサイクル
思わぬ副産物:予算管理システム
振替伝票を作っていて気づいたことがあります。
「これ、予算管理システムじゃん」
もともと予算コードはExcelで管理していました。1000件以上ある予算コードと財源コード、消費税区分の対応表。これを振替伝票生成のために読み込んで、UI上で検索・選択できるようにしたら...
- 予算コードの一覧表示
- 科目ごとのフィルタリング
- 新規予算の追加
- 既存データの編集・削除
- バリデーションによるデータ整合性チェック
振替伝票ツールを作っていたら、オリジナルの予算管理システムができていた。
数千件程度なのでSQLを使うほどでもない。でもExcelだと壊れやすい。Pythonでサクッと作れて、ブラウザで使える。ちょうどいい規模感のアプリになりました。
これが業務効率化の面白いところで、ひとつの課題を解決しようとすると、関連する別の課題も一緒に解決できることがある。「振替伝票を自動化したい」から始まって「予算マスタを安全に管理したい」まで解決できた。
今後の展望
- [ ] 過去伝票のDB化(現状は毎回Excelを全件読み込み)
- [ ] 処理履歴のログ保存
- [ ] 複数の振替パターンのプリセット機能
- [ ] 予算執行状況の可視化(せっかくデータがあるので)
業務効率化ツールは「自分が困っている」ところから始まる。そして作っているうちに、思わぬ副産物が生まれることもある。小さくても確実に時間を節約できるツールを、これからも作っていきたいと思います。