月末データ統合の悲劇

月末のオフィス。静まり返ったフロアに響くのは、マウスの無機質なクリック音と。キーボードを叩く音だけだ。マウスを握る右手の親指の付け根が熱を持ち、瞬きを忘れた目は乾ききっている。経理や総務、人事といった管理部門に所属していると。毎月必ずこの「データの回収と統合」という呪いのような作業が回ってくる。各部署の担当者が入力した実績や申請のExcelファイル。10個ならまだマシだが。拠点が多い会社なら数十個のファイルがファイルサーバーやメールの添付で次々と送られてくる。
ファイルを開く。必要なデータの行を選択してコピーする。全社統合用のマスターファイルを開く。データの最終行までスクロールし、慎重にペーストする。そしてファイルを閉じる。何の創造性もない。ただひたすらに右手と左手を動かし続けるだけの単純作業だ。10部署×Excelファイルのコピペ統合に毎回3〜4時間かかっていた。たったこれだけの作業に、月末の貴重な時間が虚しく溶けていく。
現代オフィスのExcel悲劇
まず、送られてくるファイルは決して完璧ではない。不要な空行が含まれていたり、セルが謎の書式で黄色く塗られていたりする。提出期限を過ぎてから「すいません。数字間違ってたので差し替えてください」とチャットが飛んでくることも日常茶飯事だ。各部署から「提出用_最終_修正版(2).xlsx」というような命名規則を完全に無視したファイルが五月雨式に送られてきて。それをひとつずつ開いてコピペしていたら。いつの間にか元のファイルの行と列がズレていたことに気づかなかった。3時間分の作業がすべてパアになったときの絶望感。胃が鉛のように重くなり、モニタの強烈な光が目に突き刺さった。誰が悪いわけでもない。Excelという便利すぎるツールが生み出した。現代オフィスの避けられない悲劇なのです。
億単位のコピペミス、手作業からの卒業

コピペ作業の恐ろしいところは、作業時間が長引くことではない。人間の集中力を徐々に削り取り、致命的なミスを誘発することにある。機械のように正確なコピーとペーストを何十回、何百回と繰り返すことは。人間の脳の構造上不可能に近い。
あの日の失敗は、今でも鮮明に思い出せる。深夜22時。フロアの照明が半分落ちた薄暗いオフィスで、最後のファイルのデータを貼り付け。上司への報告用フォルダにマスターファイルを格納した。疲労で目のピントが合わず、画面の数字がぼんやりと二重に見えていた。翌朝、血相を変えた上司から会議室に呼び出された。原因は単純な範囲指定のミスだった。ある部署のデータを貼り付ける際。B列のデータをC列にズラしてペーストしてしまったのだ。その結果、金額の桁がひとつズレて計算され、全社の売上総額が億単位で狂っていた。
手作業の限界と決別
次に、手作業には限界がある。どれだけ気をつけても、ダブルチェックの体制を敷いても。人間は疲労すれば見落としをするし、手元も狂う。謝罪のために作らされた再発防止策の報告書には「今後は指差し確認を徹底する」という無意味な言葉を並べるしかなかった。システムがアナログなままなのに。人間の注意力だけで品質を担保しようとする組織の構造そのものが間違っている。物理的に手でコピーして貼り付けるという行為そのものを根絶しない限り。同じ悲劇は何度でも繰り返される。この日、二度と手作業でExcelファイルを統合しないと固く心に誓った。
Pythonで複数Excel結合の自動化

手作業のコピペを撲滅するために選んだ武器は。Pythonというプログラミング言語だった。マクロ(VBA)を使う選択肢もあったが。VBAで別のExcelファイルを開こうとすると、画面がチカチカと点滅し。裏側で目に見えないエラーが起きることも多い。その点、Pythonにはデータ処理に特化した強力なライブラリが揃っており。やりたいことを驚くほど少ない記述で実現できる。
ここで主役となるのが「glob」と「pandas」という二つのモジュールだ。globは、パソコン内のフォルダを巡回し。指定した条件に一致するファイルを見つけ出す機能を持つ。
glob.glob('フォルダパス/*.xlsx')
一方で、でファイル一覧を取得する。これは手作業で言うところの「フォルダを開いて。対象のファイルを目視で確認する」というプロセスに完全に相当する。
次に、pandasの機能である
pd.read_excel()
PythonによるExcelデータ結合の高速化
を呼び出す。各ExcelファイルをpandasのDataFrameとして読み込むための命令だ。DataFrameとは。Excelのシートそのものをプログラムが計算しやすいように仮想的なメモリ空間に展開したものだと考えればいい。人間が目で見てマウスで操作する代わりに。Pythonの計算エンジンが直接触れられる状態に変換されるのです。
そのため、最後に登場するのが
pd.concat()
という強力な関数である。バラバラに読み込んだ複数のDataFrame(表データ)のリストを縦結合する役割を持つ。Pythonスクリプト化後は実行時間が約30秒に短縮された。人間が手で開いてコピーして貼り付ける重労働を。Pythonはデータ構造の結合という形でメモリ上で瞬時に完了させる。これがプログラムの圧倒的な力です。
ここで一度立ち止まって考えてみてください
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。
Excelファイル結合コード解説

理屈はさておき、実際に動くコードを見ればそのシンプルさに驚くはずだ。なお、PythonでExcelファイルを操作するためには。裏方として動くopenpyxlというパッケージが必要になる。コマンドプロンプトやターミナルを開き、事前にインストールを済ませておく。
import glob
import pandas as pd
file_list = glob.glob('target_folder/*.xlsx')
df_list = []
for file in file_list:
df = pd.read_excel(file)
df_list.append(df)
df_merged = pd.concat(df_list, ignore_index=True)
df_merged.to_excel('merged_result.xlsx', index=False)
Excel結合のPython自動化
しかし、たったこれだけの行数で、数時間の作業が完了する。PythonはExcelのように視覚的な画面を持たないため。裏側で何が起きているのかイメージしづらいかもしれない。しかし、やっていることは手作業の忠実な再現です。
先ほど紹介した
glob.glob()
で集められたファイルのリストを、
for
さらに、文を使って一つずつ取り出していく。取り出したファイルは
pd.read_excel()
でDataFrameとして読み込まれ、
df_list
という空のリスト(箱)にどんどん追加されていく。すべてのファイルを読み終えたら、箱の中身である複数の表データを
pd.concat()
まず、で一気に縦結合する。ここで引数として渡している
ignore_index=True
は、元ファイルにあった行番号を無視し。結合後の表に綺麗な通し番号を振り直すための設定だ。結合後のDataFrameを
to_excel()
で保存する。「merged_result.xlsx」という新しいファイル名で出力される。
index=False
次に、を指定しないと。行番号まで一つのデータ列としてExcelに書き出されてしまうので注意が必要です。
Excelデータ処理の罠と対策

コードは完璧でも、読み込むデータが完璧とは限らない。非エンジニアがここで挫折する最大の原因は「人間が見ているExcelの表」と「プログラムが認識するデータ」の間に存在する深い溝だ。各部署が自由に入力したExcelファイルには。プログラムを狂わせる無数の罠が潜んでいる。
最大の罠は、列名のズレだ。意気揚々とコードを実行して完成したファイルを開いたら。列名が「備考」と「備 考」(半角スペース入り)で別の列として認識されてしまい。データが階段状にズレた謎の列が大量発生した。何が起きたか分からず冷や汗が止まらず。結局その日は手作業で修正して終電を逃した苦い記憶がある。
pd.concat()
一方で、は融通が利かない。列名が1文字でも。あるいは半角スペースが混ざっているだけでも「別の列」として処理してしまう。この悲劇を防ぐには、結合する前に列名を設定し直す必要がある。列名のズレは共通列を指定して
reindex()
または
filter
で揃える処理を読み込み直後に挟めば、ズレを完全に防げる。
PandasでのExcel読み込み:シートと空白行の対策
そのため、二つ目は、シート名のバラつきによる誤読み込みです。
pd.read_excel()
は、何も指定しないと「一番左にあるシート」を読み込む仕様になっている。もし誰かが「作業用」というシートを作り。そちらを一番左に移動させたまま保存していたら、無関係なデータが混入してしまう。これを回避するには、
sheet_name='提出用'
のように、読み込むシート名を明示的に指定しておくのが鉄則です。
しかし、三つ目は、意図しない空白行の混入。Excel上では空白に見えても、過去に誰かがスペースキーを押してしまったセルや。罫線だけが引かれているセルが存在すると。pandasは「そこまでデータが存在する」と誤認してしまう。結合が終わったあとに、
dropna(how='all')
を使って「全項目が空の行」を削除するクリーニング処理を忘れずに入れておきたい。
Pythonによる集計・レポート自動化

ファイルの結合が無事に終わっても、実務はそこで終わらない。結合されたマスターデータを元にして、部署ごとの売上合計や。月別の経費推移を計算するための集計作業が待っているはずだ。多くの場合、ここからまたExcelを開き。セルを範囲指定してピボットテーブルのダイアログを呼び出すことになる。
さらに、だが、その集計作業すらもPythonの中でシームレスに完結させられる。結合直後のDataFrameである
df_merged
に対して、
groupby()
という集計用の機能を使えばいい。これはExcelのピボットテーブルの裏側で動いている計算エンジンと全く同じ概念だ。「部署名」という列を基準にしてグループ分けし、「売上金額」の数値を合計する。そのような複雑に見える処理も、わずか1行のコードを追加するだけで実現する。生のデータをそのまま保存する処理に加えて。美しく集計されたレポートを別のシートに出力する処理まで作り込んでしまえば。手作業が介入する余地は完全にゼロになる。
ルーティン業務の自動化、感動と解放
まず、ファイル統合と集計を行うスクリプトをWindowsのタスクスケジューラに登録しておき。月末の朝に出社したら既に完璧なレポートファイルが生成されていたときの感動。かつての数時間に及ぶ無駄なコピペ地獄から完全に解放され。同僚が慌ただしくマウスを動かしている横で、コーヒーの香りが鼻腔を抜け。朝日が差し込むオフィスの空気がいつもより澄んで感じられた。最初はエラー画面の赤字と格闘し、心が折れそうになるかもしれない。だが、一度仕組みを作り上げてしまえば。プログラムは文句一つ言わずに毎月同じ作業をミリ秒単位の正確さでこなしてくれる。手作業の限界を感じたその日こそが。終わらないルーティンワークの連鎖を破壊する絶好のタイミングなのです。
関連リンクとチェックリスト
著者はこうして解決の糸口を見つけた
著者も同じ境遇から始まりました。独学でここまで自動化した道のりを参考にしてみてください。
学習サービスとアンケート
このスキルを活かしてさらに前へ進むなら
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

