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

Office Space

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

*

Microsoft Word を使用して文書を印刷する

約 60 年前、世界初のコンピュータとして広く認められている ENIAC で、初めて一連の計算が実行されました (不思議に思っている皆さん、ENIAC はもともと陸軍で大砲の射表の計算に役立てるために開発されました)。その歴史的瞬間に表示されたメッセージは正確にはわかりません。最も妥当な予想は、"中止しますか、再試行しますか" といったものです。しかし、"ペーパーレス オフィスの世界へようこそ" という言葉が聞かれるまでにそれほど時間がかからなかったことは間違いありません。

つまり、ENIAC の時代からずっと、人々はペーパーレス オフィスの出現を宣言してきたということです。それでも、紙と印刷がなくなるといううわさは、Mark Twain が亡くなったといううわさと同様に、ひどく誇張されてきました。

はい、何でしょう。Mark Twain は亡くなってしまったのですか。そうですか。もっと新聞を読む必要がありますね。Mark については残念ですが、周りに積み重なったプリントアウトの山を眺めれば、はっきりと、紙と印刷がなくなるといううわさがひどく誇張されてきたと言うことができます。印刷は今でも日常業務の大切な一部分です。そして、いつものように Microsoft Word が役立ちます。

おそらくもう、簡単なスクリプトを使えば Microsoft Word の現在の文書を印刷できることに気付かれたでしょう。これを行うには、次のように PrintOut メソッドを呼び出すだけで済みます。他に手の込んだことをする必要はありません。

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

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

objWord.Quit

しかし、おそらくご存じないと思いますが、スクリプトで Word を使って "開いていない" 文書を印刷することもできるのです。さらに、文書内の選択したページだけを印刷することもできます。たとえば、2 〜 5 ページ目だけを印刷するように指定できます。そして、話はここからです。Word のユーザー インターフェイスで使えるすべての印刷オプションをスクリプトでも使えるのです。印刷オプションをすべて紹介する時間はないので、ここではシステム管理者が最も興味を持ちそうなオプションだけをいくつか紹介します。しかし、Microsoft Word を使った文書の印刷についてさらに深く知りたい場合は、MSDN の Microsoft Word VBA ランゲージ リファレンスを熟読すれば、オプションの完全な情報が手に入ります。

結局のところ、Microsoft Word で "手の込んだ" 印刷を行うための極意は、PrintOut メソッドに追加のパラメータを渡すことです。パラメータを渡さずに (先ほど紹介したサンプル スクリプトのように) 単純に PrintOut メソッドを呼び出すと、現在の文書が印刷されます。しかし、次のように一見奇妙なパラメータ セットを PrintOut に渡すとします。

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

objWord.PrintOut ,,,,,,,,,,,,"c:\scripts\test.doc"

objWord.Quit

何が起こるでしょうか。この場合、C:\Scripts\Test.doc という文書が印刷されます。これは、Test.doc を開いていない場合でも同様です。文書の印刷だけが目的であれば、その文書を開いたり閉じたりするためのコードを追加する必要はありません。単純に PrintOut メソッドを呼び出して、適切なパラメータを渡してください。

その質問を受けるような気がしていました。このスクリプトがどうやって動作するか、ですね。まず Word.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。これにより、Word のインスタンスが実行され、画面上に表示されます (これは何が起こっているのかを見るためだけの操作であり、このスクリプトを動作させるために、必ずしも Word を表示する必要はないことに注意してください)。

その後、次のコードを使って Word のインスタンスに新しい空白の文書を追加します。

Set objDoc = objWord.Documents.Add()

これは無駄な操作であるように見えるかもしれません。なぜ印刷対象ではない新しい文書を追加するのでしょうか。無駄であるかどうかにかかわらず、この操作は必要です。このコードがなければ、次のようなエラーが表示されます。

Microsoft Word


実際に使うかどうかにかかわらず、文書をアプリケーションに読み込むと、この問題は解決します。

今からいいものを紹介します。実際に文書を印刷する次のようなコードです。

objWord.PrintOut ,,,,,,,,,,,,"c:\scripts\test.doc"

コンマの連続は何を意味するのでしょうか。PrintOut メソッドでは、(他のメソッドと同様に) パラメータを順番に渡す必要があります。これを行わないと、実行したい操作をメソッドが認識できません。現在開いていないファイルを印刷したい場合は、FileName パラメータを PrintOut メソッドに渡す 13 番目のパラメータに指定する必要があります。これが、パス c:\scripts\test.doc の前に 12 個のコンマがある理由です。確かにそれら 12 個のパラメータは設定しませんが、プレースホルダを置かないと FileName が 13 番目のパラメータにならないため、スクリプトが失敗します。コンマをプレースホルダとして挿入すれば、準備完了です。

さて、これは確かに見事です。それほど多くのコードを記述しなくても文書を印刷できます。また、Test.doc を開いたり閉じたりする必要はないので、スクリプトの実行速度はおそらくほんの少し上がります。しかし、現実的に考えましょう。印刷する文書が 1 つだけでは、時間はほとんど節約されません。この方法が "本当に" 役立つのは、たくさんの文書を印刷するときです。結局、時間の節約を実感し始めるのは、印刷する文書が 15 個または 20 個になったときです。また、コードが少なくなれば、間違いが起こる可能性も低くなります。

たとえば、次のスクリプトでは、C:\Scripts フォルダにあるすべてのファイルを返してから、各ファイルが Word 文書であるかどうか (つまり、ファイルの拡張子が .doc であるかどうか) をチェックします。Word 文書が検出された場合、その文書を印刷します。

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

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set FileList = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='c:\Scripts'} Where " _
        & "ResultClass = CIM_DataFile")

For Each objFile In FileList
    If objFile.Extension = "doc" Then
        objWord.PrintOut ,,,,,,,,,,,,objFile.Name
    End If
Next

objWord.Quit

ご覧のとおり、ASSOCIATORS OF クエリを使って、C:\Scripts フォルダにあるすべてのファイル (CIM_DataFile クラスのインスタンス) を返しています。返されたコレクションの内容を 1 つずつ処理するために、For Each ループを設定します。このループ内では、次のコードを使って Word 文書であるかどうかをチェックします。

If objFile.Extension = "doc" Then

Word 文書の場合は、次のコードを使ってそのファイルを印刷します。今回は、13 番目のパラメータとして (偶然にもファイル パスと同じ) Name プロパティを渡します。

objWord.PrintOut ,,,,,,,,,,,,objFile.Name

その後、ループの先頭に戻り、コレクションの次のファイルを印刷します。

おっしゃるとおりです。皆さんは、このような操作が可能なことを長年知らずに生きてきたのです。

しかし、この他にもまだ可能な操作があります。既に説明したように、文書内の特定のページ (およびそれらのページだけ) を印刷することもできます。これを行うには、PrintOut メソッドに渡す 9 番目のパラメータ (Pages) に対処する必要があります。たとえば、C:\Scrips\Test.doc という文書の 2 ページ目だけを印刷したいとします。次のコードをご覧ください。

objWord.PrintOut ,,,,,,,,"2",,,,"c:\scripts\test.doc"

注 : そうです。2 は数字ですが、二重引用符で囲む必要があります。理由はすぐにわかります。

2、4、および 6 ページ目を印刷したいとします。その場合、次のようにパラメータに 3 つのページ番号をすべて含め、それぞれをコンマで区切ります。

objWord.PrintOut ,,,,,,,,"2,4,6",,,,"c:\scripts\test.doc"

これが、ページ番号を二重引用符で囲んだ理由です。二重引用符で囲むと、複数のページを印刷するように指定できます。二重引用符で囲まずにページ番号を指定しようとすると、コードは次のようになります。

objWord.PrintOut ,,,,,,,,2,4,6,,,,"c:\scripts\test.doc"

だめでしょうか。当然だめですね。パラメータを数えてみてください。c:\scripts\test.doc が 13 番目のパラメータではなくなっています。これではスクリプトを実行しても Test.doc は印刷されません。以上です。ページ番号は二重引用符で囲んでくださいね。

はい、何でしょう。"5 〜 10 ページなど、ページ範囲を指定するにはどうするか" ですね。お答えしましょう。

objWord.PrintOut ,,,,,,,,"5-10",,,,"c:\scripts\test.doc"

結構いけるでしょう。もう 1 つ役に立つパラメータがあります。それは Copies です。文書のコピーが 10 部必要だとします。問題はありません。次のように、単純にコピーの数を 8 番目のパラメータとして指定します (この場合、二重引用符は不要です)。

objWord.PrintOut ,,,,,,,10,,,,,"c:\scripts\test.doc"

ええ、この記事を読むまでは、せっせと 1 つずつファイルを開き、[印刷] ボタンをクリックして文書を印刷していたなんて信じられませんね。朗報です。そんな退屈でつまらない日々はとうの昔に過ぎ去りました。60 年前の人々が、いつか Word 文書のコピーを 10 部印刷するスクリプトを記述できる日が来ることを知っていたら、"ペーパーレス オフィス" という言葉も生まれなかったでしょう。


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