処理は成功。
Excelも出力された。
合計金額も、それっぽい。
翌月になってから数字が違うと分かる。
ExcelやCSVの連携で本当に怖いのは、エラーで止まることではありません。
間違っているのに正常終了することです。
2026年6月に公表された製造業従事者100名への調査では、「一部自動化されているがCSV出力などの手作業も含む」が36.3%、「ExcelやCSVを使った手作業が中心」が30.4%でした。
製造業に限った小規模な調査なので、全企業へそのまま当てはめる数字ではありません。
ただ、システムからCSVを出し、Excelで整え、別のシステムへ渡す仕事が今も残っていることは分かります。
私はシステムエンジニアとして15年以上、Excel、VBA、GAS、Python、Webアプリ、データベースを使った業務改善を扱ってきました。
ココナラでも販売実績は200件を超えています。
それでも、データ連携で毎回警戒するのは高度なAPIではありません。
「この列、本当に同じ意味ですか?」というクッッッソ地味な確認です。
顧客名ではなく顧客ID
一つ目は、データをつなぐためのキーです。
会社名、商品名、担当者名など、人が読む名前だけで連携すると、かなり危険です。
同じ会社でも、
・株式会社を付ける人と付けない人
・全角と半角
・旧社名と新社名
・本社名と店舗名
・末尾の空白
・略称
こんな違いが普通に混ざります。
見た目では同じに見えても、プログラム上は別の文字です。
反対に、同じ名前の別会社や同姓同名もあります。
だから、可能なら顧客ID、商品コード、受注番号など、重複しない値でつなぎます。
IDがない場合は、その場しのぎで名前を加工する前に、どの項目を組み合わせれば一件を識別できるか決めます。
ここを曖昧にすると、つながらないデータと、間違ってつながるデータが同時に発生します。
エラーなら気づけます。
別の顧客へ正常に集計された方が怖いんですよね。
同じ列名に隠れた別の意味
二つ目は、列の意味です。
列名が「金額」でそろっていても安心できません。
・税抜金額
・税込金額
・値引き前
・値引き後
・送料込み
・キャンセル反映前
・入金済み金額
全部「金額」と書けます。
日付も同じです。
「登録日」が申込日なのか、入力した日なのか、承認日なのか。
「更新日」がデータを修正した日時なのか、外部システムから取り込んだ日時なのか。
ここを確認せずに列名だけで対応付けると、プログラムは普通に動きます。
そして、普通に間違えます。
はい。
一番嫌なやつです。
データ連携前には、列名だけでなく、次の3点をメモします。
・何を表す項目か
・誰が、どのタイミングで登録するか
・空欄やゼロは何を意味するか
立派なデータ定義書でなくても構いません。
「この金額は税込、キャンセル反映後」と1行残るだけで事故は減ります。
文字列になった数字
三つ目は、データ型と表記です。
Excelでは、見た目が同じでも中身が違うことがあります。
・数値の123
・文字列の「123」
・先頭に空白が入った「 123」
・カンマ付きの「1,234」
・郵便番号の先頭ゼロ
・日付に見える文字列
・時刻を含む日付
人が画面を見るだけなら、だいたい読めます。
PythonやGASへ渡すときは、どの形式として扱うか決める必要があります。
特に商品コードや社員番号は、数字に見えても計算する値ではありません。
「00125」を数値にすると「125」になります。
その瞬間、別システムのコードと一致しなくなります。
日付も、時刻やタイムゾーンが混ざると日付が前後することがあります。
CSVを読み込めたから終わりではありません。
読み込んだ後に、件数、先頭ゼロ、日付範囲、空欄数を確認します。
月末にずれる集計範囲
四つ目は、集計の境界です。
「7月分を集計する」と言っても、会社や業務によって範囲が違います。
・7月1日から7月31日
・6月21日から7月20日
・請求日が7月のデータ
・入金日が7月のデータ
・承認済みになった日が7月のデータ
さらに、キャンセル、返品、再請求、翌月調整が入ります。
この条件を人が毎月判断している場合、単純に日付で絞るだけでは再現できません。
以前、3年分・8店舗分のデータを扱う集計では、データベースが4GB級になりました。
数字だけ見ると大きそうですけど、実際に後から効いてくるのは、店舗区分や日付境界の小さなズレです。
大量データを速く処理できても、対象期間が一日ずれていたら意味がありません。
すごい速度で間違えます。
終わってます。
集計前に、対象期間、基準にする日付、キャンセルの扱いを固定します。
空欄を勝手にゼロにしない
五つ目は、異常データの扱いです。
空欄、ゼロ、対象外は同じではありません。
空欄は未入力かもしれません。
ゼロは正しい金額かもしれません。
対象外は集計しないデータかもしれません。
この違いを決めずに、空欄をすべてゼロへ変換すると、入力漏れが見えなくなります。
逆に、空欄が一件あるだけで全処理を止めると、毎月人が直すことになります。
私は次のように分けます。
・処理を止めるエラー
・処理を続けて警告するデータ
・自動補正できる表記
・人へ確認を戻すデータ
たとえば、必須の顧客IDがない場合は止める。
会社名の前後に空白があるだけなら自動で除去する。
金額が空欄なら、勝手にゼロへせず確認一覧へ出す。
この線引きがあると、全部を人が見直す必要がなくなります。
出力後に照合する四つの数字
連携処理が終わったら、完成したExcelだけを見ない方がいいです。
最低限、次を照合します。
・入力件数
・出力件数
・除外件数
・金額や数量の合計
入力100件、出力97件、除外3件なら説明できます。
入力100件、出力97件だけでは、3件が消えたのか、重複を除いたのか分かりません。
さらに前回との差が大きい場合は、警告を出せるようにします。
前月比が変わったこと自体はエラーではありません。
ただ、確認するきっかけにはなります。
自動化は、人の確認をゼロにするためではありません。
確認する場所を減らし、毎回同じにするための仕組みです。
相談前に見たい三つのファイル
ExcelやCSV連携を相談するとき、完璧な仕様書は不要です。
次の3点があると、かなり具体的に確認できます。
・入力元のExcelやCSV
・手作業で作った完成ファイル
・現在の作業手順メモ
個人情報や会社名はダミーへ置き換えて構いません。
数行のサンプルでも、列構成と処理の流れは見られます。
Excelで残すべきか、Power QueryやVBAで対応するか、GASやPythonで自動化するか、Web画面やデータベースまで必要か。
技術を先に決めず、現在のデータと運用から切り分けます。
【関連記事】
毎月のCSV集計について、入力元・出力先・利用頻度から整理した記事はこちらです。
【サービス案内】
Excel・CSV・スプレッドシートの集計、転記、帳票作成、外部サービス連携を自動化したい場合はこちらです。
作業内容がまだ整理できていない場合も、サンプルファイルを確認しながら対応範囲をご案内します。