
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。Word 文書で書式設定されているテキストを検索して、そのテキストに HTML タグを適用する方法はありますか。
-- ES

ES さん、こんにちは。あなたがこのような質問をする必要があるなんて妙ですね。というのも、昨晩、食事中に、このコラムを執筆している Scripting Guy は、ついに息子と "例の話" をしました。Scripting Guy の息子は、食事を始めるや否や、突然「お父さん、僕も 17 歳なんだから、大人の仲間入りをする前に知っておくべきことがあるのではないか」と言いました。
言うまでもないことですが、これは父親であれば、だれでも恐れている言葉です。けれども、父親の責任は果たさなければなりません。「では、息子よ。いったい何について知る必要があるのかい」と Scripting Guy は息子に問いました。
「僕が知る必要があるのは、Word 文書で書式設定されているテキストを検索して、そのテキストに HTML タグを適用する方法だよ」と息子は答えました。
既に触れたように、Microsoft Word のスクリプト操作について子供に説明することを喜んで受け入れる親はいないでしょう (少なくとも、そのような父親はいないと思います)。正直なところ、このようなことを自分の子供に説明するのは、いささか気恥ずかしいものです。とはいっても、親の役目は、息子の野球の試合を観戦することだけではありません (しかし、このコラムを執筆している Scripting Guy は、自分が親になる前に、このことをだれかが教えてくれれば良かったのに、と思っています)。ぎこちなくではありますが、このコラムを執筆している Scripting Guy は、腰を据えて、息子に Word 文書で書式設定されているテキストを検索して、そのテキストに HTML タグを適用する方法について根気よく説明しました (Microsoft Word の検索スクリプトは、システム管理のスクリプトを愛してやまない人のみが記述するべきだという点は指摘しましたが、なるべく説教じみた説明にならないように最善の努力をしました。ご指摘のとおり、ちょっとしたスクリプトやお楽しみのスクリプトを記述するのは楽しい作業のように見えるかもしれません。しかし、スクリプトの作成に苦悩することは往々にしてあります。それについての Scripting Guy のアドバイスはというと、「まず結婚してから、Word 文書の書式設定されているテキストを検索して、そのテキストに HTML タグを適用しなさい」というものでした)。
まだ自分の子供と "例の話" を交わしたことがない方のために、Scripting Guy が息子に説明したときのトランスクリプトをご提供しましょう。まずは、スクリプト自体です。
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")
Set objSelection = objWord.Selection
objSelection.Find.Forward = True
objSelection.Find.Format = True
objSelection.Find.Font.Bold = True
Do While True
objSelection.Find.Execute
If objSelection.Find.Found Then
objSelection.Text = "<b>" & objSelection.Text & "</b>"
Else
Exit Do
End If
Loop
では、Microsoft Word 文書でテキストを検索するという奇跡がどのように起こるかを説明しよう。わかっていると思うが、まず、Word.Application オブジェクトのインスタンスを作成し、Visible プロパティの値を True に設定している。これで、Microsoft Word のインスタンスが実行され、画面上に表示されるようになるんだよ。それから、Open メソッドを使用して C:\Scripts\Test.doc ファイルを開いたら、次のコード行を使用して、Word の Selection オブジェクトを作成するんだ (ちなみに、このオブジェクトの既定のカーソル位置は文書の先頭だということも補足しておこう)。
Set objSelection = objWord.Selection
それはいったいどういうこと? まだ、終わらないの? いや、まだ終わらないが、目標に向かって着実に進んでいるよ。次は、Find オブジェクトの 3 つの重要なプロパティを定義する必要がある (ちなみに、このオブジェクトは、Selection オブジェクトの子オブジェクトだということを補足しておこう)。具体的に必要なプロパティを説明しよう。
| • | Forward プロパティは True に設定する。この設定は、スクリプトに対して、文書内を下に向かって検索することを指示するもので、ここでは文書の先頭から検索を始めるから、カーソルが文書の先頭にあることから判断が付くことだが、ファイル全体を検索することになるんだ。 |
| • | Format プロパティは True に設定する。この設定は、スクリプトに対して、特定の文字列値ではなく、書式を検索することを指示するためのものだよ。 |
| • | Font.Bold プロパティは True に設定する。この設定は、スクリプトに対して・・・。おや、ご名答だな。この設定は、スクリプトに対して、太字のテキストを検索することを指示するためのものだよ。もしかまわなければ、1 つ聞きたいのだが、だれがお前に Font.Bold プロパティについて教えてくれたんだ? あと、可能なら、私に Font.Bold についてアドバイスもらえるとありがたいのだが。 |
これらの 3 つのプロパティの値を構成したら、無制限に実行する Do While ループを設定するんだ。つまり、とにかく、True が True である限り実行するようにデザインされたループだ。だから、実際には、ループが無限に実行すると言い切れないんだ。最近、米国の政治は、その機能を果たしているようだが、True (真実) が True (真実) と見なされなくなるのは時間の問題だ。しかしそれについては別の日に説明しましょう。
まず、このループでは、Execute メソッドを呼び出しているが、このメソッドは、スクリプトに対して、文書の検索を開始し、2 つの事象が発生するまで検索を続行するように指示を出している。1 つは指定のテキスト (太字のテキスト) のインスタンスが検出されるという事象、もう 1 つは文書の最後に到達したという事象だ。
理解できているかい。それは良かった。では、今度は、太字のテキストが検出された場合の説明をしよう。この場合、Find オブジェクトの Found プロパティの値が True に設定されるのだが、これについては、次のコード行で確認できる。
If objSelection.Find.Found Then
太字のテキストを検出した場合は、その値の先頭に <b> という HTML タグを追加して、その値の末尾には </b> というタグを追加する必要がある。その処理を行っているのが、次のコード行だ。
objSelection.Text = "<b>" & objSelection.Text & "</b>"
この処理は非常にわかりやすいものだと思わないかい。専門的な用語を使用して説明すると、ここでは単に Selection オブジェクトの Text プロパティの値を、検出されたテキストの現在の値に HTML タグを追加した値で置換しているだけだよ (ちなみに、この Text プロパティの値は、太字のテキストで、検索を実行すると、検出されたアイテムが自動的に選択されることを補足しておこう)。それはどういうことかというと、次のようなテキストが
太字のテキスト
次のような状態になることだ。
<b>太字のテキスト</b>
「その後は、単純にループ処理の先頭に戻り、Execute メソッドを呼び出し、検索対象テキストの次のインスタンスを検出するんだ。検索対象テキストの次のインスタンスがない場合 (つまり、それ以上太字のテキストがない場合) はどうなるかというと、Found プロパティの値が True ではなくなるんだ。その場合は、Exit Do ステートメントを呼び出して、それほど永久的ではないループを抜けるんだ。
これで、大人の仲間入りをする前の青年に必要な Word 文書で書式設定されているテキストを検索して、検出したテキストの前後に HTML タグを追加する方法の基礎知識の説明はおしまいだよ。
ES さん、これでうまくいくでしょう。偶発的であったにしても、このコラムを執筆している Scripting Guy は、あなたからの質問に直接お答えするのではなく、息子に教えたときのトランスクリプトを提示したことをお詫びします。正直なところ、このコラムを執筆している Scripting Guy は、この質問にお答えするのに、気恥ずかしさを感じました。特に、こんなに大勢の読者がいますからね。もちろん、わかっています。Word 文書で書式設定されているテキストを検索して、そのテキストに HTML タグを適用するのは、日常の営みの一環ですので、恥ずかしがることなど何もありません。中には「すてきな」と形容することを主張する人もいるくらいですし。それはさておき、このコラムを執筆している Scriptping Guy は、このコラムで取り上げることができない話題を抱えています。
念のため補足しておきますが、システム管理のスクリプト以外の話題ですよ。