思考実験室

日々のつれづれ

VBScriptでCreateObject関数を使ってみよう

バッチファイルでの処理ではどうにもしっくりこない。セキュリティポリシーの関係でどうしてもPowerShellが使えない。
そんなときに使いたくないけど使えるのがVBScriptWindowsの環境であればいつだってメモ帳でスクリプトが書けるのです()。

バッチファイルだと行えないオブジェクトの参照も、CreateObject関数を用いることで、かんたんにExcelIEの自動操作を行えます。CreateObject関数は、VBAのコードなどで見覚えがあるという方は多いかとは思いますが、今回用いるVBScriptでも使用できます。

Excelに記述されたマクロを実行させてみましょう。

' oExcel変数を宣言し、Excelを参照させる
Dim oExcel
Set oExcel = CreateObject("Excel.Application")

' ブックを開き、test_macroを実行する
oExcel.Workbooks.open "C:\test\test.xlsm"
oExcel.Run "test_macro"
' Excelマクロ側でApplication.Quitと書き起動させたアプリケーション側で制御すると良い

他にはTeraTermのマクロなども起動できたりします。
TeraTermマクロはパラメータを渡して、実行させることができるため、VBScriptで予めパラメータを編集しておくことでより柔軟なプログラミングも可能です。
が、まずは平易なパラメータを渡してみましょう。

Dim oShell
Set oShell = CreateObject("WScript.Shell")

' TeraTermマクロに渡す引数
' 引数1:test.ttl > 起動するマクロ名
' 引数2:test_user
' コマンドプロンプトで、以下のように実行するのと同じ内容になります
' > "C:\teraterm\ttpmacro" "test.ttl" "test_user"
command = """C:\teraterm\ttpmacro"" ""test.ttl"" ""test_user"""
oShell.Run command

もちろん正規表現も備えています。

Dim fso, regexp, folder, file
Set fso = CreateObject("Scripting.FileSystemObject")
Set regexp = CreateObject("VBScript.RegExp")

regexp.Pattern = ".*.txt"
Set folder = fso.GetFolder("C:\test")

' C:\testにある拡張子(.txt)のファイルを削除する
For Each file in folder.Files
  If regexp.Test (file.Name) Then
    ' fileオブジェクトの参照は削除により破棄されてしまうので先に名前を取得
    Dim name: name = file.Name 
    fso.DeleteFile "C:\test" & "\" & file.Name, True
    MsgBox name & "を削除しました"
  End If
Next

VBScriptに書いておくことで、わざわざExcelを開きマクロを実行させる必要がなくなるため、面倒くさがりな人たちもニッコリなのではないかと思います。
例えばTeraTermの接続先やユーザーの情報をExcelから取得し、その後TeraTermマクロを実行して接続先からデータを取得し、さらに別のExcelマクロを実行させてデータの自動編集などを行うなどもできるでしょう。
以上のように、CreateObject関数を用いてVBScriptに包んでおくことでワンクリックでやってくれるスクリプトが作成でき、レガシーでセキュアな現場でもちょっとは楽になるかもしれません。