次の方法で共有


Office Space: Word 文書からハイパーリンクを取得する

Office Space

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

Word 文書からハイパーリンクを取得する

Microsoft のような場所で働くことの喜びの 1 つは、知識を磨く機会に恵まれるということです。ホワイト ペーパー、仕様、提案、ドラフトの章などを読むことを頼まれない日はほとんどありません。ご推察のとおり、このような多くのものを読むときはいつでも、1 つや 2 つくだらないものに必ず遭遇します。実際、自分自身に問いかける機会が何度かありました。"ペーパーはすばらしいとは言えない。しかし、多くの便利な参考資料が散らばっているのも確かだ。ハイパーリンクを抽出して、文書の残りを破棄する方法がありさえすればいいのに。"

しかし残念ながらそのような方法はありません。何だって。Microsoft Word オブジェクト モデルには、Hyperlinks コレクションと呼ばれるものがあり、そのコレクションには文書内のハイパーリンクがすべて含まれている。これらすべてのハイパーリンクを抽出するスクリプトが書ける。そしてハイパーリンクを取得して、それらを Internet Explorer のお気に入りに追加するか、HTML ページとして保存できると、そう言ってるんですか。

すばらしい。私たちもそう考えればよかったのに。

皆さんが正しいことがわかりました。Word 文書からハイパーリンクすべてを抽出するスクリプトを書くことができます。実際、まさしくそのことをやってくれるスクリプトがここにあります。

Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Set objDoc = objWord.Documents.Open("c:\scripts\test.doc")

Set colHyperlinks = objDoc.Hyperlinks

For Each objHyperlink in colHyperlinks
    Wscript.Echo objHyperlink.Address
    Wscript.Echo objHyperlink.TextToDisplay
Next

そうです。このスクリプトは、非常に便利な上に驚くほど単純です。まず Word.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します (これにより、画面上に Word がポップアップするため、スクリプトがしっかり動作しているという確証が得られます)。その時、Open メソッドを使用して、文書 C:\Scripts\Test.doc を開きます。

後は簡単です。Hyperlinks プロパティを使用して、文書内にあるハイパーリンクすべてのコレクションを返します。これらのハイパーリンクは、colHyperlinks という名前の変数に格納されます。次に For Each ループを設定し、コレクションのすべてのハイパーリンクをループします。ハイパーリンクごとに、2 つのプロパティの値をエコーします。

  • Address は、ハイパーリンクの URL です。

  • TextToDisplay は、実際にクリックするテキストです。

たとえば、次のようなリンクがあるとします。リンクは、Script Center ホームページ (https://www.microsoft.com/japan/technet/scriptcenter/default.mspx) にジャンプします。

Script Center

これが Test.doc にある唯一のハイパーリンクである場合は、スクリプトは次のような出力を返します。

https://www.microsoft.com/japan/technet/scriptcenter/default.mspx
Script Center

かっこいい。

しかし、そのとおりですね。実際はそれほどでもないですね。コマンド ウィンドウやメッセージ ボックスで URL をエコー バックできるのはかっこいいことです。しかし残念ながら、コマンド ウィンドウでハイパーリンクをクリックしその Web ページにジャンプすることはできません (努力しましたけど)。本当にすばらしいと言えるのは、これらの URL を Internet のお気に入りフォルダや HTML 文書に追加できることです。Scripting Guys と "かっこいい" は、事実上同義語なので (実質的な意味において言ったんです)、本当に何かかっこいいことをやって、これらの URL を Internet のお気に入りに追加しましょう。

Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Set objDoc = objWord.Documents.Open("c:\scripts\test.doc")

Set colHyperlinks = objDoc.Hyperlinks

For Each objHyperlink in colHyperlinks
    objHyperlink.AddToFavorites
Next

これはかっこいいと言ったのですよ。難しいなんて言っていません。おわかりように、以前と同じスクリプトをほとんど使用しました。唯一の違いは、各ハイパーリンクのプロパティをエコー バックしなかったことです。その代わり、単純に AddToFavorites メソッドを呼び出し、Word によって各ハイパーリンクが Internet のお気に入りに追加されるようにしました (実際には、ご自分で試して確認してみてください)。AddToFavorites メソッドにパラメータを渡す必要さえありません。すべての作業をやってくれます)。

もちろん、AddToFavorites が、思ったとおりに動作するとは限らないということも意味しています。たとえば、このメソッドをテストする際、文書には次のハイパーリンク (https://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/default.mspx へのリンク) がありました。

Hey, Scripting Guy!

これが Internet のお気に入りに追加されると、次のようになります。

Default.mspx (www.microsoft.com)

リンクは正しく動作しましたが、予期していたものと異なる名前がありました。

もちろん、すべてのハイパーリンクを Internet のお気に入りに自動的に追加させたいと思っていないかもしれません。しかし大丈夫です。これらのリンクがすべて含まれている HTML ページを作成するのは簡単です。特定のページを開いて、リンクをクリックするだけです。たとえば、C:\Scripts\Links.htm という名前のファイルを作成するスクリプトがあります。スクリプトは、Word 文書からすべてのハイパーリンクを取り込み、HTML タグを使用して対応するリンクを Links.htm に作成します。

Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Set objDoc = objWord.Documents.Open("c:\scripts\test.doc")

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("c:\scripts\links.htm")

Set colHyperlinks = objDoc.Hyperlinks
For Each objHyperlink in colHyperlinks
    objFile.WriteLine "<a href=" & chr(34) & objHyperlink.Address & Chr(34) & ">" & _
        objHyperlink.TextToDisplay & "</a href><br>"
Next

objFile.Close

今日は HTML タグについてはお話しません。このコラムの対象から少し離れてしまいますから。ただし、MSDN の「HTML and DHTML Reference」(英語) で詳細を確認することができます。そうこうしているうちに、完成品が次のようになりました。

Internet Explorer

ほら。かっこいいでしょ、これは。