開発したマクロ(VBA)を、毎日夜間に実行…など指定された時刻に人の手を煩わすことなく、自動実行できると便利なことってありますよね?!
もうボタン押すのも面倒…みたいな💦
本日は、そのような自動実行の備忘録です。
結論!Windowsの世界では、タスクスケジューラを使います!
■ 動作環境
OS: Windows 10 Home(64ビット)
Excel: 2019(64ビット)
■ なぜOnTimeメソッドを使わない?
Excel VBAでは、指定された時刻 (特定の日時、または特定の期間の経過後) にプロシージャを自動実行する機構としてApplicationオブジェクトのOnTimeメソッドが準備されています。
□ Object.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
EarliestTime: プロシージャを実行する時刻を指定します。
Procedure: 実行するプロシージャ名を指定します。
LatestTime: プロシージャの実行待ち時間を指定します。
Schedule: 有効化時はTrue、解除時はFalseを指定します。
ただし、OnTimeメソッドは、次のような性質があるため使い勝手がイマイチで…💦
OnTimeメソッドを実行したブックがExcel上で開かれている間だけ有効
Excel/該当ブックを再起動すると無効
結果、Excelを常時起動していなければならない
■ タスクスケジューラとは
タスクスケジューラとは、Windows OSの標準機能で、決められた時刻や一定間隔でプログラムやスクリプトを実行することができる、いわゆるタスク(ジョブ)管理ツールと呼ばれるものです。
ウィザードを利用することで、簡単に自動実行のスケジュールを組むことができる。
この機構を使うことで、Excelを自動起動し、任意の処理を自動実行できます。
タスクスケジューラの使い方は、Windowsのタスクスケジューラを合わせてご覧ください。
では、タスクスケジューラの[プログラム/スクリプト]に何を指定しようかなー?
■ Excelファイルを直接指定?
まず思いつくのは、Excelファイルを直接指定することで自動起動…ですが、最終目標は「任意の処理を自動実行」ですので、任意のマクロを指定(起動)できないと話になりません。
では、Excel起動時のオプション指定を確認すると…
いろいろスイッチがあるようなのですが、任意のマクロ(ファンクションやサブルーチン名など)を指定できるようなものはありませんでした💦
じゃ、指定しなくても勝手に動くマクロ…ということで、ブックが開かれたときに起動されるイベントプロシージャ「Workbook_Open」でやりくりしてみます。
Excelファイル名: test.xlsm
Excelファイルの格納場所: c:\temp
タスクスケジューラで次のとおり設定してみました。
で、プログラムでもないExcelファイルを直接指定したので動かないかな?と思いましたが、正しく起動されてきました(笑)
が、いくつか喜ばしくないことが…
Excelファイルが目で見える形で立ち上がってきて鬱陶しい💦
Excelファイルは起動されっぱなし💦
Excelファイルを閉じるまで、タスクスケジューラ上は「実行中」のまま💦
■ Excelも操作しちゃう?
ということで、前述のデメリット感を拭い去るためにWorkbook_OpenにExcel自体を操作するロジックを組み込みました…。
が、タクスケジューラからキックされる都度、(ほんの一瞬)画面にExcelが映ってしまいますね💦
■ Workbook_Openの面倒さ加減
また、そもそもWorkbook_Openを使用する運用方式は、Excelファイルをメンテしたい時にとっても面倒です。
特別な開き方(Shiftキーを押しながらExcelファイルを指定して開く…)をしないと毎回Workbook_Openが実行されてしまう…という弊害があります💦
■ (補足)タスクスケジューラの指定の仕方
ちなみにタスクスケジューラの[プログラム/スクリプト]へexcel.exeを指定する方式も試してみましたが、Excelファイルを直接指定しちゃう方式と比べての差は(パット見)見つかりませんでした💦
■ まとめ
タスクスケジューラ+Excelファイルを直接指定…が思いのほか、ヘビーになってしまいましたので、ここで一旦クロージングします。おすすめはこれではありません💦
また、次回以降にもっと素敵な方式を提案させていただきますね。^^
Comments