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


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


可読性や保守性を良くするために
 ・処理を5つに分けて作成
します!
VBAコード
可読性や保守性を良くするために、処理を以下の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
実行結果
タスクスケジューラに設定されているタスクの一覧を取得できました。
※シート「Schtasks」に出力。
※VBAフォルダ配下にあるタスクのみを出力。

参考①
上記のVBAコードは、以下の記事を参考にして作成しました。
●シートが存在したら削除する
●コマンドプロンプトの実行結果を取得する
●重複を削除する
●セル内のデータを分割して、複数のセルに設定する
●シート上の表をテーブル化する
●列幅を自動調整する
参考②
タスクスケジューラからVBA(マクロ)を自動実行できます。
詳細は以下の記事をご確認ください。
参考③
上記のVBAコードで実行しているコマンド「schtasks」の詳細はは、公式サイトをご確認ください。

  
  
  
  






