
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。LastSavedBy のようなフィールドを含んでいる Word 文書が多数あります。このようなフィールドの現在の値を取得するスクリプトを記述する方法はありますか。
-- OS

OS さん、こんにちは。この間の晩、このコラムを執筆している Scripting Guy がテレビを見ていると、新しいモノポリーのコマーシャルが流れました。モノポリー 電子決済エディションです。このコマーシャルで興味をそそられた (または、考え方によってはいやな気分になった) のは、このバージョンのモノポリーでは、現金が使用されなくなり、代わりに、プレイヤーがデビットカードや ATM のような機械を使用して所持金を管理するという点でした。
ご参考までに、このコラムを執筆している Scripting Guy は、このコマーシャルを見ていやな気分になりました。というのも、人生において、仲間のうちの 1 人が、険しい顔をして手持ちのモノポリーのお金を 1 つ残らず数えて、あなたに支払わなければならない賃借料の 1,000 ドルをなんとかして貯めなければと、必死になっている姿を見ることほど充足感を得られることはほとんどありません (そして、あなたは「そうだ。おまえが持ってる黄色い不動産をくれたら、借りを一切なくしてあげるよ」とゲームの間中言い続けるのです)。デビットカードをカードリーダーに通すだけなんて、少しもおもしろくなさそうです。自分の目の前に現金の山がある状態でゲームをすることほど、すばらしい気分になれることは世界中のどこを探してもないと思います。
次のように言えば・・・。いえ、気にしないでください。Scripting Guys でさえ軽口をたたくべきではない人々がいますから。
時代の動向 : 具体的に言うと、この電子決済エディションのモノポリーでは従来のデビットカードが使用されず、代わりに Visa デビットカードが使用されます。また、プレイヤーのコマが新しくなり、Segway パーソナル トランスポーター (これはすばらしいです。結局のところ、ほとんどの人が実生活で Segway を見ることはないでしょうから)、スペース シャトル、薄型テレビ、野球帽、ハンドバッグに入った犬 (ええ、ハンドバッグです)、Altoids の缶が追加されました。Altoids の缶は、皆で取り合いになること請け合いです。 |
とにかく、このコラムを執筆している Scripting Guy は電子決済エディションで遊ぶつもりはありません。昔ながらのバージョンのほうが断然いいと思っています。また、絶対に Altoids の缶のコマを使うつもりはありません。むしろ、モノポリーをするときはいつもレースカーのコマを使用したいと思います。しかし、レースカーのコマを使いたくない人がいるのでしょうか。レスカーのコマも取り合いになる人気のコマです。
注 : やれやれ。ご想像のとおり、編集者はレースカーのコマを使用したくないそうです。靴のコマの方がいいそうです (そうです、靴です)。彼女が、靴のコマを使用したいというのは、このコマが単にモノポリーで一番つまらないコマだからだと思います。 |
しかし、これはそれほど問題ではありません。どっちにしろ、ゲームをする時間があるほど暇な人はいるのでしょうか。少なくとも私たちにはありません。特に、Microsoft Word 文書からフィールドの値を取得するスクリプトを記述する必要があるときには、そのような時間はありません。
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")
Set colFields = objDoc.Fields
colFields.Update
For Each objField in colFields
Select Case objField.Type
Case 20
Set objRange = objField.Result
strUser = objRange.Text
Wscript.Echo "Last Saved By: " & strUser
End Select
Next
コードを見ながら、このすべてのスクリプトのしくみを説明しましょう。まず、Word.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。これで、Microsoft Word のインスタンスが実行され、画面上に表示されます。その後、次のコード行を使用して C:\Scripts\Test.doc ファイルを開きます。
Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")
随分簡単でしたね。赤ん坊からキャンデーを取り上げるくらい簡単でしたね。
あるいは、仲間とモノポリーで遊ぶようなものですね。
文書を開いたら、次のコード行を使用して文書内のすべてのフィールドのコレクションを取得します。
Set colFields = objDoc.Fields
コレクションを取得したら、Update メソッドを呼び出してこれらの各フィールドを更新します。Update メソッドを呼び出すことによって、文書内の各フィールドの最新の値を取得できます。これはほとんどの人が希望している処理だと思いますが、文書を最後に保存した時点のフィールドの値を取得する必要がある人もいるでしょう。その場合も問題ありません。次のコード行をコメント化する (または削除する) と、スクリプトで文書を開いたときにすべてのフィールドが更新されることはありません。コメント化したコードは次のようになります。
' colFields.Update
次に、フィールドのコレクションをループ処理する For Each ループを設定します。ちなみに、Microsoft Word はフィールドの Type プロパティの値でフィールドの種類を特定します。この Type プロパティには一意の整数値が設定されます。たとえば、LastSavedBy フィールドの Type プロパティの値は 20、Author フィールドの Type プロパティの値は 17 です。このスクリプトでは、Select Case ステートメントを設定して Type プロパティの値を調べ、適切なフィールド名をエコー バックします。ご覧のとおり、この Select Case ステートメントではある特定のフィールドの種類 (Type プロパティの値が 20 の LastSavedBy フィールド) だけを調べます。ただし、Select Case ステートメントを簡単に拡張して、その他のフィールドの種類にも対応するようにすることができます。たとえば、次のコードを追加すると Author フィールドを調べて、その値をエコー バックするようになります。
Select Case objField.Type
Case 17
Set objRange = objField.Result
strUser = objRange.Text
Wscript.Echo "Author: " & strUser
または、次のコード行を使用すると、フィールドの種類を指定せずにすべてのフィールドの値をエコー バックできます。
For Each objField in colFields
Set objRange = objField.Result
Wscript.Echo objRange.Text
Next
それは、皆さんにお任せします。フィールドの Type プロパティの値をエコー バックする必要がない場合もあるでしょう。また、靴のコマを使いたい場合もあるでしょう。まあ、十人十色ということです。
注 : いいところに気が付きましたね。Author フィールドの Type プロパティの値が 17 だということは、どうすればわかるのでしょうか。最も良い方法は MSDN の「Microsoft Word VBA Language Reference」(英語) にアクセスし、wdFieldType 列挙型の説明を参照することです。 |
LastSavedBy フィールド (Type プロパティの値が 20 のフィールド) が見つかったとしましょう。この場合は、次のコード ブロックを実行します。
Set objRange = objField.Result strUser = objRange.Text Wscript.Echo "Last Saved By: " & strUser
少し風変わりですが、フィールドの値をエコー バックするには、まずフィールドの Result プロパティの値 (つまり、フィールドの値) を含んでいる Range オブジェクトを作成する必要があります。次のコード行を使用して、Range オブジェクトを作成します。
Set objRange = objField.Result
Range オブジェクトを作成したら、そのオブジェクトの Text プロパティの値を strUser 変数に代入します。その後、Last Saved By: というメッセージを、文書を最後に保存した人の名前とともにエコー バックします。
Wscript.Echo " Last Saved By: " & strUser
お決まりの台詞ですが、これで完成です。
ご想像のとおり、モノポリー 電子決済エディションのコマーシャルを見たとき、このコラムを執筆している Scripting Guy はすぐに「何のまねだ、ゲームを台なしにする気か」と思いました。興味深いことに、少し調べてみたところ、Parker Brothers がゲームを台なしにしようとしたのはこれが初めてではないことがわかりました。1934 年に、Charles Darrow は新しく考案したゲームを売り込もうとしましたが、Parker Brothers は、遊ぶのに時間が掛かりすぎることとあまりに複雑すぎることを主張し、彼の提案を却下しました。そのため、Darrow は 1 人でこのゲームを手掛けました。そして、ゲームは飛ぶように売れました。言うまでもありませんが、Parker Brothers は彼の提案を再度検討し、1 年後に権利を買い取りました。
モノポリーは、瞬く間に Parker Brothers のゲームの販売記録を塗り替えました。実際、このゲームの売り上げは会社を倒産の危機から救うという功績を立てました。それで、Parker Brothers はどうしたのでしょうか。モノポリーは一時的な流行ですぐに廃れるだろうと考え、1936 年にゲームの製造を中止することにしました。急激に伸びていた売り上げによって考えが変わり、その日以来・・・。その後は皆さんがご存知のとおりです。
注 : まさかと思うでしょうが、このコラムを執筆している Scripting Guy はモノポリーの歴史についての知識は持ち合わせていなく、既に述べたように、このことについて調べる必要がありました。そうです。モノポリーの歴史についての記事を読んで時間を浪費し、それに対して給料をもらうことができるのは、Scripting Guy でいることの特権の 1 つです。でも、調査は調査ですよね。 |