このページについて

  • 日々、WSHを使ってきたことの覚書である
  • WSHが今後もMSによってサポートされ続けるものかはわからないが、少なくとも自分や周囲の人の環境では便利なため、わかったことやサンプルコードを載せていく
  • 掲載したサンプルコードについては、少なくとも自分の環境で動くことは確認したものの、他の環境でも動作することは保証しない
  • 動作確認した環境
    • Windows7 64bit WindowsXP
    • Microsoft Office Professional 2010, 2007

メモ

  • WSHおよび関連技術を使えば、オフィス文書作成における同じ作業をプログラミングで省力化できるケースがあることがわかってきた。
    • オフィス文書とは、Word、Excel、PowerPoint、Visioなどを指す
  • これまで省力化はVBAで行なっていたが、Excelファイル中に実装したプログラム(マクロ)は構成管理ツールでの差分管理など、基本的な管理に手間がかかる不満を持っていた。ところが、WSHで実行可能なVBScriptはVBAとほぼ同等なことが出来る一方、プログラムをテキストデータとしてExcelファイルから分離して管理できるため、構成管理ツールでの管理に全く問題はない。また、WSH(VBScript)はたいていのWindowsで標準的に備わっているもので、別途実行環境を導入する必要がなく、実装、テスト、配布、実行が行い易い。
    • メリット:ソースコードがxlsファイルの外に保存できるので、ソースコードのバージョン管理が出来る。これがもっとも重要なメリットと考えている。なぜなら、明日の自分はほぼ他人である。当時、どんなことを考えながらコードを書いたのかなんて覚えていない。なんでこんなコードを書いたのか?と思うこともしばしばである。
    • デメリット:xlsファイル以外にソースコード用のファイルという複数のファイルを管理する必要がある。スクリプト系の言語に特有かもしれないが、デバッグ環境が貧弱。ランタイムエラーがでるとどうしていいか分からなくなる
  • WSHで書いたプログラムはWindows環境であればインストーラも不要ですぐに動くため、開発したプログラムを誰かに渡して実行してもらう場合に便利

言語

VBScriptを使用している。Excel等の半自動化でVBAを使っていたのが選択した理由だが、JavaScriptのほうがC系の言語(業務で馴染んでいる)に見た目が似ているためか、プログラムの構造が頭に入ってきやすい。悩みどころ…

検索

  • vbscript 〜(〜は追加の検索キーワード)のような形式で入力する。または、vbsと入力する。ただし、後者ではあまり引っかからない感触がある
  • エクセルの場合は、vbscript ole excelを検索キーワードとすると、より検索結果が絞れるようだ

知識

全般(未分類ともいう)

  • メソッド等の調査の過程で、OLEはいろいろなアプリケーションが有していることに気づいた
    • LibreOfficeにOLEはないようだ
    • OpenOfficeにはOLEがあるようだ
    • Windowsアプリを作る際に用いるライブラリにOLEを有効にする機能が組み込まれているのだろうか?あるならやってみたくなった

OLE、COM関連

定型業務の省力化で検討したケース

枠組みをベースにして、個別の処理を呼び出すように運用する。

すべての作業に共通する枠組み

枠組みから起動する個別のケース

以下メモ

  • Fieldsが更新されない事象に遭遇した。
  • 連想配列というとRubyではHashだがVBSでは名前が異なる。Dictionary
    • Rubyのように2つの配列をzipしてひとつの連想配列を作るメソッドがあると便利だな
  • 引数に配列を与え、かつ、配列を戻り値とする関数を定義したものの、Microsoft VBScript 実行時エラー: オブジェクトがありませんというメッセージが出てうまくできない…。Rubyなら恐ろしく簡単なのに
  • XMLの要素の属性名に数字を与えようとしたら「msxml3.dll: この名前を文字 '1' で始めることはできません:」というエラーが出た。XMLについて無知すぎるのかもしれない
  • 配列の要素を削除するのはできるものの、Rubyほど簡単ではないようだ。こういうところで新しい設計かどうかが分かるのかもしれない
  • Word文書内に箇条書きをいれる検討中
    • MSDNを調査、Wordで記録したマクロの読み込み、ネット上のサンプル(検索キーワードは、word ole 箇条書き 指定)から
  • RangeクラスのSelectメソッドが失敗しました
    • 何がいけないのかと思ったらこの記事に書いてある
    • ということは、シートを移動する場合は必ずSheet(*).Selectを書いておいたほうが良さそうだな
  • クリップボードを扱うには、IE経由とDynamicWrapper経由の2つがあるようだ。使うのは、おそらくIE経由のほうだろう。
  • Document.GetCrossReferenceItemsの戻り値が配列なので内容を出力したところ、Microsoft VBScript 実行時エラー: 型が一致しません、と出た
    • 結局よくわからないのだが、VBScriptはString配列が直接扱えないためらしい
    • この記事にも扱えないとの記述があり、自作COMオブジェクトからString型ではなくObject型を返しつつ、CStr関数を使って変換する方法が書かれている。やってもいいものの、VBScriptではなくC#でプログラムを組んだほうが速いことになるのが、なぁ…
    • この記事ではNotesでも同様の現象が発生したと報告されており、やはりこちらも解決はしていない
    • マイクロソフトのページにあるArrayConvert.exeに含まれるdllがあれば出来そうな記事をみつけたが、ダウンロードできない
    • COMコンポーネントを作ることも視野に入れ、とりあえず情報を列挙しておく。DLL登録をする、あるいは、してもらう必要があるのが面倒…
    • .Net framework検索中…
      • .NET Framework string配列 型変換
  • Excel2010とExcel2007で、アクティブセル領域の選択の結果が異なることがわかった
    • 2010では、アクティブセル領域の選択指定の際に選択していたセルが空白セルであっても、なんらかのデータが入力されたセルが近くにあれば選択する
    • 一方、2007では、アクティブセル領域の選択指定の際に選択していたセルが空白セルの場合、なんらかのデータが入力されたセルが近くにあっても選択されない
    • アクティブセル領域の選択方法
      • キーボードショートカットならCTRL+SHIFT+:(テンキーを使う場合はCTRL+*)でアクティブセル領域の選択が行える
      • VBAあるいはVBScriptであれば、RangeオブジェクトのCurrentRegionプロパティでアクティブセル領域の選択が行える
    • 中盤にCreateObjectの第2引数の話が出ている。イベントドリブンでプログラムを組む際に参考になる。
  • Item プロパティ
  • デザインパターン
    • VBScriptでデザインパターンを実現したものはちょっと検索した程度では見当たらなかった。VBScriptは言語仕様で継承をサポートしておらず、一方、デザインパターンは継承を前提に設計されているものが多いからだろうか。
  • コマンドライン引数を解析する汎用的なサンプルスクリプトを探しているがなかなか見つからない。自分で作るか…
    • この記事によると、引数の型にはNamedとUnnamedの2つがある。打鍵数ではUnnamedのほうが少なくて済むが、オプション指定の順番に縛りがないNamedのほうが良さそうである
    • この記事も上記とほぼ同様の情報がある。掲載日はこちらのほうが早い
    • Namedを使用したサンプルがここの1400行くらいにある。読んでみる
  • VBScriptのサンプルコードを調べていると、それらはハンガリアン記法に基づいて書かれていることが多いことに気づいた。VBSみたいな動的型付け言語では型が不明になりがちなので、そこそこ有用なようだ。
    • が、個人的にはあまり採用しない方針でいく。ただし、自分で新規に組むコードをその対象とする。サンプルコードのような動いているものをいちいち変えているとテストも面倒なので。他人が後から読んでも分かりやすいようにしたいのであれば、変数が属するスコープを極力小さくすることと、構造を理解しやすいようにプログラムを組む、でだいたい事足りるはずである。本音を言えば変数がどんな型か推測できるように手を打ってもなお、型を明示するのは、打鍵数が多くなって嫌なだけだが…。採用するにしても、アプリケーションハンガリアンな場合のみか
    • ハンガリアン記法の書き方については少しは知っていたが、コーディングルール的な話は興味深いので、ちょっと調べてみたらやはりWikipediaに詳しく載っていた
  • フォルダ内のファイルを検索し、ヒットしたものだけを表示するそんなクラスを定義しようと思っており、再発明してもしょうがないのでネットで検索しているがよさそうなものが見つからない。秀丸のgrepで検索対象をファイルに絞ったようなもので、有りそうなんだが…。そんなものにニーズがないからなのか
  • COMインターフェイス経由で.net Framworkで提供されているライブラリをVBSからも使用することができる。ただし、先人たちが書いているように提供されているすべての機能が使えるわけではない。個人的な好みで、ArrayListを多用しているが、Sortメソッドのような基本的なものでも独自クラスなどを格納したりすると、エラーメッセージがでてしまった。微妙な感じである。クラス定義などするなと受け取ってしまう。
  • COMインターフェイス経由でArrayListのメソッドを使用したところ、IndexOf(文字列)で未知のメソッド?などのエラーとなった。MSDNを見ても何も書いていない。ググったところ、VBSから使用する場合はIndexOf_3(文字列)で呼び出せばエラーとならないことが分かった。この記事はVBA用の記述だがIndexOf_3を使用した例を紹介している。MSDNを見て分からないことをどうやって調べたのか?予想だがこんなことやれば結果が得られるか。
    • VBAのオブジェクトブラウザでメソッド定義を確認→Excel2010では参照設定をしたが表示されず。理由不明。調べ方が間違っている?
  • よく分からないところ
    • 言語仕様の話。Newなどで生成したオブジェクトを変数に格納する場合は必ずSetを使用する一方、数値や文字列はSetを用いない。ところが、ForEachなどの繰り返し文中でコレクションオブジェクトからオブジェクトを取得する場合は、Set命令が出てこない。どこに書くんだという疑問もあるので、Inがオブジェクトか否かを判定しているのか?あとで拡張した臭いがする
  • Vbscriptで.NETフレームワークが使えるけど微妙…
    • ArrayListなどが使えるだけまだマシなのだが、継承が絡むような機能?場合にそれだけ使えないのが、いかんせん微妙な立ち位置だなと
    • .NETフレームワークを自分にとってはライブラリなので、やりたいことができる機能があるライブラリが使える言語になびくのは自然なこと。臨機応変だとすると、どういう機能だとどの言語?ということに答えられる基準はないのか?言語やライブラリも日進月歩なので、情報の更新が追いつかないか?
  • WSHでのファイルやフォルダのパスは、Windows上でフォルダ構造と関係なく、WSHファイルが存在する位置を起点に評価されるらしい、ということが分かってきた
  • FolderExistsメソッドの引数にヌル文字列を与えても戻り値がFalseになる。ランタイムエラーにはならない。当たり前といえば当たり前だが

参考情報

そろそろ数が多くなって使いにくくなってきた。ので、自分的ジャンルごとにまとめ中…

言語仕様など

クラス定義改善

OLEオートメーション

OLEオートメーションWord

OLEオートメーションExcel

OLEオートメーションVisio

InternetExplorer

正規表現

暗号化

暗号化に必要なものは暗号化/復号化とバイナリファイルの取り扱いのみと思うので、以下に列挙する →上記リンクおよびネットを検索した結果、VBScriptで秘密鍵を安全に保存する方法は公開されていないようだ。なお、検索すると秘密鍵をCSPキーコンテナに保存する方法は見つかるものの、利用するにはCSPインスタンス作成時に引数を与える必要がある。VBScriptではCreateObjectでインスタンスを作成する際、引数を与えられない仕様のようであるため、使えない…。

未分類

書籍


コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます