WSHがお好きでしょ

WSHがお好きでしょ?(2)


こんにちは、なるーらぼです。あっという間に3月です。今年もあと10か月ですね。
今回はWSHについて少しふれてみましょう。マクロをつくった経験がある方には少し退屈かもしれません。VBScriptを中心にお話するからです。

VBScript

ベースはVisualBasicなのですが、いろんな都合で少しずつ違っています。
VBAを書いたことがあれば記憶にあるかもしれませんが、変数のあとに「As String」というような記述をするのが自然です。しかし、VBScriptではこの記述自体が不要です。プログラミングの経験がある方向けに言えば、変数に「型」がないためです。
しかし見た目上の話で、オブジェクトはSetステートメントを必要とするなど、気持ち悪い書き方になります。
変数宣言は不要にも必須にもできるという点も非常に「やらかしやすい」設計になっています。
気持ち悪いと思う方はファイルの先頭にVBAでも記述するように「Option Explicit」を記述しておきます。

また、見た目はマクロとそこまで変わらないのに、組み込み関数が微妙に違っているところも困りどころです。たとえばFormat関数は数種類の組み込み関数に分けられています。
このあたりもマクロ経験があるばかりになぜか動かないということを引き起こしたりします(妖怪の仕業ではありません)。

不慣れなころは、エラー処理も困りものです。マクロだと「On Error Goto ~」ステートメントでラベルまでスキップさせますよね。VBScriptにはこれがありません。かといって、JavaScriptのように「try ~ catch」も記述することはできません。基本的にその場でエラーになります。ですからエラーになっても継続したいときは「On Error Resume Next」一択です。これを書いておいて、Errオブジェクトでエラーの有無をチェックしながら進めていきます。

ほかに恐ろしいところというと、MsgBox関数といった画面に関係しそうなものが使えてしまうというところもあります。前回でJScriptではwindowオブジェクトがないのでalertを使うことができない、ということをお話したのですが、そことあっさり矛盾しています。ウィンドウがないのにMsgBox関数が利用できるというのは、どういうことなんだろう、と思うわけです。

さらに、2020年現在であまり使う方はいないのかもしれませんが、構造体がありません。わたしも最初は非常に戸惑ったのですが、クラスを使うことができるので「それでいいじゃないか」という思想なのだと考えられます。
個人的には構造体のほうがよほどか便利なことが多いのですが(だからGo言語でも構造体があるんじゃないでしょうか…)。

ただ、あっさりとCreateObjectを使ってExcelアプリを起動せずに利用したり、ネットワーク関係の情報を気軽に入手できたりとパワフルではあります。デメリットを受ける分、メリットもあるよ、ということなのだと思ってください。

CreateObject

WSHを使用するときに大前提となることがあります。それは、何をするにもCreateObjectする必要がある、ということです。
例えばテキストファイルをマクロで開くことになったとします。そうすると、標準のOpenステートメントを使えば簡単ですよね。しかしVBScriptにはOpenステートメントがありません。必ずファイルシステムにアクセスするためには「Scripting.FileSystemObject」を経由しなければなりません。
ここがWSHの思想で、やや面倒なところです。
以下へ例を示してみます。まずはVBAです。

Sub aaa()
	Dim fileNo As Integer
	Dim line As String
	fileNo = FreeFile
	Open "aaa.txt" For Input Access Read As fileNo
	Line Input #fileNo, line
	Debug.Print line
	Close #fileNo
End Sub

こちらがVBScriptです。
こちらはVBAのようにサブプロシージャを書くこともできますが、基本的に上から下へ実行されていきますので必須ではありません。

Dim fso, ts, line
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("aaa.txt")
line = ts.ReadLine
WScript.Echo line
ts.Close
set ts = Nothing
set fso = Nothing

なにやら手続きが多く見えますね。
WSHではこうしたオブジェクトの利用と破棄を繰り返して作業をしていきます。プログラミングに慣れている方であれば、これをまとめたようなクラスを用意しておけばいいじゃないかと思いますよね。しかしここは、スクリプト自体が使い捨てになる可能性もありますので、次回以降も使うことがあるのか、メンテナンスをすることがあり得るかといったようなことを念頭に置くとよいでしょう。本当に使い捨てであれば、クラスをつくる必要はありませんから。

どちらかというと、スクリプトでプログラムを書くことができるというメリットを最大限に活かしたほうが楽しいよ、ということです。きっちりかっちりやれたほうがいい、コード補完がされないと無理だ、という方は間違いなくVBAのほうをおススメします。

さいごに

こちらで紹介したコード片をダウンロードできたほうがいいかな、と思ったりしましたが、やめました。インターネット上からダウンロードしてきたVBSファイルを実行するのは勇気も必要になってしまいますので。
配布にもかなり勇気が必要です。。
コード片をコピーしてファイル保存するときは、文字コードをShift-JIS、改行コードをCrLfで保存するようにしてください
メモ帳だと自然とそうなると思います。

VBScriptはRubyやPythonなどと同様にテキストエディタがあればつくることができますので、とても気軽にスクリプト開発をはじめることができます。
ほかのスクリプト言語と比較して便利なライブラリなどがないところ、つまりCreateObjectでオブジェクトをつくることができるものしか利用できないという点は劣るものの、Windowsさえあればはじめることができるということが利点だと思います。
何もインストールすることができない環境では、WindowsにおいてはPowerShellと並んでコンピュータを自動操作するための唯一の方法になります。

次回はさらにもう少しプログラミング的なお話をしたいと思います。

付録

JScriptでさきほどの例を示します。

var fso, ts, line;
fso = new ActiveXObject("Scripting.FileSystemObject");
ts = fso.OpenTextFile("aaa.txt")
line = ts.ReadLine();
WScript.Echo(line);
ts.Close();

この記事が気に入ったらサポートをしてみませんか?