Excelマクロを指定した時刻に自動実行させる

定型作業は全自動でコンピューターにやらせましょう。

ある程度VBAが使えるようになるとこう思います。

「もうこれボタン押すだけだし、オレがやる必要なくね?」

マクロ実行命令すらもコンピューターに委ねたいですか?はい、可能です。

これは我々、はたらきたくない会社員の理想を実現するために必須のテクニックになります。

タスクスケジューラを使う

Windowsにはタスクスケジューラという、いわゆるタイマーの役割を担うアプリが付属しています。これを使うと定期的に設定したプログラムを実行できます。

task1.png


詳しい使用方法はGoogle先生に聞いていただくとして、間隔(毎日、毎週、何曜日など)と時刻を設定して、実行したいプログラムを指定すると、その通りにやってくれます。

task2.png

task3.png


じゃあこれに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で保存します。画像のような、いかにもなアイコンになると思います。

task4.png

では、本来とは逆の手順になりますが、テストのため上のvbsファイルで指定しているパスに実際にExcelファイルを置き、指定したプロシージャ名でマクロをこしらえてみます。

次のようなプロシージャを作りました。

Sub main()
    Range("a1") = "さいたま"
End Sub


vbsファイルをダブルクリックで実行します。実行しても特に何もリアクションがありませんが、Excelファイルを開いてみると

task5.png

ちゃんとマクロが実行されています。

あとはvbsファイルをタスクスケジューラへ登録すれば目的が達成されます。

この要領で毎日、毎週、毎月やらなければならない作業を完全自動でコンピューターにやらせることができます。

私はこれを「報告書を印刷する」という実務で使っています。報告書の種類は毎日変わりますが、あらかじめシートに設定したパスと関数を用いて「今日はこれ」というの判定させています。出社するとその日に必要な報告書が勝手にプリントアウトされています。

皆さんも、はたらかないで終わらせる仕事を増やしていきませんか?

related pages
Power AutomateでExcelシートのリストからメールを送信する Part2
Power Automateで条件によって処理を変える方法。

前回の自動メール送受信管理簿のつづきです。Power Automateでは条件を判定して、その結果により処理を変えるには条件分岐コントロールを使います。VBAでいうところのIfに相当します。条件分岐コントロールでは条件とTrueの場合、Falseの場合のパラメーターを設定していきます。

Read More ...
VBAでファイルを開くのが遅すぎるのでPythonで無理矢理に高速化する
VBAとPythonを連携させてファイル読み込み高速化。

我々VBAerにとっては周知の事実ですが、Excel-VBAで時間がかかる処理と言えば、「ワークシートへのアクセス」と「ファイルを開く」です。Pythonでデータ取得してVBAでExcelへ取り込むことでファイルを開く処理を高速化します。

Read More ...
VBAからLINEにメッセージを送る
LINE Notify APIにVBAからリクエストする方法。

LINE Notifyというサービスがあります。API経由でLINEにメッセージが送れます。これをVBAから利用できればいろいろ面白いことができそうですよね。たとえば、Excelファイルのイニシャライズイベントに仕込んでおけば、ファイルが開かれたらLINEにメッセージが届きます。発想次第で画期的な何かが生まれそうな予感がします。

Read More ...
この記事の
作成日

2020-02-08

更新日

2020-02-09

ページ内検索
目次
WEB MASTER
さいた
神エクセル撲滅協会理事(自称)
さいたま市民 埼玉こそ地上の楽園