結論:2つのCSVを落とすだけ
置き場所はここ。
銀行の入金明細と、自社の請求一覧。この2つを枠に落とすと、突き合わせた結果が出ます。ファイルはどこにも送っていません。全部ブラウザの中で動きます。無料で、登録もいりません。
事務作業を自動化する道具の4本目です。1本目が電帳法のファイル名、2本目がインボイスの登録番号、3本目がCSVの文字化け。今回は入金の消込を選びました。
コードはClaude Codeに書かせています。何を作るか、どう設計するか、何を検査するかの判断は自分でやりました。以下に出てくる「実装した」「テストを書いた」は、その意味で読んでください。
作る前は「金額を突き合わせるだけだろう」と思っていました。実際に作ってみると、金額だけで照合する設計が、別の会社の請求を消し込むことが分かった。しかもその間違いは、件数だけ見ていると気づけない。
この記事は、その話が中心になります。
消込が手作業で残る理由は、名前が一致しないから
売掛金の消込は、請求書を出した金額と、実際に振り込まれた金額を突き合わせる作業だ。合っていれば消す。合っていなければ調べる。
理屈は単純です。それでも手で突き合わせる作業が残るとしたら、理由は金額ではなく名前にあります。
請求一覧の「請求先名」は漢字で入っている。株式会社霞商店、有限会社中央工業、といった具合に。一方、銀行の入金明細に入る「振込依頼人名」は半角カナだ。
さらに、振込の名義には表記の決まりがある。ゆうちょ銀行の案内によれば、株式会社は「カ」、有限会社は「ユ」、合同会社は「ド」といった略語を使う(送金先口座名義人名、ご依頼人名の入力方法・2026年9月8日確認)。この法人略語が28種類ある。同じページには営業所略語が2種類、協同組合や共済組合などで使う事業略語が25種類も載っている。
括弧の付き方も位置で変わる。群馬銀行の案内では、略語が名前の頭部にあるときは「カ)グンマシヨウジ」、途中なら「グンマ(カ)シヨウジ」、末尾なら「グンマシヨウジ(カ」となる(振込先口座・受取人名の入力上の注意・2026年9月8日確認)。末尾に来るときは閉じ括弧を付けない。括弧を全角にするか半角にするかは案内によって違い、ゆうちょ銀行のほうは「全角かっこ」と書いてある。この道具はどちらでも読む。同じ会社が、前株か後株かで見た目が変わる。
同じ案内には、使える文字が「半角カタカナ・半角英大文字・半角数字」と一部の記号だけだとも書いてある。ここから2つのことが起きる。
濁点が分かれて入る。「ジ」は1文字ではなく、「シ」と濁点の2文字になる。
そして、小書きのカナが使われないことがある。出典2本に載っている例はどちらも大書きだけだ。請求一覧に「ショウジ」と書いてあっても、入金明細には「シヨウジ」で来る。小書きで来る銀行があるかは、実物の明細を見ていないので確かめていない。どちらで来ても外さないように、この道具は両方を寄せて同じものとして扱う。
つまり同じ取引先が、請求一覧では「株式会社青山工房」、入金明細では「カ)アオヤマコウボウ」になる。この2つを文字列として比べても、1文字も一致しない。
実測:漢字の社名とカナの名義は、8組のうち7組が0%だった
「読みを推測して当てにいけばいいのでは」と考えた。実際、そういう実装をしたくなる。
先に数字を出す。漢字の請求先名とカナの振込依頼人名を8組用意して、法人種別を取り除いた本体を直接比べた。一致度は次のようになった。
| 請求先名(漢字) | 振込依頼人名(カナ) | 一致度 |
|---|---|---|
| 株式会社霞商店 | カ)カズミシヨウテン | 0% |
| 有限会社中央工業 | ユ)チユウオウコウギヨウ | 0% |
| 西村商会 | ニシムラシヨウカイ | 0% |
| 株式会社ABC | カ)ABC | 100% |
| 合同会社みどり | ド)ミドリ | 0% |
| 東西物流株式会社 | トウザイブツリユウ(カ | 0% |
| 医療法人霞会 | イ)カスミカイ | 0% |
| 学校法人東雲学園 | ガク)シノノメガクエン | 0% |
8組のうち7組が0%。重なった1組は「株式会社ABC」で、これは英字がカナに変換されずそのまま入るからだ。
漢字の読みは、文字だけを見ても決まらない。上の表には「霞」が2回出ている。株式会社霞商店は「カズミ」、医療法人霞会は「カスミ」だ(どちらも自分で用意した架空の例で、読みも自分で割り当てた)。どちらの読みになるかはその会社が決めていることで、字面からは出てこない。人名や地名が入る社名では特にそうなる。
読みを推測して当てにいくと、外したときに何が起きるか。別の取引先の入金を消し込む。 売掛金の残高が2社ぶん狂って、片方は入金があったのに請求が残り、もう片方は入金がないのに消える。
これは「精度が9割で足りるか」という話ではない。1件外すごとに2社の残高が狂う。
だからこの道具は、読みを推測しない。請求一覧にカナの列があればそれを使う。無ければ名義では照合せず、金額と日付だけで見る。そして「名義では照合していません」と画面に出す。
取引先マスタにカナを1列足せば、そこが確定に変わる。道具側で読みを推測するより、そのほうが外れない。
金額だけで突き合わせると、別の会社が混ざる
ここが今回いちばん学んだところだ。
消込には、金額が完全に一致しない形がいくつもある。
振込手数料が引かれて入金される。請求110,000円に対して、入金は109,450円になる。差額550円は先方が引いた手数料だ。完全一致だけで消し込むと、手数料を先方負担にしている取引先の入金が全部「未消込」に落ちる。
複数の請求をまとめて1回で振り込まれる。請求110,000円と55,000円に対して、入金は165,000円で1件だけ来る。
士業への報酬などでは源泉徴収が引かれることがある。国税庁の案内では、100万円以下は10.21%、100万円を超える部分は20.42%で、1円未満の端数は切り捨てとされている(No.2798 弁護士や税理士等に支払う報酬・料金・2026年9月8日確認)。100,000円の請求なら10,210円が引かれて89,790円になる。対象かどうかの判断は、この道具ではしない。
そこで、金額の差を説明できる候補を拾う実装にした。差が手数料の範囲内なら候補にする。複数の請求の合計が入金額と一致するなら候補にする。ここまでは順調だった。
この時点で単体テストは238件、全部通っていた。
そのあと、本物のChromeで画面ごと動かす検査を書いた。用意したサンプルで突き合わせたところ、2つの失敗が出た。
1つ目。上田文具からの165,000円の入金に対して、正しい組(上田文具の110,000円と55,000円)と並んで、「伊藤製作所の110,000円 + 上田文具の55,000円」という組が当たっていた。合計は同じ165,000円だから、金額の条件は満たしている。候補が2通りになり、「決められない」に落ちた。
2つ目。伊藤製作所からの109,450円の入金に対して、110,000円の請求が2件(伊藤製作所と上田文具)あった。どちらも差額が550円になるので、両方が「手数料が引かれた形」の候補として並んでいた。
原因は同じだ。金額の条件だけを見て、名義の条件を入れていなかった。
金額だけで組合せを探すと、無関係な組が大量に当たる。 合計が一致する組は、探せばいくらでも見つかる。それは「その取引先が払った」ことの根拠にはならない。
修正は簡単だった。名義が照合できるときは、同じ相手の請求だけで組む。手数料の候補も、名義が近いものに限る。
ただし例外を1つ残した。金額が完全に一致するときは、名義が違っても候補として残す。屋号で振り込む会社や、担当者の個人名で振り込んでくる会社があるので、そこを機械が切り捨てると人が見る材料が消えてしまう。確定にはせず、「金額一致・名義は一致しない」と根拠を添えて候補に置く。
単体テストが通っていたのに、画面の検査で見つかった
この2つの穴について、もう一つ書いておきたいことがある。
見つけたのは単体テストではない。単体テストは238件が全部通っていた。見つけたのは、画面ごと動かすブラウザ検査だ。
なぜ単体テストが捕まえなかったのか。単体テストのデータが、1件ずつきれいすぎたからだ。「手数料が引かれた入金1件と、対応する請求1件」を並べて、正しく候補になることを確かめていた。候補になる請求が2件あったら何が起きるかを、試していなかった。
一方、ブラウザ検査には「実際につまずく5つの形」を1枚のサンプルに全部入れた。確定するもの、手数料が引かれたもの、まとめ払い、同じ金額の請求が2件あるもの、請求側に無い入金。混ぜた途端に、条件の足りなさが出た。
部品を1つずつ検査するテストは、部品どうしが干渉する間違いを見つけない。 見つかった穴には単体テストを足したので、次からは単体側でも捕まる(この記事を書いている時点で単体260件・ブラウザ120件・合計380件)。
もう1つ、出力の意味がズレていた点も見つかった。まとめ払いで結ばれた請求は「請求側の残り」から消していたのに、手数料引きで結ばれた請求は消していなかった。同じ「候補」なのに、種類によって出力の意味が違っていた。消込済みと請求側の残りに同じ請求が二重で出る状態だった。
半角カナをソースに直接書いたら、16件のテストが落ちた
もう一つ、作業中に踏んだ穴を書く。作った道具そのものの価値にも関わる話だ。
テストデータの半角カナを、最初はソースに直接書いた。「カ)カズミショウテン」のように打ち込んだ。
テストを走らせたら16件が落ちた。うち8件は「法人略語を切り出せない」という失敗だった。ロジックを疑って調べたが、法人略語28種類を配列から生成して全数試す検査のほうは通っている。おかしい。
原因はテストデータだった。打ち込んだはずの半角カナの一部が、まったく別の文字になっていた。アラビア文字が混ざっていた。半角カナは字形が小さく、別の文字体系が混ざっても目で気づけない。
直し方は、テストデータを手で打たないことだった。全角カナから機械的に半角カナを作る。半角カナはUnicodeの「Halfwidth and Fullwidth Forms」に、U+FF66から連続した並びで入っている。濁点は分解して置き換える。これで書き間違いが原理的に起きなくなり、往復(全角→半角→全角)で元に戻ることも検査できる。
さらに、テストデータに別の文字体系が混ざっていないことを見張る検査を足した。
半角カナは、人間が扱うと静かに間違う。 これはこの道具が解こうとしている問題そのものだった。目で見て確かめる作業を、機械に渡す価値がある領域だということでもある。
なお、この穴を直したときに、書いた検査のうち1件が、何も検査していないことにも気づいた。「han(x) が han(x) と等しい」を確かめる形になっていて、どんな結果でも通る。期待値をコードポイントの列で持つ形に直した。
組合せの探索は、請求件数が3倍になると85倍になる
まとめ払いを探す部分は、部分和の探索になる。請求の中から、合計が入金額に一致する組を探す。
これは件数が増えると急に重くなる。実測した。
| 請求の件数 | 探す最大本数 | 調べた組合せ | 時間 |
|---|---|---|---|
| 20件 | 4本 | 6,175通り | 0.1ミリ秒 |
| 40件 | 4本 | 102,050通り | 0.8ミリ秒 |
| 60件 | 4本 | 523,625通り | 3.9ミリ秒 |
| 40件 | 5本 | 760,058通り | 6.0ミリ秒 |
請求が20件から60件(3倍)になると、探す組合せは6,175通りから523,625通りへ、84.8倍に増える。探す本数を4本から5本に増やすと、40件でも760,058通りになる。
この4つの数字を、組合せの総数と突き合わせてみた。40件・最大4本の102,050通りは、2本の780通りと3本の9,880通りと4本の91,390通りの合計にぴったり一致する。残り3つも同じように一致した。
つまりこの測定では、枝刈りが1回も働いていない。合計が入金額を超えた枝はその場で捨てる実装にしているが、測定用の入金額を極端に大きく取ったので、どの組も上限に届かず全部を数えていた。実際の消込では超えた枝が捨てられるので、これより少なくなる。
上の表は探索の上限値ということだ。それでも増え方は急だ。
だから上限を設けて、超えたら探索をやめる。そのうえで、やめたことを画面に出す。
「探したが見つからなかった」と「探すのをやめた」は、意味がまったく違う。混ぜると、未消込の一覧を見た人が「請求書を出し忘れている」と誤って判断する。打ち切ったときは、何通りまで調べたかを添えて表示している。
決められないものは、決められないと出す
同じ金額の請求が2件あって、入金の名義が読めないとき。機械にはどちらか決められない。
ATM振込や他行経由で依頼人名が落ちると、実際にこうなる。入金明細の摘要に「振込」しか入っていないことがある。
このとき、片方を選ぶ実装にすると何が起きるか。消込の件数は合う。 画面は正常に見える。そして別の取引先の売掛金が消える。
件数が合うことを合格の条件にしてはいけない。この道具は候補が2つ以上あるものを「決められない」として、候補を全部並べる。請求側からも消さない。
人が見るところがはっきりするほうが、機械が黙って選んだ結果を全件検算するより速い。そう判断しました。
この道具でやらないこと
- 漢字の請求先名から読みを推測しない。カナ列が無ければ金額と日付だけで見る
- 候補が複数あるとき、勝手に1つに決めない
- 会計ソフトへ書き込まない。出すのはCSVまで
- 値引き・相殺・前受金・貸倒れの判断をしない。税務の判断には踏み込まない
- 過入金を手数料として説明しない。請求より多い入金は別の理由なので、未消込として出す
- 事業略語には対応していない。法人略語28種類と営業所略語2種類は扱うが、協同組合・共済組合・保険会社などで使う事業略語25種類は名前の一部として扱う
- 源泉徴収でも、報酬の種類による控除額は扱わない。司法書士等は1回の支払につき1万円(国税庁 No.2801・2026年9月8日確認)、外交員等は1か月あたり12万円(No.2804・同)を差し引いてから計算する決まりになっている
消込の可否は経理の判断です。この道具が出すのは「金額と名前がこう対応している」までになります。消込の正しさを保証するものではありません。税務や労務の判断・相談にも応じられません。
ファイルを送っていないことの確かめ方
入金明細と請求一覧は、取引先名・金額・口座名義がそろった資料です。社外に出せば守秘義務にも個人情報の扱いにも触れます。だから「送っていません」を口約束にしていません。
ネットを切ってから使ってみてください。ページを開いたあとでWi-Fiを切っても、突き合わせも保存も同じように動きます。送っているなら動きません。
このページは、外部への通信そのものをブラウザ機能で禁止しています。Content-Security-Policy に connect-src 'none' を宣言しているので、通信のしくみ(fetch・XHR・WebSocket・sendBeacon)がどれも使えません。仮に送ろうとしてもブラウザが止めます。
これは検査項目にもしています。ブラウザ検査の中で、実際に fetch と XHR と sendBeacon と WebSocket と画像を使って外へ送ろうとして、全部止まることを確かめました。ネットを切った状態で動くことと、ファイルとして保存して開いても動くことも検査に入れています。
アクセス解析のタグは道具のページに入れていません(上の通信禁止と両立しないため)。外部ライブラリも1つも読み込んでいません。文字コードの判定と読み書きは、3本目「CSV文字化けお直し」で作ったものをそのまま持ってきました。
道具の大きさは116,306バイト。gzipで圧縮されて届くので、実際にダウンロードされるのは42,455バイトです(2026年9月8日に、読者が開くURLで3回測って同じ値)。この1ファイルを保存して社内の共有フォルダに置いても同じように動きます。
使い方
- 入金の消込くんを開く
- 銀行の入金明細CSVを左の枠に落とす(Shift_JISのままでよい)
- 自社の請求一覧CSVを右の枠に落とす
- 列の割り当てを確認する(中身を見て決めているが、違っていたら選び直せる)
- 手数料の上限や、まとめ払いを探す本数を決めて「突き合わせる」
- 確定・候補・決められない・未消込に分かれて出る
- 消込できた分/未消込/請求側の残りを、Excel用かShift_JIS用で書き出す
先に「サンプルで試す」を押すと、架空の会社名で動きが見られます。上に書いた5つの形が1件ずつ入っています。
銀行のCSVは文字コードがShift_JISのことが多いですが、そのまま落として大丈夫です。和暦(R8/4/1)の日付も読みます。入金額と出金額が別の列になっている形式では、出金だけの行を読み飛ばして、飛ばした件数を出します。
実物のデータでは、まだ試していない
正直に書きます。手元に実物の入金明細と請求一覧が無いので、実データでの試用はしていません。
作って検査したのは、自分で組んだデータと、法人略語28種類を全数試した結果です。入金500件と請求500件の突き合わせが0.3秒ほどで終わることも実測しましたが(10回測って276〜295ミリ秒)、それも自分で作ったデータでの数字になります。
銀行ごとのCSVの形は、銀行ごとに違います。列名、和暦の書き方、摘要に何が入るか。ここは1行も実物を見ていません。Windows版Excelでの動作も確認できていません(手元はMac)。
「うちの銀行のCSVだと列を当てられなかった」という報告がいちばんありがたいです。形に合わせて調整できます。お問い合わせから教えてください。
道具は道具箱にまとめて置いています。
よくある質問
料金はかかりますか
かかりません。登録も不要。事業用途向けに公開しています。
ファイルは本当にどこにも送られませんか
送られません。このページは connect-src 'none' を宣言していて、通信のしくみそのものがブラウザに止められています。上の「確かめ方」に書いた手順で、ご自分で確認できます。
請求一覧にカナの列がありません。使えますか
使えます。ただし名義では照合せず、金額と日付だけで見る形になります。同じ金額の請求が複数あると「決められない」が増える。取引先マスタにカナを1列足すと、そこが確定に変わります。
手数料の上限は何円にすればいいですか
初期値は990円です。取引先が使っている銀行と振込方法で変わるので、実際に引かれている額を見て調整してください。上限を上げるほど、無関係な請求が候補に入りやすくなる。
まとめ払いが見つかりません
「まとめ払いとして探す請求の最大本数」を増やしてください。ただし探す組合せが急に増える。打ち切ったときは、その旨と何通りまで調べたかを表示します。
会計ソフトに取り込めますか
書き出したCSVを使ってください。この道具から会計ソフトへ直接書き込むことはしない。消込を確定させるのは人の判断で、そこを自動化すると間違いに気づけなくなる。
何件まで読めますか
入金500件と請求500件の突き合わせで0.3秒ほどでした(開発者の手元で10回測って276〜295ミリ秒)。まとめ払いの探索を深くすると時間は伸びる。

コメント