毎月1日、VBAエラー修正の憂鬱な儀式
毎月1日の朝。PCを立ち上げるとき、なんとも言えない嫌な汗が出るんです。あぁ、またあの集計作業が始まるのか、と。月末月初に集中する売上データの集計作業が待っているからです。
前任者が残したVBAマクロの実行ボタンを押す。数秒間、画面がチラチラと瞬き、これで終わってくれと祈る。しかし。無情にも「実行時エラー’9′: インデックスが有効範囲にありません」という無機質なダイアログが画面の中央に居座る。目の奥が重くなる瞬間です。
まず、前任者から引き継いだVBAマクロ。毎月1日の朝にドキドキしながら実行ボタンを押すと、高確率で『インデックスが有効範囲にありません』という黄色いデバッグ画面が出て止まってしまうんです。慌ててVBEを開き、`Sheets(“2024年4月”)` という箇所を見つけて `Sheets(“2024年5月”)` に書き換える。
この、たった数十秒の作業のために、前日の夜からずっと胃が重かったのを今でも覚えています。

マクロの手動修正、毎月の憂鬱な儀式
どんなに頑張って中身の計算式を作っても、シート名が1文字違うだけで。マクロは『そんなの知りません』って顔をして止まっちゃう。ほんと、融通が利かないというか、意地悪だなぁと思ってました。エラーを吐き出す画面を前に、キーボードを叩いてコードを書き換える。この「手動でのプログラム修正」という矛盾した作業が。毎月の憂鬱な儀式となっていた。
シート名統一、現場の現実
コードを書き換える手間を省くため。現場に「シート名は必ず『YYYY_MM』の形式で統一すること」と通達を出した時期があった。マクロ側に現在の年月からシート名を自動生成する処理を入れ。名前が完全に一致すれば動くようにしたのです。
次に、完璧な計画に思えた。しかし、人間の行動は予測不能です。
意図を決して全社に『シート名は必ずYYYY_MM形式で!』と強い言葉でお願いを出した翌月のこと。集まってきたファイルを開くと、そこには『24年5月』『5月分』『Sheet1』。そして極めつけは『5月分(修正版)』という。自由奔放すぎるシート名が並んでいました。担当者に聞くと『あ、前のファイルを使い回しちゃって……』と。ルールで人間を縛ることの虚しさを、痛いほど味わった瞬間でした。
現場の人間は忙しい。日々の業務に追われる中。Excelファイルのシート名などという些末なことに意識を割いてはいられない。「先月のファイルをコピーして。中身の数字だけ書き換える」のが彼らににとっての最適解なのだ。そこに悪気はありません。
ファイル名の無法地帯、手作業に潰れる午前
一方で、当時、私が集計していたのは全30拠点からのファイルでしたが。驚くことにそのうちの約40%(12拠点)が。指定したルールを無視したシート名で送られてきていました。毎回、12個のファイルを一つずつ開いて名前を直す作業だけで。貴重な午前中が潰れてしまっていたんです。
結果として集まってくるファイルは、フォーマットの無法地帯と化す。「5月」「05」「5月(全角)」。これらすべての表記揺れに対して。固定の文字列を生成して突き合わせようとするアプローチは根本から破綻していた。人間をシステムに合わせようとする試みは。圧倒的な「ルールの無視」の前に敗れ去る運命にあった。
固定名依存と自動化の限界
VBAのコードを毎月書き換え続ける運用は。ミスという爆弾を常に抱えている状態に等しい。ある月、急ぎの集計を頼まれて焦ってコードを修正した際。別の変数を誤って削除してしまい。数時間にわたって原因不明のエラーと格闘する羽目になった。
そのため、コードに直接シート名を書き込むという行為は、システムを硬直化させる。毎月メンテナンスが必要なシステムは、もはや自動化とは呼べない。ただの「少しだけ便利な手作業」です。
では、Excelの標準機能で回避できないか。INDIRECT関数を使って。セルに入力した文字列をシート名として参照する方法がある。A1セルに「2024年5月」と入力すれば。数式が動的にそのシートを参照しに行く仕組みです。

これもすぐに限界を迎える。INDIRECT関数は揮発性関数と呼ばれ。Excel上で何かしらの操作をするたびに再計算が走る。大量のデータを扱う集計ファイルでINDIRECT関数を多用すると。ファイルが極端に重くなり、最悪の場合はフリーズして落ちる。
しかし、手作業での修正はヒューマンエラーを生み。関数による強引な解決策はExcel自体を破壊する。固定された名前に依存する限り。この無間地獄から抜け出すことは不可能なのだと悟った。
ここで一度立ち止まって考えてみてください
Pythonや自動化スキルを体系的に習得して
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。
Pythonでシート名動的取得、エラー解消
固定の名前を指定するからエラーになる。ならば「今。そのファイルにどんな名前のシートが存在しているのか」をプログラム側に教えてもらえばいい。この逆転の発想を実現してくれたのが、Pythonだった。
Pythonのデータ分析ライブラリであるpandasや。Excel操作ライブラリのopenpyxlには、非常に強力な機能が備わっている。Excelファイルを読み込む際。中に存在するすべてのシート名をリスト(配列)という形式で一括取得できるのです。
さらに、pandasであれば `ExcelFile.sheet_names`、openpyxlであれば `workbook.sheetnames` という属性にアクセスするだけでいい。

この機能の素晴らしいところは。ファイルを開く前にシート名を知っておく必要が一切ない点だ。プログラム自身がファイルの中を覗き込み。「今はこんなシートたちが入っていますよ」と一覧表にして返してくれる。
Python、シート名自動取得
手動でファイルを開き、シート名を確認してマクロのコードを書き換える。1ファイルにつき、迷いも含めて約2分。30拠点分なら合計で60分。対して、PythonがExcelファイルの中身を覗き。全シート名を取得するのにかかる時間は。1ファイルあたりわずか0.05秒(50ミリ秒)。PCが瞬きする間もなく、すべての準備が整ってしまうんです。
まず、リスト形式で取得できるということは。Pythonの得意なデータ処理の土俵に引きずり込めることを意味する。配列の中身をループ処理で順番に確認していく。目当てのシート名があればそれを対象とし、なければスキップする。ハードコーディングによるエラーは、この時点で完全に消滅した。
Python正規表現でシート名柔軟抽出
全シート名をリストで取得できたとしても。「どのシートを集計すべきか」を特定しなければならない。ここで力を発揮するのが。Pythonの文字列操作と正規表現(reモジュール)です。
「2024_05」「5月分」「5月」といった現場の気まぐれな表記揺れ。これらを完全一致で探そうとするから失敗する。リスト内包表記や正規表現を組み合わせることで。「特定のキーワードを含む」という曖昧な条件でシートを抽出可能になる。
次に、例えば、「月」という文字が含まれている。あるいは「数字の後に月が続く」といったパターンで検索をかける。

Pythonのコードはこうだ。取得したシート名のリストに対して。「”5″ と “月” が含まれているか」を判定する。全角の「5」も正規表現で半角に揃えてから比較すれば。いとも簡単に拾い上げることができる。人間が目で見て「あ、これ5月のシートだな」と判断するのと同じプロセスを。プログラムに再現させるのです。
Pythonが変える!自動集計とメンテナンスフリー
『5月』『5月分』『05』……。どんなにバラバラな名前で送られてきても、Pythonのプログラムが『あぁ。これは5月のことですね』と勝手に判断して。次々と集計を終わらせていく様子を見たときは、震えました。最後にターミナルに『30ファイルの集計が完了しました』と出たとき。あまりのあっけなさに。用意していたコーヒーを飲むのも忘れて画面を眺めてしまいました。
あれだけ私を苦しめていた問題が、たった数行のコードで解決してしまったんです。
一方で、さらに仕組みを洗練させる。検索するためのキーワードやパターンを、Pythonのコード内に直接書かず。外部設定ファイル(JSONやYAMLなど)に持たせるようにした。
設定ファイルに「当月の対象キーワード: 5月」とだけ書いておく。Pythonプログラムは実行時にその設定ファイルを読み込み。キーワードを使ってExcelシートを探しに行く。この構造にすると、異なるファイル形式や。別部署が作った全く違う命名規則のファイルにも。設定ファイルを少し書き換えるだけで対応できる。コード本体には一切手を触れなくて済む。これが本当のメンテナンスフリーです。
不完全を包む自動化
自動化を進めようとする時、私たちはつい「規則正しい綺麗なデータ」を要求しがちだ。システムが動きやすいように、人間にルールを押し付けようとする。しかし、会社という組織において。全員が寸分違わずルールを守り続けることなどあり得ありません。
そのため、シート名が変わる。表記が揺れる。それは防ぐべきエラーではなく、あらかじめ織り込んでおくべき「自然現象」です。
Pythonの `sheet_names` で動的に名前を取得し、正規表現で曖昧に検索をかける。外部設定ファイルで条件を切り出す。こういうやり方って、結局は『人間が間違えるのは当たり前』という前提で、それをプログラム側でなんとかカバーしてあげよう、っていう優しさなのかな、なんて最近は思っています。
仕組みを現場に合わせる。表記揺れを許容する柔軟なプログラムを書く。結果として、毎月月初に感じていたあの胃の痛みは消滅した。エラー画面を見ることも、慌ててコードを書き換えることもなくなった。
しかし、ボタンを一つ押せば、システムが勝手に空気を読んで正しいシートを探し出し。無言で集計を完了させる。現場に寄り添いながら、開発者である自分自身の精神的な負担もゼロにする。これこそが、技術を使って手に入れるべき本当の意味での自動化の果実です。

関連リンクとチェックリスト
Pythonを使えば、Excelファイルを開き、その中に存在するすべてのシート名をリストとして取得できます。例えば、`pd.ExcelFile(‘ファイル名.xlsx’).sheet_names` のように書くだけで、シート名のリストが手に入ります。このリストの中に、求めているシート名が含まれているかをチェックすれば、どんな表記揺れがあっても柔軟に対応できるようになりました。まさに目から鱗が落ちるような感覚でした。
例えば、「5月」「05」「5月(全角)」といった表記揺れがあっても、Pythonの正規表現という機能を使えば、それらすべてを「5月」という一つの意味として捉えることができます。シート名のリストから「5月」というキーワードに合致するものを探し出す。この方法なら、たとえ現場の担当者がどのような名前を付けていようとも、マクロが止まることはありませんでした。この柔軟性に、私は感動すら覚えました。
以前は、毎月の集計作業のたびに
以前は、毎月の集計作業のたびに、PCの前で冷や汗をかきながらエラーと格闘していました。しかし、Pythonを導入してからは、そのような憂鬱な時間は一切なくなりました。Pythonスクリプトを実行すると、あっという間に全拠点のファイルから必要なデータを抽出し、集計してくれます。数時間かかっていた作業が、わずか数分で終わるようになったのです。
この変化は、私の仕事に対する考え方を大きく変えました。プログラミングの「プの字」も知らなかった私でも、Pythonという強力なツールを使えば、長年の課題だった業務を自動化できる。そして、それは私だけでなく、他の部署の業務改善にも繋がる可能性を秘めている、と。まさか自分が、こんなにも業務効率化の喜びを感じられる日が来るとは、夢にも思っていませんでした。
Pythonを学ぶことで、単にエラーを解消するだけでなく、業務全体を俯瞰し、より良い方法を模索する視点も養われました。問題の本質を見極め、それを技術で解決する。このプロセスが、私の日々の業務に新しい価値とやりがいをもたらしてくれました。今では、毎月1日の朝が、以前のような憂鬱な時間ではなく、むしろ新しい可能性に満ちた時間に感じられます。
プログラミングスキルは
プログラミングスキルは、決してIT専門職だけのものではありませんでした。私のような完全文系の事務職でも、日々の業務の中で直面する小さな「困った」を解決するために、これほどまでに役立つツールだとは、本当に驚きです。これからもPythonの力を借りて、もっと多くの「憂鬱な儀式」を解消していきたいと思っています。
著者はこうして解決の糸口を見つけた
著者も同じ境遇から始まりました。独学でここまで自動化した道のりを参考にしてみてください。
学習サービスとアンケート
このスキルを活かしてさらに前へ進むなら
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。
¥980 ミニキット
コピペで動かせる3スクリプト+自動化チェックリスト
最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セットです。今週の作業を1つだけ楽にするためのミニキットをご用意しました。

