Windowsに実装されているジョブ管理アプリケーションであるタスクスケジューラについて、基本的な使い方とOfficeVBAの起動方法を解説します。
タスクスケジューラを利用できる様になると何が良いかというと、VBAで作成したマクロを指定した日時や繰り返しスケジュール、はたまたWindowsのイベントをキャッチして実行することが可能になります。つまり、ルーチンワークをわざわざ手動で実行しなくとも、Windowsが勝手に実行してくれる様になります。マクロの実行を誰かにお願いすることも無くなりますし、定期実行されるため人間の様に忘れてしまうこともありません。使いこなせる様になると相当便利なジョブ管理アプリケーションです。私は、OfficeのVBA(Excel、Access)やSeleniumBasicの定期実行をこのタスクスケジューラを使って定期実行しています。
タスクスケジューラ ⇒ PowerShellの起動
タスクスケジューラの起動
タスクスケジューラの起動方法はいくつかありますが、一番簡単な方法は、Windowsデスクトップの検索画面で「タスクスケジューラ」と、入力する方法です。
タスクスケジューラを起動すると以下の様な画面になっています。次に「タスクスケジューラ ライブラリ」をクリックします。
タスクの作成
現在、タスクスケジューラで実行するリストが入っています。ChromeやEdgeのバージョンアップもこのタスクスケジューラで実行されていることが分かります。このリスト一覧に新たなタスクを作成します。画面右側メニューに「タスクの作成」がありますので、ここをクリックします。タブメニューの「操作」欄にも同様のメニューがあります。
「タスクの作成」画面が開きます。
全般の設定
全般設定では、以下4つ設定します。入力、選択後、「OK」ボタンをクリックします。
- タスク名を設定します。(RemoveSeleniumTempFolder)
- 「ユーザーが尾久恩しているときのみ実行する」を選択します。
- 「最上位の特権で実行する」のチェックボックスを付けます。
- OSがWindows10や11の場合、構成で「Windows10」を選択します。
トリガーの設定
次にトリガーの設定をします。定期実行のスケジュールをここで設定します。タブメニューの「トリガー」を選択し、「新規」ボタンをクリックします。
トリガー設定では、以下5つを設定します。設定後、「OK」ボタンをクリックします。
- 「スケジュールに従う」を選択します。
- 今回は「毎日」を選択します。週一の実行をしたい場合は、「毎週」を選択します。
- タスク実行の開始日を選択します。後日実行したい場合はその日付を選択します。
- 開始時間を選択します。毎日実行する場合ここで設定した時間で毎日実行されます。
- 停止するまでの時間を設定します。実行失敗時に備え、停止時間を設定します。
タスクのスケジュール設定が完了しました。
操作の設定
次に操作の設定をします。実行ファイルをここで設定します。タブメニューの「操作」を選択し、「新規」ボタンをクリックします。
操作設定では、以下3つの設定をします。設定後、「OK」ボタンをクリックします。
- WindowsPowerShellのexeファイルを指定します。WindowsPowerShellは、環境変数でパスが通っているため、「PowerShell」のみでOKです。
- フォルダ削除用のPowershellファイル(remove_folder.ps1)を絶対パスでフルパス指定します。フルパスの前に-Command を記入します。
-Command "C:\TaskScheduler\remove_folder.ps1" - 実行ファイルのフォルダパスを入力します。❷でフルパスを入力しているため、特に設定はしなくても実行可能です。
操作の設定が完了しました。これで設定は一通り完了したので、「OK」ボタンをクリックして設定を完了します。
タスクスケジューラのメニューにフォルダ削除用タスクが作成されました。
あとは、設定した時間にタスクが実行されます。または、当該のタスク名で右クリックすると、「実行する」ボタンがありますので、そこから即時実行することもできます。
PowerShell ⇒ OfficeVBAの起動
OfficeのVBAをタスクスケジューラで実行する場合は、Powershellを介して実行します。
実行手順は、「タスクスケジューラ」⇒「Powershell」⇒「VBA」の順番で実行するイメージです。ファイルの作成手順は、逆にVBAから作成することになります。事前に以下フォルダを作成しておきます。C:\TaskScheduler\Selenium一時フォルダ削除
ExcelVBAの作成
Sub FolderRemove_事前バインディング()
'VBEの参照設定で、事前に「Microsoft Scripting Runtime」を選択
Dim ws As Object, UserPath As String, TempPath As String
Dim fso As New FileSystemObject
Set ws = CreateObject("WScript.Shell")
UserPath = Split(ws.SpecialFolders("Desktop"), "Desktop")(0)
TempPath = UserPath & "\AppData\Local\Temp\Selenium"
If fso.FolderExists(TempPath) Then fso.DeleteFolder TempPath
End Sub
ExcelVBA実行用のPowershellファイル
PowershellでExcelマクロを実行するコードを紹介します。
$filename = "C:\TaskScheduler\Selenium一時フォルダ削除\ファイル削除_FSO.xlsm"
$xlfile = $filename
$xl = New-Object -Com Excel.Application
$wb = $xl.Workbooks.Open($xlfile)
$xl.Visible = $true
$xl.Run("FolderRemove_事前バインディング")
$xl.DisplayAlerts = $false
$wb.Close()
$xl.DisplayAlerts = $true
#Excelアプリケーションを終了
$xl.Quit()
#COMオブジェクトの参照を解放
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($xl)
$xl.Visible = $falseに設定すると、バックグラウンドでVBAを起動することができます。
AccessVBA実行用のPowershellファイル
PowershellでAccessマクロを実行するコードを紹介します。
$DBfile = "<AccessFileFullPath>"
$Access = New-Object -ComObject Access.Application
$Access.OpenCurrentDatabase($DBfile)
$Access.Run("VBACodeName")
$Access.CloseCurrentDatabase()
$Access.Quit()
#COMオブジェクトの参照を解放
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($Access)