Office Space: Microsoft Office アプリケーションのスクリプト作成に関するヒントとテクニック

Office Space

Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

*

Microsoft Word のスペル チェックを使用する

間違いなく皆さんの多くがぼんやりと座って次のように考えているでしょう。「どうして Scripting Guys は、国中の建物や地下鉄の車両なんかの何もかかれていない場所に "スクリプトのルール!" や "WMI ロック!" などと手当たりしだいスプレーで落書きして回らないのだろう。これはどういうことだろう」

的を射た質問ですね。実は、これを実行していない理由はいくつかあります。1 つは、Scripting Guys はあえて事を起こさなくても十分問題に巻き込まれる傾向にあります。わざわざ出かけていって、人々の反感を買うようにする必要はほとんどありません。別の理由としては、国中の空いている壁に "スクリプトのルール!" とスプレーで落書きするのは大変な作業に思えるからです。おや、"Scripting Guys" と "作業" という言葉が同じ文で最後に使われていたのはいつのことでしょうか。

そうですね、この 2 つの言葉が「していたことは 1 度もないようだ」という句と合わせて使われている場合を除いては、過去にその例はありません。

2 つとももっともな理由ですが、いたるところにスプレーで落書きをしないより大きな理由としては、スプレーの缶にはスペル チェック機能が組み込まれていないことです。

そうです。現在は多くの人がそうであるように、控えめに言って Scripting Guys のスペル能力も少し低下してきています。「occurrence」と「occurrance」と「occurence」のうちどれが正しいつづりなのかわかりません。「ocassion」と「occasion」ではどちらが正しいのでしょう。ああ、もうどっちでもいいじゃないですか。スペル チェックが代わりに判断してくれますから。

そのとおりです。スペル チェックが代わりに判断してくれます。もちろん、スペル チェック機能が実装されていればの話ですが。残念ながら、スペル チェックはすべてのアプリケーションに実装されているわけではありません。たとえば、Scripting Guys の一人がメモ帳を使ってスクリプトの全コードを入力したとしても、メモ帳にはスペル チェック機能がありません。なぜ彼のスクリプトによって作成されたすべてのメッセージ ボックスが 3 〜 4 文字を超える語を入れずに素っ気なく書かれているのかを考えたことがありますか。これでおわかりですね。

もちろん、この問題の解決策の 1 つは、この Scripting Guys が正しいスペルを学習することです。でも、これはかなり古いやり方に思えます。ですから、この問題の解決策として別の方法を思いつきました。Microsoft Word のスペル チェック機能を利用して、独自のカスタム スペル チェック アプリケーションを作成するのです。

このことからわかるように、Word のほとんどの機能と同様にスペル チェック機能もスクリプトから利用することができます。では、まず、ある語のスペルが正しいかどうかを報告する基本的なスクリプトから見ていきましょう (スペルミスのつづりは「misspelled」でしたっけ。それとも「mispelled」?)。このスクリプトの動作を説明し、その後で少し手を加えて使えるものにしていきます。

基本となるスクリプトは次のとおりです。

Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add()

If objWord.CheckSpelling("mispelled") Then
    Wscript.Echo "The word is spelled correctly."
Else
    Set colSuggestions = objWord.GetSpellingSuggestions("mispelled")
    For Each strSuggestion in colSuggestions
        Wscript.Echo strSuggestion
    Next 
End If

objWord.Quit

まず、Word.Application オブジェクトのインスタンスを作成し、Add() メソッドを追加して新しい空白の文書を作成しています。このスクリプトでは Visible プロパティを True に設定していないことにお気付きになったかもしれません。これは、このスクリプトでは、Word を不可視のウィンドウで開き、画面上に表示しないようにするためです。

次に、以下のコードを使って "mispelled" という語のスペルが正しいかどうかを判断します。

If objWord.CheckSpelling("mispelled") Then

このコードでは、CheckSpelling メソッドを呼び出して、パラメータを 1 つ渡しています。このパラメータは、検証対象となる語です。CheckSpelling は、結果としてブール値を返します。つまり、スペルが正しい場合は True を、正しくない場合は False を返します。CheckSpelling から True が返された場合は、語のスペルが正しいことを示すメッセージを表示し、Quit メソッドを呼び出して Microsoft Word の不可視のインスタンスを終了します。この時点で、このスクリプトはスムーズに終了します。

でも、CheckSpelling から False が返された場合はどうなるでしょうか。よくご存知のとおり、通常、ある語のスペルを間違えた場合、Microsoft Word は正しいと思われるスペルの候補を提示します。たとえば、Word に「rin」と入力して、このスペルの正しくない語を右クリックすると、次のような代わりのスペル候補の一覧が表示されます。

スペル チェック


そう、そのとおりですね。スクリプトでもこのスペル候補を提示することができます。実際、問題の語のスペルを間違えたときに、この操作を行っています。

Set colSuggestions = objWord.GetSpellingSuggestions("mispelled")
For Each strSuggestion in colSuggestions
    Wscript.Echo strSuggestion
Next

このコードでは、GetSpellingSuggestions メソッドを呼び出して、スペルの間違った語を渡しています。GetSpellingSuggestions は、その語の正しいスペルの候補の配列を返します (ただし、ユーザーがどの単語を入力するつもりだったかを Word が判断できないこともあります。その場合は、1 つも候補が見つからず、空の配列が返される可能性があります)。このメソッドを呼び出した後は、単純に返されたスペル候補を 1 つずつ画面に表示しています。このスクリプトを実行すると、次のような結果が得られます。

misspelled

これで、"mispelled" という語のスペルの候補が表示されましたね。素晴らしいスクリプトです。

まあ、それは言い過ぎかもしれません。このスクリプトはたしかに便利ですが、ある語のスペルを確認するたびに、スクリプトを変更する必要があります。結局、値 "mispelled" をハードコーディングしていますから (それだけでなく、このスクリプトでは 2 か所を変更する必要があります。と言っても、"rin" のスペルを確認しているのに、"misspelled" という語が返される理由がわかるまで、3 度もスクリプトを書き換えた Scripting Guy がだれかなんてここでは話しませんけど)。そのうえ、スクリプトを実行するたびに、Word の読み込みにかかる時間のぶん、わずかな遅延が発生します。それを考えると、本当に便利なスクリプトはどのようなものになるでしょうか。スクリプトをコマンド ウィンドウで実行しているところを想像してください。スクリプトが開始すると、Word を読み込み、ユーザーに検証対象の語を入力するように求めます。ユーザーが語を入力すると、スクリプトは入力された語を検証し、またループしてこの次に検証する語を入力するように求めます。これが語が入力されていない状態で Enter キーが押されるまで続き、このようにキーが押された時点でスクリプトは、スクリプト自体と Word のインスタンスを終了します。

そうです、このようなスクリプトを想像するのは難しいですね。では、代わりに次のコードをお見せしましょう。

Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add()

Do While True

WScript.StdOut.Write "Please enter the word to be checked: " 


strInput = WScript.StdIn.ReadLine

If strInput = "" Then
    Exit Do
End If

If objWord.CheckSpelling(strInput) Then
    Wscript.Echo "The word is spelled correctly."
Else
    Set colSuggestions = objWord.GetSpellingSuggestions(strInput)
    For Each strSuggestion in colSuggestions
        Wscript.Echo strSuggestion
    Next 
End If

Wscript.Echo

Loop

objWord.Quit

このスクリプトを試す前に、これはコマンド ウィンドウから CScript を使って実行する必要があることに注意してください。これは、WScript では提供していない StdIn および StdOut を使用するためです。今日のコラムでは StdIn および StdOut については説明しません。これらの動作についてご存知ない場合は、「Microsoft Windows 2000 Scripting Guide」(英語) を参照してください。

ここでは、このちょっとしたカスタムのスペル チェックの実際の画面例をご覧に入れましょう。

スペル チェック


ご覧のように、「rin」という入力に対して、スクリプトからスペルの候補の一覧が返されています。スペルの間違った語を右クリックした場合よりも、スクリプトを使った方が実は表示される候補の数が多いことにも気付かれたかも知れません。これは、語を右クリックした場合に表示する語の数が Word では制限されているためです。スクリプトでは、スペル チェックを実行した場合に実際に返される一連の候補と同じものが表示されるようにしています。

たしかに、2 ドルもあれば小さなペーパーバックの辞書を買って、それでスペルを調べることもできるでしょう。でも、これじゃ面白くないでしょう。それに、Word のスペル チェックを利用できれば、さまざまな可能性を手にすることができます。たとえば、スペル チェックを HTA に追加することができます。これについては、このコラムの範囲外になりますが、十分に可能性があります。スクリプトと Microsoft Word と言えば、可能性は無限です。

さて、ラップトップにコピーして持ち運べるカスタムのスペル チェックを手にした今、何も描かれてない壁や地下鉄の車両に 'ADSI は永遠に!' とスプレーで落書きして回る準備はできたでしょうか。まあ、期待はできませんね。スペルの問題は解決しましたが、面倒くさがりという問題はまったく解決されていませんから。今のところは、スクリプトのコラムを書くぐらいにしておきます。では、さよなうら、また来週お会いしましょう。

おっと、訂正して、さようなら、また来週お会いしましょう。


ページのトップへページのトップへ