ある程度VBAが使えるようになるとこう思います。
「もうこれボタン押すだけだし、オレがやる必要なくね?」
マクロ実行命令すらもコンピューターに委ねたいですか?はい、可能です。これは我々、はたらきたくない会社員の理想を実現するために必須のテクニックになります。
タスクスケジューラを使う
Windowsにはタスクスケジューラという、いわゆるタイマーの役割を担うアプリが付属しています。これを使うと定期的に設定したプログラムを実行できます。
詳しい使用方法はGoogle先生に聞いていただくとして、間隔(毎日、毎週、何曜日など)と時刻を設定して、実行したいプログラムを指定すると、その通りにやってくれます。
じゃあこれにExcelファイルを指定しとけばいいのかというと、そう簡単にはいかず、ただExcelファイルを指定しただけでは、マクロの実行まではやってくれません。VBA側でブックオープンのイベントからマクロ実行するよう仕込むこともできますが、設定時刻になると画面にExcelが表示されて鬱陶しいうえに閉じるのは自分でやらなければなりません。
いっそのことファイルが開かれたら画面には表示しないでマクロを実行して閉じるまでをそのファイルにVBAで書いておくという手もありますが、いざそのファイルを編集したいときにいちいちマクロ実行を無効にして開く必要がありスマートではありません。
そこで、この「ファイルが開かれたら画面には表示しないでマクロを実行して閉じる」専用のプログラムを対象のExcelファイルとは別で用意してあげます。それをタスクスケジューラで実行すればよいのです。
VBSからExcelマクロを実行させる
これにはVBSを使用します。VBS (Visual Basic Scripting Edition)はWindowsに標準装備されているスクリプト言語で、VBAとほぼ同じ構文でプログラミングでき、各Officeアプリをオブジェクトで呼べます。
「もうこれボタン押すだけだし、オレがやる必要なくね?」状態までVBAができるあなたであれば、簡単に使いこなせます。
さっそく前述のスクリプトを作りましょう。テキストファイルに次をコーディングします。
Const WB_PATH = "C:\Users\Ore\Desktop\test.xlsm"
Const PROC_NAME = "main"
Dim excelApp
Set excelApp = CreateObject("Excel.Application")
With excelApp
.Visible = False
Dim wb
Set wb = .Workbooks.Open(WB_PATH)
.Run wb.Name & "!" & PROC_NAME
.DisplayAlerts = False
wb.Save
wb.Close
End With
excelApp.Quit
このように見た感じはほぼVBAですが、注意点として変数宣言に型を指定してはいけません。エラーで止まります。
WB_PATH はExcelファイルのパスです。
PROC_NAME は実行するプロシージャの名前です。
あなたの環境に合わせて変更してください。
やっていることは「もうこれボタン押すだけだし~」のあなたなら説明の必要はないと思いますが、キモはExcel.ApplicationオブジェクトのRunメソッドによるプロシージャ実行です。これでイベントに頼らずに、このスクリプトが実行されると指定したファイルの指定した名前のプロシージャが実行されます。
このテキストファイルを拡張子.vbsで保存します。画像のような、いかにもなアイコンになると思います。
では、本来とは逆の手順になりますが、テストのため上のvbsファイルで指定しているパスに実際にExcelファイルを置き、指定したプロシージャ名でマクロをこしらえてみます。
次のようなプロシージャを作りました。
Sub main()
Range("a1") = "さいたま"
End Sub
vbsファイルをダブルクリックで実行します。実行しても特に何もリアクションがありませんが、Excelファイルを開いてみると
ちゃんとマクロが実行されています。
あとはvbsファイルをタスクスケジューラへ登録すれば目的が達成されます。
この要領で毎日、毎週、毎月やらなければならない作業を完全自動でコンピューターにやらせることができます。
私はこれを「報告書を印刷する」という実務で使っています。報告書の種類は毎日変わりますが、あらかじめシートに設定したパスと関数を用いて「今日はこれ」というの判定させています。出社するとその日に必要な報告書が勝手にプリントアウトされています。
皆さんも、はたらかないで終わらせる仕事を増やしていきましょう。
おわり。