わたしとたわしの違い
- きれいに洗う手助けをするのがたわし
- いろんなところを汚してしまうのがわたし
いや、そんなことはどうでもよくて。
やまだです。ただいまフェイドアウト中です。笑……えない (T^T)
えーと、今頃 VBScript 使いまくりの状態なんですが。
客先納品みたいな話は置いておいて、身の回りの業務効率改善なんかだと、これが一番使える言語ではないかと思ったり。
で、使っていて思ったことを書き並べてみよーかと。いや、もの凄くいまさらの話なのはよくわかってますけど。
- とりあえず Option Explicit 書いとけ
ある意味、鉄則ですかね。
暗黙の変数宣言になってしまうと、変数名のタイプミスをしていても別変数の扱いになってしまってなかなか
気づかない、とかよく言われていた気もしますが。
でも、それ以前の話として、自分の使う変数をリストアップしておくって大事なことかな、と。
コードを整理する良いきっかけになるんじゃないかと。あ、いや、ちゃんと設計してから作れば良い話なんですけど、
そんな余裕がないからこそ VBScript 使ってるともいえるわけで(苦笑)。
- えーと、とりあえず実行前にカレントディレクトリ移動しときません?
VBScript 実行するときにコードがあるところ以外がカレントになることって、(意図的にやらなければ)ほとんどない
気もしますけど……。
とりあえず、以下のような感じ?
Set objShell = CreateObject("WScript.Shell")
Set objFso = CreateObject("Scripting.FileSystemObject")
objShell.CurrentDirectory = objFso.GetParentFolderName(objFso.GetFile(WScript.ScriptFullName))
バッチファイルだと、以下の一行で済んじゃいますけどね。
cd /d %~dp0
ついでに、Unix のシェルだと以下のような感じかな?
cd $(dirname $0)
- バッチファイルとの組み合わせありきで考えても良くない?
いや、ちょっとしたツールなら VBScript だけで作れますし、共通ルーチン化するなら WSF ファイルにすれば良い、と
いう話もありますけどね。
バッチファイルから呼び出す形にすれば、環境依存のパラメータはバッチ側に持たせて、共通化できる部分を VBScript
にすれば良いのではないかと。そうすれば、VBScript 直呼び出しの際にエンジンは CScript と WScript のどちらになって
いるのかなんて気にしなくて済みますし。
- スクリプトエンコーダーは過信するな
エンコードするんだから、ちょっとした文法チェックぐらいしてくれるんじゃないかと少しは期待はしてしまいましたが。
えー、閉じかっこの対応チェックもしてくれてなかったようです……。
日本語メッセージはエンコードしてくれないし、結構簡単にデコードもできるようですしねぇ。
ただ、手元にコードがあるとついついいつまでも手を入れてしまう、という場合に、エンコードすることで一区切りつける、
というぐらいの感覚ではどうかな、と。
他人にコードを見せないため、というより、うっかり自分がいつまでも手を入れないためにエンコード化(笑)。
- VBA(Visual Basic for Application) より VBS(VBScript) で
この辺で異論のある方は多いかもしれませんが。
むしろ Excel 使う場合でも、VBScript でいーんじゃないかと。VBAの方が、スクリプトの開発環境が整っている、との
話はありますけどね。VBScript はこの辺を見ながら頑張る、ということで。
マクロセキュリティのチェックがどうとか、マクロ付きの場合は拡張子がどうとか、誰かに Excel ファイルのデータを渡す
際にマクロ外したりとか、いろいろと面倒なことがありますし。
あと、Excel の外から起動したい場合には、やっぱり VBScript かなぁ、と。
- On Error Resume Next と On Error Goto 0 は使い分けろ
最初は On Error Resume Next は入れない方が良いです。エラーがあっても素通りしちゃうとねぇ。
でも、そのままだと問答無用でプログラムが落ちますし、Excel アクセス中だと Excel のプロセスがゾンビのように
残ってしまうので注意。エラーが確認されたところから順に、以下のようにエラーチェックを入れていくべきかと。
On Error Resume Next
’エラー原因箇所
If Err.Number > 0 Then
…
On Error Goto 0
Excel 操作する場合なんかだと、最終的には全アクセス行ごとにこのパターンで括った方が良いのではないかという。
- バッチで動かすなら WScript.Interactive で判定だっ
エクスプローラやコマンドプロンプトで動作確認した後、タスクで実行しようとしてはまることがありました。
バッチモードでだけ動かない場合、どうやってデバッグしたら良いものやら、ということで。
バッチモードだと「スクリプトのエラーおよびプロンプトを非表示にする」らしいですが、じゃあダイアログやメッセージ
ボックスを表示するプログラムだとどうなるかというと、「問答無用で(何もなかったかのように)そこで処理を終了する」
みたいです。
単純にそこだけスキップしてくれるのではないかと思った私が浅はかでした……。
ということで、バッチで動かす可能性のある VBScript のコードでは、WScript.Echo や MsgBox の呼び出し時には
WScript.Interactive でバッチモードか否かの判定を行うようにしておきましょう。
ということで、自分のための備忘録でした(結局それかいっ)。
では。