最終更新: twoflat1017 2014年06月13日(金) 00:52:03履歴
- 日々、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を有効にする機能が組み込まれているのだろうか?あるならやってみたくなった
- Visual BasicユーザーのためのCOM再入門
- COMの歴史について書かれている。大枠を知りたい場合はとても勉強になる
- CSVファイルをエクセルに取り込む
- emlファイルにあるURLをIEで開く
- CSVファイルの内容を整形してをWord文書を作成する
- CSVファイルを読み込む
- Word文書作成時テンプレートを指定する
- (VBScript)ファイルを特定フォルダにコピーする
- Excelの表をコピーし、Wordに貼り付ける
- Excel内の特定のオートシェイプを選択&コピーする
- emlファイルから添付ファイルを取り出す
- Excelファイルのラッパクラス
- Pukiwiki的なパーサー機能?
- IE8以降でイントラネットサイトを参照する
- wsfとvbsからのvbsスクリプト呼び出し
- IEのイベント発火を捕捉
- IEのフレームページ読み込み完了を捕捉
- IEのイベント発火時の処理が長時間に及ぶ場合を検証
- 開いているIEを操作する
- コマンドライン引数を解析
- XMLファイルの全node、全attributeを出力する
- IEで表示したHTMLデータの全node、全attributeを出力する?
- pdfファイルからテキストデータを取り出す
- WSHからRubyスクリプトを実行する?
- Excelを操作する
- 日付や時間同士の差を求める
- 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経由のほうだろう。
- DynamicWrapperDLLの登録が必要との記事
- 他にもこんな記事もあった
- IEを使用した例
- Document.GetCrossReferenceItemsの戻り値が配列なので内容を出力したところ、Microsoft VBScript 実行時エラー: 型が一致しません、と出た
- 結局よくわからないのだが、VBScriptはString配列が直接扱えないためらしい
- この記事にも扱えないとの記述があり、自作COMオブジェクトからString型ではなくObject型を返しつつ、CStr関数を使って変換する方法が書かれている。やってもいいものの、VBScriptではなくC#でプログラムを組んだほうが速いことになるのが、なぁ…
- この記事ではNotesでも同様の現象が発生したと報告されており、やはりこちらも解決はしていない
- マイクロソフトのページにあるArrayConvert.exeに含まれるdllがあれば出来そうな記事をみつけたが、ダウンロードできない
- COMコンポーネントを作ることも視野に入れ、とりあえず情報を列挙しておく。DLL登録をする、あるいは、してもらう必要があるのが面倒…
- C#でVBA向けの.NETライブラリ(COMコンポーネント)を作成するには?
- VBSで作られたプログラム(test.vbs)からでバッチファイルを実行する方法が回答されていることから、これを使えば、バッチファイルでdllのロード、→スクリプト実行→バッチファイルでdllのアンロード、といったことが実現できるかも?
- .Net framework検索中…
- .NET Framework string配列 型変換
- Excel2010とExcel2007で、アクティブセル領域の選択の結果が異なることがわかった
- 2010では、アクティブセル領域の選択指定の際に選択していたセルが空白セルであっても、なんらかのデータが入力されたセルが近くにあれば選択する
- 一方、2007では、アクティブセル領域の選択指定の際に選択していたセルが空白セルの場合、なんらかのデータが入力されたセルが近くにあっても選択されない
- アクティブセル領域の選択方法
- キーボードショートカットならCTRL+SHIFT+:(テンキーを使う場合はCTRL+*)でアクティブセル領域の選択が行える
- VBAあるいはVBScriptであれば、RangeオブジェクトのCurrentRegionプロパティでアクティブセル領域の選択が行える
- 中盤にCreateObjectの第2引数の話が出ている。イベントドリブンでプログラムを組む際に参考になる。
- Item プロパティ
- デザインパターン
- VBScriptでデザインパターンを実現したものはちょっと検索した程度では見当たらなかった。VBScriptは言語仕様で継承をサポートしておらず、一方、デザインパターンは継承を前提に設計されているものが多いからだろうか。
- コマンドライン引数を解析する汎用的なサンプルスクリプトを探しているがなかなか見つからない。自分で作るか…
- 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になる。ランタイムエラーにはならない。当たり前といえば当たり前だが
- VBScript 基礎文法最速マスター
- ByVal と ByRefについての記載あり。省略するとByRefになる。個人的には直して欲しい言語仕様だと思う。呼び出し先で変えられてしまう可能性があるほうがデフォルトなんて…。というわけで、省略せずに必ずどちらかを明示して(個人的にはByVal)書いておくのがコーディングルールとして適切だろう
- VBScriptリファレンス補遺
- GetRef関数についての記載あり
- 2.起動時パラメータのアクセス方法
- スクリプトの引数についての詳細な記述有り
- VBScriptのヘルプにもない基礎とまとめ
- const修飾子がクラス定義内で使用できないことが書かれている
- Is 演算子
- Is演算子について書かれている。変数が同一のオブジェクトを参照しているかどうかを判定する演算子。なお、=(等号)では同一のオブジェクトを参照しているかを判定できない
- VBScriptのAnd、Orには気をつけろ〜Java慣れ開発者のとんだ落とし穴
- ショートサーキットがないという話。ショートサーキットによらないが、関数の戻り値で条件分岐するような場合はその関数が副作用を引き起こさないように設計するのは基本だな
- On Error Resume Next は、途中で解除することはできないのでしょうか?
- VBScriptのコンストラクターとVBScriptのデストラクター
- デストラクタが呼ばれるタイミングを知りたかったので勉強になった
- Run メソッド
- 外部の実行形式ファイルを実行するのに必要
- 引数付コンストラクターを記述する。
- コンストラクタに引数を与えられないのは言語仕様らしい。だが、上記記事では回避する方法を提案している
- アプリケーション固有定数の定義をスクリプト内から参照する
- Word 2000 constants
- wsfファイルではなくvbsからWord固有の定数を参照したい場合に参考になる
- 条件に一致する複数のオートシェイプを選択する
- セルの操作(セル範囲の取得)
- CurrentRegionとキーボードショートカットCTRL+SHIFT+*との関連を知ることが出来た
- Visio オブジェクト モデルの概要
- まずはここからか
- 3.COMオブジェクトの操作(1)
- 中盤にCreateObjectの第2引数の話が出ている。イベントドリブンでプログラムを組む際に参考になる。
- InternetExplorer Object
- IEオブジェクトの情報満載
- Windows Scripting Host 7
- IEのオートパイロットで役に立つ情報がたくさんある
- ブラウザのビジー状態を判定するための,より良い方法
- WebBrowser Control, MSHTMLのイベント発火とJS側の状態
- IE コンポーネントにおけるイベントの発生順序
- 7.5 ページを書き込む
- IE 画面を、スクリプトで操作する
- VBScriptで起動したIEのボタン押下を知る(Part2)
- VBScript を使用した簡単なページの例
- こういうふうに使うことを想定して設計された言語なんだろうな、というのが伝わってくる例
- Webページに自動ログインする その2@WSH
- Scripting Guy さん、よろしくお願いします。InputBox を使用してパスワードをマスクすることはできますか。
- vbsで開かれた別ウィンドウを制御したい。
- ボタンの押下等で現れたウィンドウをスクリプトから制御する方法についての質問。サンプルが古いからかOKWaveトップページの構造が変わったからか、提示されいているコードを実行してもエラーとなった。他にないか…
- IE _NewWindow2 別窓で開いたオブジェクトの管理
- NewWindow2の使い方がいまいちわからなかったんだが、こんなふうに使えば新しく開いたウィンドウをスクリプトで制御できるかも知れない。やってみよう
暗号化に必要なものは暗号化/復号化とバイナリファイルの取り扱いのみと思うので、以下に列挙する
- VBScriptで暗号化/復号化する
- VBScript バイナリデータの扱いかた
- Stream オブジェクト
- RSACryptoServiceProvider クラス
- 方法 : キー コンテナに非対称キーを格納する
- 暗号化と復号化のためのキーの生成
- VBScript(HTA)でRSA暗号 SHA256署名付き
- 公開鍵暗号方法で暗号化する
- ライブラリ定数の利用
- WordやExcelなどに定義されている固有の値(1が上書き保存を意味する、など)をスクリプトから使う場合についての記載あり。ライブラリ定数とか列挙型シンボルと表現されている。どちらが正しいのかわからないが、候補が多ければ検索でヒットするかもしれないので良しとする。勉強になった
- VBScriptでテキストを暗号化する(急)
- MS標準ではないが、使いやそう
- VBA Word編
- Word VBA
- 小技集
- VBScript で CSV の読み取り
- ちょっと便利な簡単な使い方のサンプル
- VBScript Scripting Techniques
- ゼロからはじめるWindows Script Host - Excel連携編
- VBScriptで外部からCalcを使う
- MSDN
- VBScript関数を自分で使いやすいように整理したページ
- VBScriptにおけるpushの決定版
- VBScriptにおけるエラー処理
- ワードで画像を自動で挿入する方法
- VBAまとめ@はてブ
- バッチで,画像を生成・加工・一括処理しよう (WSH/JScriptでImageMagickを呼び出す方法)
- Word Selection オブジェクトのメソッド
- 関数をオブジェクトとして扱う方法について触れている
- こちらも関数をオブジェクトとして扱う方法について触れている
- 連続してデータが入っているセル範囲の取得
- データが入っているセルというアバウトなものが選択できるのは嬉しいかも。ただしVBAなのでVBScriptで実現したい場合は検討が必要だろう
- VBA オブジェクトが空かどうか判定する
- System.Collections.ArrayListを使用している例
- .NET Frameworkに依存するが、それも仕方ない
- WSH Lab.掲示板
- 最近も更新されている。まずここか?
- Windows Script Wiki
- ここも必須かもしれない
- 第12回 はやりのデザイン・パターンをVBで
- VBだけど参考になりそうなので
- Attributes プロパティ
- ベクターのサイト
- 無数のスクリプトが置かれている。吉岡 照雄さんすごい
- VBScriptでファイル圧縮(ZIP編)
- vbslib
- よく使う機能をライブラリとしてまとめている。内容は確認できていないものの、すごい
コメントをかく