タスクスケジューラに設定されている
タスクの一覧を…
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」の詳細はは、公式サイトをご確認ください。