毎月形式が変わるExcelから、会計システム取込用データを作る
営業3部門から届く、列名も税区分の書き方も揃っていない売上明細を、会計システムの取込用CSVに整える手順です。変換プログラムはAIに書かせ、空欄の補完と重複の判断は人が行います。
1. Before ― 手元はどうなっているか
架空のIT企業、サンライズソリューションズ株式会社。営業3部門がそれぞれExcelで当月の売上明細を提出し、経理が会計システムの取込用CSVに整えています。毎月10日が取込の締切です。今月、手元に届いたファイルはこうなっています。
- 列名が部門ごとに違う。第1営業部は「得意先名」、第2営業部は「顧客名」、第3営業部は「取引先」。
- 先月から列が増えた部門がある。第1営業部だけ「プロジェクトコード」列が追加され、他の2部門にはまだ無い。
- 部門コードが空欄の行が47件ある。新設された部署の分で、コード自体がまだ採番されていない。
- 税区分の書き方が揃っていない。「10%」「課税売上10%」「課税」「8%(軽)」が混在している。
- 同じ案件が2つの資料に載っている。第1営業部と第3営業部の共同受注分で、どちらの数字が正なのか資料からは分からない。
- 金額の列に文字が混じっている。「1,200,000 」(末尾に全角スペース)、「850,000 ※要確認」といった行がある。
- ファイル形式が揃っていない。先月は3部門ともxlsxだったが、今月は第2営業部だけCSVで届いた。
この状態から取込用CSVを作るのが、毎月いちばん時間がかかります。会計システムに入れてからエラーで弾かれ、原因を探して作り直す、ということも起きます。
2. 問題の分解 ― 何を整えれば進むのか
作業を3つに仕分けます。仕分けができると、AIを使う場所も決まります。
(a) 形をそろえる
列名の対応付け、税区分の表記統一、金額の文字除去、xlsxとCSVの吸収。ルールが決まれば毎月同じ作業になります。
(b) 不足を埋める
部門コードの空欄47件、プロジェクトコードの無い部門。これは「埋める」のではなく「誰に聞くか」を決める作業です。
(c) 判断がいる
共同受注分をどちらの部門の売上にするか、「※要確認」の行を今月取り込むか翌月に回すか。会社のルールと担当者の確認が要ります。
(a)のうち、列名の対応表と税区分の変換表がいったん固まったあとの毎月の変換は、AIではなくPower Queryか固定のプログラムで処理します。毎月同じ変換をAIに頼むと、月ごとに少しずつ違う結果が返ってくる可能性があり、かえって確認の手間が増えます。AIを使うのは「今月の列が先月と違うか」の差分検出と、新しい表記ゆれが出たときのルール追加の相談だけで十分です。
3. AIに任せること/人が判断すること
- 3部門のファイルの列構成を読み取り、先月との差分を指摘させる
- 税区分・得意先名の表記ゆれの候補を一覧にさせる
- 列名の対応表と変換ルールのたたき台を作らせる
- 変換プログラム(Python)を書かせる
- エラー一覧の出し方を設計させる
- 列名の対応付けの最終確定(「取引先」が得意先なのか仕入先なのかは資料だけでは決まらない)
- 部門コード・プロジェクトコードを補完してよいかどうか(原則、補完しない)
- 共同受注分の計上部門
- 税区分の最終判定
- 取込の実行と、その承認記録
4. 実行 ― AIとのやりとり
手順の全体
- 架空データ(またはダミーに置き換えた数行)をAIに見せ、3部門の列構成と先月との差分を整理させる
- 表記ゆれの一覧を出させ、変換ルール表を人が確定する
- 変換ルール表を渡して、Pythonの変換プログラムを書かせる
- 取込用CSVと、処理できなかった行のエラー一覧を別ファイルで出す
- 件数と金額合計を照合する
- エラー一覧を人が1行ずつ処理する
往復1回目 ― AIが空欄を勝手に埋めた
「部門コードが空欄の47行については、得意先名から判断して『営業2部(コード:2000)』を補完する処理を入れました。」
得意先名から部門は決まりません。AIは変換を通すことを優先して、こちらが渡していない対応関係を作ってしまいました。このまま取り込むと、誤った部門に売上が計上されます。
「空欄を推測で埋めないでください。部門コードが空欄の行は変換せず、そのままエラー一覧に出す仕様に変えてください。エラー一覧には、元ファイル名・元の行番号・空欄だった項目名を必ず入れてください。」
取込用CSV(import_202609.csv)と、エラー一覧(error_202609.csv)の2ファイルを出す仕様に変更。47行はエラー一覧に回りました。
エラー一覧47行を営業部門に照会し、部門コードが採番されるのを待ちます。採番されるまで取り込みません。
往復2回目 ― 件数が合わなかった
変換は成功したように見えたが、元データ1,284行に対して、取込用CSV 1,234行+エラー一覧47行=1,281行。3行足りない。
金額列に「850,000 ※要確認」のように文字が混じった行を、プログラムが黙って読み飛ばしていました。エラーにも出ず、消えていた。気づけたのは件数照合をしていたからです。
「数値に変換できない金額の行は、読み飛ばさずにエラー一覧に出してください。あわせて、処理の最後に『元データの件数=取込CSVの件数+エラー一覧の件数』を確認し、一致しないときは処理を中止して、差分の行番号を表示してください。」
3行がエラー一覧に追加され、件数が一致。件数不一致のときは処理が止まるようになりました。
「※要確認」の3行について、営業担当に金額を確認します。
5. エラーと例外 ― うまくいかないとき
仕様表
| INPUT入れるもの | input/ フォルダに置いた3部門のファイル(xlsx/csv)と、rules/ フォルダの列名対応表・税区分変換表・部門コード表。対象年月はコマンドで指定する。 |
|---|---|
| PROCESSすること | 元ファイルは読むだけで、一切書き換えない。列名対応表にしたがって項目を揃え、税区分を変換し、金額を数値に直す。 |
| OUTPUT出るもの | output/import_YYYYMM.csv(取込用)と output/error_YYYYMM.csv(処理できなかった行)の2ファイル。処理の記録は log/YYYYMM_実行日時.txt。 |
| VALIDATION正しさの確かめ方 | ①元データの件数=取込CSVの件数+エラー一覧の件数 ②元データの金額合計=取込CSVの合計+エラー一覧の合計 ③無作為に5件を抜き取り、元のExcelと突き合わせる。①②はプログラムが自動で確認し、結果をログに残す。 |
| ERROR止める条件 | 列名対応表に無い列名が出てきたとき/必須項目が空欄のとき/金額が数値に変換できないとき/件数または金額が一致しないとき。空欄と不明値は絶対に補完しない。該当行はエラー一覧に出し、取込用CSVには入れない。 |
| RE-RUNやり直し | 同じ年月で何度実行しても、出力ファイルは上書きされ、結果は同じになる。取込用CSVには年月を入れたファイル名を付け、会計システム側に取込済み年月の記録を残して、二重取込を防ぐ。 |
| CHANGE翌月の変更対応 | 列名が変わったら rules/列名対応表.csv に1行足すだけ。税区分が増えたら rules/税区分変換表.csv に足すだけ。プログラム本体は触らない設計にする。ルール表はExcelで開けるCSVにしておき、別の担当者でも直せるようにする。 |
よくある例外と対応
- 新しい部門が増えた → 部門コード表に追加されるまでエラー一覧に出す。仮のコードを当てない。
- 共同受注で同じ案件が2部門に載っている → プログラムでは判定しない。同一の得意先・計上日・金額の組み合わせを「重複の可能性あり」としてエラー一覧に出し、人が決める。
- 第2営業部だけCSVで届いた → 文字コード(Shift_JIS/UTF-8)の違いで文字化けすることがある。読み込み時に文字コードを指定し、化けた場合はエラーにする。
6. 検証 ― 正しいとどう言えるか
取り込む前に、次の4つを毎月必ず行います。AIが作ったプログラムだから正しい、とは言えません。言えるのは、この4つが通ったから正しい、ということです。
- 件数照合:元データの行数と、取込CSV+エラー一覧の合計行数が一致している
- 金額照合:元データの金額合計と、取込CSV+エラー一覧の金額合計が一致している(1円単位)
- 抜き取り確認:無作為に5件、元のExcelと取込CSVを目で突き合わせる
- エラー一覧がゼロ件でないことの確認:毎月ゼロ件なら、逆にエラー判定が効いていない可能性を疑う
会計システムに取り込んだあとは、取込前の残高+取込CSVの合計=取込後の残高を確認します。
7. 注意点
8. After ― 翌月以降、何が変わるか
- 3部門のファイルが揃ってから取込まで、誰がやっても同じ結果になります。
- 翌月の作業は「先月との差分をAIに確認させる → ルール表に追記 → 実行 → 件数と金額の照合」の4ステップになります。
- エラー一覧が、そのまま営業部門への照会リストになります。「なんとなく直して取り込んだ」行が無くなります。
- 列が変わってもルール表の追記で済むので、担当者が代わっても引き継げます。
- 先月の売上明細3部門分を開き、列名だけを書き出してAIに渡し、違いを一覧にさせる
- 税区分の値を全部拾わせて、何種類の書き方が混在しているかを数えさせる
- 部門コードが空欄の行が何件あるかを数え、誰に聞けばよいかを決めておく
応用 ― 難易度を上げる場合
取込後の会計システム側のエラーメッセージもAIに読ませ、エラー内容と元データの行を突き合わせる一覧を作らせます。ここまで作ると、エラー修正の往復が1回で終わるようになります。