毎朝Excelを手動で開いてマクロを実行していた総務担当者が、Windowsタスクスケジューラ+Pythonで完全自動化した話

非効率極まるExcelマクロ作業、…

業務の始まりは、いつも重苦しい。パソコンの電源を入れ、共有フォルダの奥深くにあるファイルを開く。「月次データ集計_最新版.xlsm」という名前の。数十メガバイトもある巨大なファイル。開くだけで数分かかる。画面が真っ白になり「応答なし」の文字が出るたびに、マウスを握る手に力が入る。やっとの思いで起動したら、今度は「マクロを有効にする」ボタンをクリックする。そしてAlt+F8キーでマクロ一覧を開き、対象のマクロを選んで「実行」を押す。これが毎朝8時の儀式。誰でもできる単純作業のはずが、完全に属人化の温床になっていた。

マクロ作業の苦痛と自動化への決意

他の担当者がファイルを開いていると、読み取り専用モードになってしまい。マクロが途中で異常終了する。だから、毎朝誰よりも早く出社して。誰も触っていない隙を狙って実行しなければならない。関係者にチャットで「今から集計ファイルを開くので閉じてください」と根回しする手間もかかる。マクロが走っている間、Excelの画面を触るとフリーズするため。息を殺してプログレスバーを見つめるしかない。別の作業をしようにも、クリップボードがマクロに奪われるため。メールの返信すら打てない。完全な手持ち無沙汰の時間。これを毎日延々と繰り返す。

まず、去年の夏休み、家族旅行先の旅館で朝食を食べていたとき、後輩からLINEが来た。「マクロが止まりました。どうすればいいですか」。画面の向こうで起きているエラーを文字だけで想像しながら。箸を置いて電話に切り替えた。温かい料理が冷めていくのを横目に、画面の操作を口頭で説明し続けた。隣に座っていた妻は何も言わなかったが、その沈黙が何よりも重かった。

こんな状態をいつまでも続けるわけにはいかない。機械ができることは機械に任せる。その強い決意から、終わりのない自動化への試行錯誤が幕を開けた。

Excel自動化の落とし穴

自動化といえば、Windows標準の「タスクスケジューラ」が頭に浮かぶ。指定した時間になれば、勝手に処理が走る仕組み。Excelのファイルをスケジューラに登録し、毎朝7時半に起動するように設定する。頭の中ではこれで完璧に自動化される予定だった。しかし、現実は恐ろしいほど冷酷です。

次に、原因はシンプルだった。VBAマクロはExcelが開いていないとタスクスケジューラから直接実行できない。タスクスケジューラがやってくれるのは。あくまで「Excelというアプリケーションでファイルを開く」ことだけ。開いた後に「このマクロを実行しろ」という命令を直接渡す機能は備わっていないのです。

Excelマクロ自動化への試行錯誤

どうしても自動で動かしたいなら。Excel自身の機能であるWorkbook_Openイベントにコードを書き込むしかない。ファイルが開かれた瞬間に、自動的に特定のマクロが走り出す仕掛け。一見スマートに見えるが、これには致命的な欠陥がある。人間が手作業でデータを確認したい時や、少しだけ修正を加えたい時にも。ファイルを開いた途端に問答無用でマクロが暴走してしまう。慌ててEscキーを連打して処理を止めようとするが、時すでに遅し。間違った前提でデータが上書きされ、バックアップから復旧する羽目になる。

対策として。Workbook_Openイベントの中にMsgBoxを仕込んで「実行しますか? はい/いいえ」の分岐を作ろうとした。しかし、タスクスケジューラで無人実行している時は。誰もそのメッセージボックスの「はい」を押してくれない。永遠に待機状態になり。裏側でExcelのプロセスが溜まり続けてメモリを食いつぶす悲惨な結果を招いた。

VBSからのExcelマクロ自動化、黄色いバーの罠

一方で、別の手段として。VBScript(VBS)という古いスクリプト言語を間に挟む手法も試した。VBSからExcelを非表示で起動し、マクロを呼び出す。ネットの海を這いずり回り、断片的なコードをコピペして繋ぎ合わせる。だが、VBScriptはエラーメッセージが不親切すぎて。行番号すら教えてくれないこともある。

設定を終えた金曜夜、手応えを感じながら退社した。週明けの月曜、早めに出社して結果を確認しようとモニターを覗き込んだ瞬間。胃がひっくり返りそうになった。Excelの画面の中央に「マクロを有効にしますか?」という黄色いバーが出たまま。2日分のジョブが静かにフリーズしていた。土日の間ずっとその状態で止まっていたことになる。感情の整理がつかないまま、椅子に座り直して最初からやり直しを始めた。

VBAのタスクスケジューラ設定からVBSのデバッグまで。試行錯誤に費やした時間は合計で約3日分(24時間超)にのぼった。

PythonとExcel:ライブラリ比較

そのため、VBA単体での限界を悟り、別の道を模索し始めた。そこで視界に入ってきたのがPython。データ分析やAI開発のイメージが強いが。日常の泥臭い業務自動化にも抜群の威力を発揮する。外部からExcelを操るためのライブラリが豊富に揃っているのです。

いざPythonでExcelを触ろうとすると。ライブラリの選択で高い壁にぶつかる。代表的な選択肢は「openpyxl」と「xlwings」の2つ。名前が似ているせいで混同されがちだが、裏側で動いているメカニズムは全く異なる。

openpyxlの壁とxlwingsによるVBA活用

openpyxlは、Excelのアプリケーション自体を必要としない。ExcelファイルをZIP解凍し。中身のXMLデータを直接書き換えるようなアプローチをとる。処理速度が圧倒的に速く。Excel不要でxlsxやxlsmファイルを読み書きできるのが最大の強み。サーバー環境でも動くため汎用性が高い。しかし、ここには落とし穴がある。VBAマクロ実行はできないのだ。すでにある複雑なマクロ資産をすべて捨てて。ゼロからPythonで書き直すのは現実的ではない。数千行に及ぶ秘伝のタレのようなVBAコードを解読するだけで。何ヶ月もかかってしまう。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

xlwings:PythonによるExcelとVBA連携

しかし、そこで救世主となるのがxlwings。このライブラリは。COM(Component Object Model)というWindowsの仕組みを経由して。Excelアプリケーションそのものを裏側から操る。人間がマウスとキーボードを使って操作する手順を。Pythonが代行するようなイメージ。xlwingsはCOM経由でExcelアプリ本体を操作するため。PCにExcelがインストールされている必要がある。その制約はあるが、既存のVBAマクロをそのまま外部からキックできる。「ファイルを開く」「マクロを実行する」「上書き保存して閉じる」という一連の流れを。ほんの数行のPythonコードで記述可能になる。

過去の資産を活かしたまま、実行のトリガーだけをPythonに置き換える。これが、非エンジニアにとって最も確実で痛みの少ない移行ルートとなる。

タスクスケジューラ Python自動化の落とし穴

Pythonスクリプトが完成し、手動で動くことが確認できた。いよいよタスクスケジューラに登録し、完全自動化の仕上げに入る。ここを適当に済ませると、予期せぬトラブルで泣きを見ることになる。

さらに、タスクの作成画面を開き、「トリガー」タブで実行したい時間を設定する。毎朝7時、誰も出社していない静かな時間帯を選ぶ。鬼門となるのは「操作」タブの設定。ここで「プログラム/スクリプト」の欄にPythonの実行ファイルを指定するわけだが。大きな罠が潜んでいる。普通に「python.exe」を指定してしまうと。バッチ実行のたびに黒いコマンドプロンプト画面が画面のど真ん中にポップアップする。別の作業をしている最中に、突然黒い窓が現れてキーボードのフォーカスを奪われる。タイピング中の文字が消えたり。意図せず処理を中断させてしまったりするストレスは計り知れありません。

スクリプト自動実行の落とし穴と対策

この問題を回避するための手段は決まっている。タスクスケジューラの「プログラム」にpythonw.exeを指定するとコンソール非表示で実行できる。末尾の「w」はWindowlessを意味する。これだけで、裏側でひっそりと処理が進むようになる。

コンソールを非表示にするのは快適だが、引き換えに恐ろしいリスクを背負う。エラーが起きても画面に何も表示されないのだ。どこで処理が止まったのか、なぜ落ちたのか、完全にブラックボックス化してしまう。ログファイル出力(sys.stdout → logfile)を必ず設定しないとデバッグ不能になる。スクリプトの冒頭で標準出力をテキストファイルに書き出す処理を入れるか。loggingモジュールを使ってエラー内容をファイルに吐き出す。このひと手間を惜しむと、後で必ず後悔する。

タスクスケジューラ権限とUNCパス

まず、設定を終えてテスト実行したのに、なぜかピクリとも動かないことがある。原因は権限不足。UAC(ユーザーアカウント制御)の影響でスケジューラが動かないケースがあるのだ。タスクのプロパティ画面で「最上位の特権で実行する」のチェックボックスをオンにすることで回避できる。ただし、ここで「ユーザーがログオンしているかどうかにかかわらず実行する」を選ぶと。権限のコンテキストがシステム側に切り替わる。すると。普段見えているXドライブなどのネットワークドライブ文字が突如として認識されなくなる。パスを指定する時は。必ずUNCパス(\\server\share\…)を使って絶対パスで記述する配慮が必要になる。

自動化の不安解消、Slack通知で安心感

すべてが自動で動くようになった。しかし、人間の心は弱いもので、本当に裏側で動いているのか不安になってしまう。朝出社して、おそるおそる出力先のフォルダを覗き込む。ファイルが更新されていなかったらどうしようと、心拍数が上がる。自動化への信頼が揺らいでしまうと、結局手動での確認作業がやめられなくなる。

安心感を担保するために、ひとつの仕掛けを組み込む。処理が最後まで到達したら、社内のコミュニケーションツールに通知を送るのだ。PythonからSlackへメッセージを投げるのは驚くほど簡単。requestsというライブラリを使い。SlackのIncoming WebhookのURLに向かって短いテキストを送信するだけ。数行のコードを追加するだけで、立派な通知システムが完成する。

バッチ処理通知、安心と喜び

次に、「朝のバッチ処理が完了しました」というそっけない一言だけでも十分。余裕があれば「処理件数:500件」といった具体的なデータを添える。もし途中で例外エラーをキャッチしたら、「エラーが発生しました。ログを確認してください」と飛ばすように設定する。これで、わざわざフォルダまで見に行く無駄な時間は完全に消滅する。

システム稼働初日の朝、通勤電車に乗りながら何度もスマートフォンを取り出していた。まだ届いていない。座席に座り直してうとうとしかけた頃、かすかな振動。画面を見ると「✅ 朝のバッチ処理が正常に完了しました」という一行。思っていたよりずっと小さな文字だったが、思わず立ち上がりそうになった。隣の乗客が怪訝な顔で振り返るのを感じながら、口の端だけで笑った。

VBA×Pythonで業務自動化、時間と場所からの解放

自動化システムが本格稼働を始めてから、日常の景色は一変した。朝8時に慌てて出社し。Excelの起動画面を祈るような気持ちで見つめる日々は過去のものとなった。パソコンを開く頃には。今日の仕事に必要なデータはすでに完璧な状態で整えられている。

一方で、毎朝の手動実行には起動待ちと根回し込みで平均25〜30分を奪われていた。Python移行後は0分。その時間は朝イチのメール確認と当日タスクの整理に充てられるようになった。

誰も触らない早朝に処理を済ませることで。ファイルが使用中でエラーになる競合問題も根絶された。何より大きいのは、物理的な場所に縛られなくなったこと。出張で遠方のホテルにいても、在宅勤務でリビングにいても関係ない。会社のパソコンさえ立ち上がっていれば。スケジュール通りにPythonがExcelを呼び起こし。無言で作業をこなしてくれる。

VBAをPythonで包むハイブリッド自動化

属人化していた業務を切り離したことで、心理的な負担は劇的に軽くなった。休みの日に電話がかかってくる恐怖に怯えることもない。浮いた時間は、他の非効率な業務を見直すための思考のスペースに変わる。既存のVBA資産を無理に捨てず。Pythonとタスクスケジューラという現代のツールで包み込んで自動実行環境を作り上げる。このハイブリッドな手法は、古い社内システムと格闘する多くの担当者にとって。暗闘を照らす強力な武器になるはずだ。VBAを捨てず、Pythonで包み直す。それだけで、毎朝の憂鬱は静かに消えていく。

関連リンクとチェックリスト

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →