Word用のOfficeアドインで使われるプログラミング言語は、Word JavaScript API と呼ばれているようです。このブログでもひとまずは、この呼び方にしてみます。
所定の文字列にジャンプしたり、所定の表現を別の表現に書き換えたりと、検索と置換を自動化すると何かと便利なことが多いです。
Officeアドインでも同じようなことができないか調べてみました。Wordの[検索と置換]ダイアログボックス(Wordマクロでいうと、Findメソッド)とは異なる挙動をすることがわかりました。
Officeアドインでの検索の仕組み
Officeアドインでは検索した文字列をコレクションとして取得します。なので、このコレクションの各要素に対して処理を実行するという手順となります。
以下のページには、検索でヒットした文字書式(蛍光ペン、太字、文字色)を変更するサンプルコードがいくつか掲載されています。検索オプションも使えます。
検索オプションを使用して Word アドインでテキストを検索する(外部リンク)
上記のページにも書かれているとおりワイルドカードを使えますので、WordやWordマクロでワイルドカードを使っていれば同じようなことができそうです。
検索できる最大文字数
検索可能な最大文字数は256文字でした。Wordの[検索と置換]ダイアログボックスだと255文字が最大なのでほぼ同じです。
日本語と英語とを組み合わせると256文字までいかなくても検索ができなくなるようです。これはWordの[検索と置換]ダイアログボックスの挙動と同じです。注意が必要ですね。
キーワードにジャンプしたい!
まずは、特定の文字列(キーワード)にジャンプするコードを書いてみます。このままでは何のために使うのかわからないサンプルコードですが、基本形ということで紹介します。
今回のサンプルコードでは検索オプションを用いず、単に文字列を検索することにします。
(実行前)
カーソルは文書の任意の位置に置いておいてかまいません。赤矢印の位置にカーソルがあります。この状態で「オンライン」というキーワードを検索します。
(実行後)
文書の先頭から数えて最初にヒットしたキーワードにカーソルがジャンプしました。
Word JavaScript API の解説
検索結果のコレクション(searchResults)を取得して、その1番最初の要素(getFirst())を選択する(select())という操作をします。
このときに使っている context.document.body というオブジェクトは、Wordのストーリーでいう「メイン テキスト ストーリー」に対応します。Word VBAでは以下の記述になります。
- ActiveDocument.Range
- ActiveDocument.Content
- ActiveDocument.StoryRanges(wdMainTextStory)
(参考:【Word】ストーリー種別とは?)
そのため、ヘッダーやフッター、テキストボックスなどに書かれたキーワードは検索対象外ということになります。このあたりの仕組みはWord VBAと同じですね。
処理を実行するためのおまじないとして、最後に return context.sync(); を記述します。
Word JavaScript API
function SearchKeyword(){ Word.run(function (context) { // キーワードを検索(オプションの指定なし) var searchResults = context.document.body.search('オンライン'); // 最初の検索箇所を選択 searchResults.getFirst().select(); // 処理の実行 return context.sync(); }); }