いや、まだだから

やまだの仮想庭園 ~ いつか実体の伴う日まで

目次

Blog 利用状況

記事カテゴリ

書庫

日記カテゴリ

リンク

私家版 VBScript 経験則

わたしとたわしの違い

- きれいに洗う手助けをするのがたわし
- いろんなところを汚してしまうのがわたし

いや、そんなことはどうでもよくて。

やまだです。ただいまフェイドアウト中です。笑……えない (T^T)

えーと、今頃 VBScript 使いまくりの状態なんですが。
客先納品みたいな話は置いておいて、身の回りの業務効率改善なんかだと、これが一番使える言語ではないかと思ったり。
で、使っていて思ったことを書き並べてみよーかと。いや、もの凄くいまさらの話なのはよくわかってますけど。

  1. とりあえず Option Explicit 書いとけ

    ある意味、鉄則ですかね。
    暗黙の変数宣言になってしまうと、変数名のタイプミスをしていても別変数の扱いになってしまってなかなか
    気づかない、とかよく言われていた気もしますが。
    でも、それ以前の話として、自分の使う変数をリストアップしておくって大事なことかな、と。
    コードを整理する良いきっかけになるんじゃないかと。あ、いや、ちゃんと設計してから作れば良い話なんですけど、
    そんな余裕がないからこそ VBScript 使ってるともいえるわけで(苦笑)。
  2. えーと、とりあえず実行前にカレントディレクトリ移動しときません?

    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)
  3. バッチファイルとの組み合わせありきで考えても良くない?

    いや、ちょっとしたツールなら VBScript だけで作れますし、共通ルーチン化するなら WSF ファイルにすれば良い、と
    いう話もありますけどね。
    バッチファイルから呼び出す形にすれば、環境依存のパラメータはバッチ側に持たせて、共通化できる部分を VBScript
    にすれば良いのではないかと。そうすれば、VBScript 直呼び出しの際にエンジンは CScript と WScript のどちらになって
    いるのかなんて気にしなくて済みますし。
  4. スクリプトエンコーダーは過信するな

    エンコードするんだから、ちょっとした文法チェックぐらいしてくれるんじゃないかと少しは期待はしてしまいましたが。
    えー、閉じかっこの対応チェックもしてくれてなかったようです……。
    日本語メッセージはエンコードしてくれないし、結構簡単にデコードもできるようですしねぇ。
    ただ、手元にコードがあるとついついいつまでも手を入れてしまう、という場合に、エンコードすることで一区切りつける、
    というぐらいの感覚ではどうかな、と。
    他人にコードを見せないため、というより、うっかり自分がいつまでも手を入れないためにエンコード化(笑)。
  5. VBA(Visual Basic for Application) より VBS(VBScript) で

    この辺で異論のある方は多いかもしれませんが。
    むしろ Excel 使う場合でも、VBScript でいーんじゃないかと。VBAの方が、スクリプトの開発環境が整っている、との
    話はありますけどね。VBScript はこの辺を見ながら頑張る、ということで。
    マクロセキュリティのチェックがどうとか、マクロ付きの場合は拡張子がどうとか、誰かに Excel ファイルのデータを渡す
    際にマクロ外したりとか、いろいろと面倒なことがありますし。
    あと、Excel の外から起動したい場合には、やっぱり VBScript かなぁ、と。
  6. 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 操作する場合なんかだと、最終的には全アクセス行ごとにこのパターンで括った方が良いのではないかという。
  7. バッチで動かすなら WScript.Interactive で判定だっ

    エクスプローラやコマンドプロンプトで動作確認した後、タスクで実行しようとしてはまることがありました。
    バッチモードでだけ動かない場合、どうやってデバッグしたら良いものやら、ということで。
    バッチモードだと「スクリプトのエラーおよびプロンプトを非表示にする」らしいですが、じゃあダイアログやメッセージ
    ボックスを表示するプログラムだとどうなるかというと、「問答無用で(何もなかったかのように)そこで処理を終了する」
    みたいです。
    単純にそこだけスキップしてくれるのではないかと思った私が浅はかでした……。
    ということで、バッチで動かす可能性のある VBScript のコードでは、WScript.Echo や MsgBox の呼び出し時には
    WScript.Interactive でバッチモードか否かの判定を行うようにしておきましょう。

ということで、自分のための備忘録でした(結局それかいっ)。

では。

投稿日時 : 2011年2月27日 21:01

Feedback

# re: 私家版 VBScript 経験則 2011/02/27 21:27 ちゃっぴ

以前相当使いまくってた人間ですが、いくつか comments をば。

> 2. えーと、とりあえず実行前にカレントディレクトリ移動しときません?

Current directory に依存する code を書くなでしょ!

> 4. スクリプトエンコーダーは過信するな

全く使いませんでしたね。使うぐらいなら別言語使う。

> 5. VBA(Visual Basic for Application) より VBS(VBScript) で

使い分けについてはおっしゃる通り。ただ、開発環境は VBA ですね。VBE あるので。ということで、VBE を使って coding したものを VBS に落とすなんてことよくやりました。

# re: 私家版 VBScript 経験則 2011/02/28 22:47 やまだ

ちゃっぴさん、どもです。

> Current directory に依存する code を書くなでしょ!

えーと、ログファイルの出力先とか、設定ファイルとかカレントに置きたくなりません?
引数でカレントのパスを渡すべきなのかしら?
っていう場合でも、カレントの取得を呼び出し元ですることになるし……うーむ。

実行ファイルの呼び出しとかはカレントに依存しちゃまずいとは思いますけど。
#うっかり他のものを呼んだりするとセキュリティ的にもまずいので。

> 全く使いませんでしたね。使うぐらいなら別言語使う。

ですね。あまり実用的ではないかと(笑)。
いったん fix したので、うかつに変更しないように、と自分に対する戒めのつもりで使うことにしました。

> VBE を使って coding したものを VBS に落とすなんてことよくやりました。

私も VBA 書いて、やっぱり使い勝手から VBS に移植しなおして現在に至ります。
やっぱり最初は VBE 使った方が良いかもですね。
でも、微妙な仕様の違いが後でストレスになったりもしますが。

タイトル
名前
Url
コメント