
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
"1,000 の言葉も 1 枚の絵にはかなわない" という常套句があったとしても、それは違います。どうしてそんなことがわかるのでしょうか。それは、学生のころ 5,000 ワードの論文を書く宿題が出されたことがあります。ですから、論文の代わりに 5 つの図を配置した文書を提出しました。いいですか。"1,000 の言葉も 1 枚の絵にはかなわない" では決してありません。
もちろん、"1,000 の言葉も 1 枚の絵にはかなわない" は真実ではないとしても、図はレポートに彩りを添えてくれます。少なくとも、スクリプトを使ってレポートを生成する場合は常にロゴを追加したいと思うかもしれませんね。でも、スクリプトを使って Word 文書に図を追加することはできるでしょうか。
ええ、皆さんはこれが便宜上の質問で、答えはいつもどおり "できる" だと思われていることでしょう。でも、本当のことを言うと、しばらくの間この答えは "できない" になると考えていました。これは、「Microsoft Word VBA Language Reference」(英語) をちょっと見た感じでは、Word 文書に図を追加するには Shape オブジェクトと AddPicture メソッドを使うことになりそうだったからです。これはもっともなので、次のスクリプトを試してみました。
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
objSelection.TypeText "Here is a sentence preceding the picture."
objSelection.TypeParagraph()
Set colShapes = objDoc.Shapes
Set objShape = colShapes.AddPicture("C:\Scripts\Chart.gif")
objSelection.TypeParagraph()
objSelection.TypeText "Here is a sentence following the picture."
objSelection.TypeParagraph()
そして、次が実際にこのスクリプトを実行した結果です。

評価できる点は、図が実際に表示されたことです。問題は、これがテキストの上に重なってしまっていることです (このスクリプトを実行して、図だけを削除すると、その下にテキストが現れます)。しかし、この問題な動作が有用となる場面を思いつけるでしょうか。テキストを素敵な図の下に隠すことは、望んでいる効果であるとは言えません。
その後、長い時間をかけて、フラストレーションを募らせながら、まったく成果が得られないまま、図がテキストの上に重なってしまうのではなく、行間に表示されるようにする方法を模索しました。ああ、こんな模索を開始する前に、inline (行間) という文字を置いてさえいればよかったのです。結局、Shape オブジェクトは、どんなオブジェクトの上にも配置されるようになっているのです (技術的に説明すると、Shape オブジェクトは、テキスト層とは別の描画層上に作成されるのです)。Shape オブジェクトを挿入し、テキストに重ならないように、これを適切に配置する何らかの方法があることは確信しています。しかし、InlineShape オブジェクトを使って、図をテキストの行間に挿入する方がよほどよいと思います。
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
objSelection.TypeText "Here is a sentence preceding the picture."
objSelection.TypeParagraph()
Set objShape = objSelection.InlineShapes.AddPicture("C:\Scripts\Chart.gif")
objSelection.TypeParagraph()
objSelection.TypeText "Here is a sentence following the picture."
objSelection.TypeParagraph()
このスクリプトを実行した結果、文書は次のようになります。

ちょっと良くなりましたね。
スクリプトを見ながら、どのように機能するのか説明します。まず、Word.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定しています。これで、画面上に表示される Word のインスタンスが実行されます。Add メソッドを使用して空白の文書を作成し、次のコード行を使用して Word の Selection オブジェクトのインスタンスを作成します。
Set objSelection = objWord.Selection
ここまでは、理解できましたか。次に、文と段落改行を入力しています。これは、図の前に配置される短いテキストを作成するためのものです。したがって、次はいよいよ図を挿入します。この処理は、次のような 1 行のコードだけで実行できます。
Set objShape = objSelection.InlineShapes.AddPicture("C:\Scripts\Chart.gif")
見てわかるように、Shapes コレクションではなく、InlineShapes コレクションを参照してから、AddPicture メソッドを呼び出して AddPicture に挿入する図のファイルのパスを渡しています。これだけでいいのです。その後、段落改行と追加のテキストを入力しています。これは、実際に図が他のオブジェクトの上ではなく、行間に配置されていることを証明するためのものです。
ええ、かなり良くなりました。Scripting Guys が、使えないスクリプトをむやみに作成する前に、きちんとした資料の読み方を勉強できるレッスンはないものでしょうか。皆さんもそう思いますよね。でも...
ところで、図を挿入する段階で、この図 (objShape) へのオブジェクト参照を作成していることにもお気付きになっているかもしれません。これは必要でしょうか。必ずしもそうとは言えませんが、これにより、後で図の書式設定がしやすくなります。たとえば、図の周りに罫線を付けるようにスクリプトを変更してみましょう。
Const wdLineStyleSingle = 1
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
objSelection.TypeText "Here is a sentence preceding the picture."
objSelection.TypeParagraph()
Set objShape = objSelection.InlineShapes.AddPicture("C:\Scripts\Chart.gif")
objShape.Borders.OutsideLineStyle = wdLineStyleSingle
objSelection.TypeParagraph()
objSelection.TypeText "Here is a sentence following the picture."
objSelection.TypeParagraph()
前回のスクリプトと同じですが、2 つの処理を追加しています。まず、スクリプトの最初で wdLineStyleSingle という定数を定義し、値を 1 に設定しています。これにより、罫線の描画に使用する線種を Word に指示しています。また、図の OutsideLineStyle を構成する次のコードを使用しています。
objShape.Borders.OutsideLineStyle = wdLineStyleSingle
ああ、そうでした。その他に段落改行も二、三追加しています。図とテキストの間を少し広げるためです。
結果はどのようになるでしょうか。次のような素晴らしい文書が作成されます。

たしかに、1,000 の言葉にかなうほどではありませんね。でも、700 〜 800 の言葉ぐらいにはなるのではないでしょうか。