【VBA】タスクスケジューラに設定されているタスクの一覧を取得する

タスクスケジューラに設定されている
タスクの一覧を…

タスクスケジューラの「VBAフォルダ」配下のタスク(3つ)
タスクスケジューラの「VBAフォルダ」配下のタスク(3つ)


VBAで取得してシート上に読み込むことが
できます!

VBAでタスクスケジューラの「VBAフォルダ」配下のタスク(3つ)を取得
VBAでタスクスケジューラの「VBAフォルダ」配下のタスク(3つ)を取得


可読性や保守性を良くするために
 ・処理を5つに分けて作成
します!

PR

VBAコード

可読性や保守性を良くするために、処理を以下の5つに分けて作成します。

5つの処理
  • メイン処理
    ・役割は「以下の指定」。
     ・タスクスケジューラのタスク一覧を出力するシート名の指定
     ・開始セルの指定
     ・タスクスケジューラのタスクが格納されているフォルダ名
     ・テーブル名の指定
     ・各種処理の呼び出し

  • 出力シート再作成処理
    ・役割は「出力シートの再作成」。

  • スケジュールタスク取得処理
    ・役割は「タスクスケジュールに設定されているタスクの取得」。

  • データ分割処理
    ・役割は「データの分割」。
    ・カンマ区切りで分割する。

  • テーブル化処理
    ・役割は「表のテーブル化」。


呼び出し関係は以下です。
※メイン処理から他の4つの処理を呼び出します。

呼び出し関係
呼び出し関係


ここでは例として
 ・シート「Schtasks」上に
 ・タスクスケジューラに設定されているVBAフォルダ配下のタスクを出力し
 ・テーブル化
します。

ソースコードは以下です。

'変数の宣言を必須
Option Explicit

'----------------------------------------------------------
'メイン処理
'----------------------------------------------------------
Sub main()
    
    Dim sheetSchtasks As Worksheet
    Dim startRange As range
    Dim targetFolderName As String
    Dim srcRange As range
    Dim destRange As range
    Dim tableName As String
    
    '【出力シート再作成処理】の呼び出し
    Set sheetSchtasks = reCreateSheet("Schtasks")
    
    '開始セルを指定
    Set startRange = sheetSchtasks.range("B2")
    
    'スケジュールタスクが格納されているフォルダ名を設定。※「\」で囲む。
    targetFolderName = "\VBA\"
    
    '【スケジュールタスク取得処理】の呼び出し
    Call outputSchtasks(sheetSchtasks, startRange, targetFolderName)
    
    '【データ分割処理】の呼び出し
    Set srcRange = startRange.CurrentRegion
    Set destRange = startRange
    Call TextToColumns(sheetSchtasks, srcRange, destRange)
    
    '【テーブル化処理】の呼び出し
    tableName = "スケジュールタスク一覧"
    Call makeTable(sheetSchtasks, startRange, tableName)
    
End Sub


'----------------------------------------------------------
'出力シート再作成処理
'引数1 :sheetName  シート名
'返り値:ws         再作成したシート(WorkSheetオブジェクト)
'----------------------------------------------------------
Function reCreateSheet(ByVal sheetName As String) As Worksheet
    
    Dim sheet As Worksheet
    Dim ws As Worksheet

    '既にシートが存在する場合は削除
    For Each sheet In ThisWorkbook.Worksheets
        If sheet.Name = sheetName Then
            '確認メッセージを非表示
            Application.DisplayAlerts = False
            'シート削除
            Worksheets(sheetName).Delete
            '確認メッセージを表示
            Application.DisplayAlerts = True
        End If
    Next
    
    '------------------------------------------------
    'シートを新規作成
    '------------------------------------------------
    Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    ws.Name = sheetName
    
    '返り値
    Set reCreateSheet = ws

End Function


'----------------------------------------------------------
'スケジュールタスク取得処理
'引数1:ws               出力シート(WorkSheetオブジェクト)
'引数2:startRange       開始セル
'引数3:targetFolderName タスクが格納されているフォルダ名
'----------------------------------------------------------
Sub outputSchtasks(ByVal ws As Worksheet, ByVal startRange As range, ByVal targetFolderName As String)

    Dim command As String
    Dim wsh As Object
    Dim execObj As Object
    Dim stdOutObj As Object
    Dim outputColumn As Integer
    Dim startRow As Integer
    Dim i As Double
    Dim line As String
    
    '''''''''''''''''''''''''''
    'スケジュールの取得
    '''''''''''''''''''''''''''
    '実行するコマンドを指定
    command = "schtasks /query /V /FO CSV"
    
    Set wsh = CreateObject("WScript.Shell")
    
    'コマンドを実行
    Set execObj = wsh.exec("%ComSpec% /c " & command)
    
    'コマンドの実行結果を取得
    Set stdOutObj = execObj.stdOut
    
    '''''''''''''''''''''''''''
    'スケジュールの出力
    '''''''''''''''''''''''''''
    outputColumn = startRange.COLUMN
    startRow = startRange.Row
    i = startRow
    
    '取得した行の最後の行まで繰り返し
    Do While Not stdOutObj.AtEndOfStream
        
        '1行取得
        line = stdOutObj.ReadLine()
        
        '不要行(指定フォルダ配下ではないタスク)を除く
        '文字列「ホスト名」が含まれている行は出力する。カラム名として出力させたいため。
        If 0 < InStr(line, targetFolderName) Or _
           0 < InStr(line, "ホスト名") Then
            ws.Cells(i, outputColumn) = line
            i = i + 1
        End If
    Loop
    
    '重複を削除(最初の行以外の文字列「ホスト名」が含まれている行を削除)
    ws.Cells(startRow, outputColumn).CurrentRegion.RemoveDuplicates Columns:=1
    
    '後片付け
    Set stdOutObj = Nothing
    Set execObj = Nothing
    Set wsh = Nothing

End Sub


'----------------------------------------------------------
'データ分割処理
'引数1:ws        対象シート
'引数2:srcRange  分割したいデータが設定されているセル(範囲指定が可能)
'引数2:destRange 分割後のデータの設定を開始するセル
'----------------------------------------------------------
Sub TextToColumns(ByVal ws As Worksheet, ByVal srcRange As range, ByVal destRange As range)

    '「,(カンマ)」で分割
    srcRange.TextToColumns Destination:=destRange, comma:=True
    
End Sub


'----------------------------------------------------------
'テーブル化処理
'引数1:ws          対象シート
'引数2:startRange  テーブル化したい範囲の開始セル(一番左上のセル)
'引数3:tableName   テーブル名
'----------------------------------------------------------
Sub makeTable(ByVal ws As Worksheet, ByVal startRange As range, ByVal tableName As String)
    
    '対象シートのをアクティブ化と一番左上のセルの選択
    ws.Activate
    startRange.Select
    
    'テーブル化を実行
    ws.ListObjects.Add.Name = tableName
    
    '列幅を自動調整
    ws.Cells.EntireColumn.AutoFit
    
End Sub

「出力シート再作成処理」を呼び出して、「タスクスケジューラに設定されているタスクの一覧を出力するシート」を作成します(17行目)。
※上記ではシート「Schtasks」を作成しています。
※状況に応じてシート名を変更してください。

※既にシートが存在している場合は、削除して再作成しています。

「タスクスケジューラに設定されているタスク」を出力する開始セルを指定します(20行目)。
※上記ではセル「B2」を指定しています。
※状況に応じて他のセルへ変更してください。

「スケジュールタスクが格納されているフォルダ名」を指定しています(23行目)。
※上記では「VBAフォルダ」を指定しています。
※状況に応じて他のフォルダへ変更してください。

「スケジュールタスク取得処理」を呼び出しています(26行目)。

「データ分割処理」を呼び出しています(29~31行目)。

「テーブル化処理」を呼び出しています(34~35行目)。

「タスクスケジューラに設定されているタスクの一覧を取得」するために
 ・コマンド「schtasks /query /V /FO CSV」を実行
しています(95~103行目)。

「指定フォルダ配下にあるタスク」のみを出力しています(120~124行目)。

「見出し行」が複数出力されてしまうため、「重複を削除」により削除しています(128行目)。

列幅を自動調整しています(168行目)。

PR

実行結果

タスクスケジューラに設定されているタスクの一覧を取得できました。
※シート「Schtasks」に出力。
※VBAフォルダ配下にあるタスクのみを出力。

実行結果
実行結果
PR

参考①

上記のVBAコードは、以下の記事を参考にして作成しました。

●シートが存在したら削除する


●コマンドプロンプトの実行結果を取得する


●重複を削除する


●セル内のデータを分割して、複数のセルに設定する


●シート上の表をテーブル化する


●列幅を自動調整する

PR

参考②

タスクスケジューラからVBA(マクロ)を自動実行できます。

詳細は以下の記事をご確認ください。

PR

参考③

上記のVBAコードで実行しているコマンド「schtasks」の詳細はは、公式サイトをご確認ください。