次の方法で共有


Office Space: Word 文書に日付/時刻フィールドを挿入する

Office Space

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

Word 文書に日付/時刻フィールドを挿入する

スクリプトを使う目的は、処理を簡単にすることです。スクリプトを使うことによって処理が難しくなるとしたら、スクリプトを使う意味がありません。 ** こんな理念 (Scripting Guys が推奨している理念です) を持ち出して、今日のコラムのテーマはいったい何だと疑問を抱く読者もいるかもしれません。新しい Word 固有のメソッドで日付/時刻を文書に挿入する方法を学習するのはなぜでしょう。VBScript には、既に Date、Time、および Now 関数があるではありませんか。これらをなぜ使わないのでしょう。処理を簡単にするのではなく、複雑にしようとしているのでしょうか。

必ずしもそうではありません。理由は 2 つあります。まず、VBScript 関数を使うと、結果がおかしくなる場合があります。たとえば、問題なさそうに見える次のスクリプトでは、"型の不一致" エラーが返されます。

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

Set objSelection = objWord.Selection
objSelection.TypeText Now

実を言うと、このエラーが発生する原因は不明ですが、次の方法で回避できます。

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

Set objSelection = objWord.Selection
objSelection.TypeText "" & Now

変更したのは、コードの最後の行です。Now の値を入力するのではなく、空の文字列 ("") を入力してから Now の値を付加します。何らかの理由で、Word では、変数だけを TypeText メソッドに渡すと拒否され、空の文字列と変数を渡すと受け入れられます。

回避策があるということは別にしても、Word 固有のメソッドを使って日付/時刻を挿入する理由がもう 1 つあります。前述のスクリプトでは、日付/時刻をハードコーディングされた値として挿入しています。多くの場合は、これだけで十分です。しかし、日付/時刻フィールドを挿入し、文書を開くたび (またはフィールドの更新を選択するたび) に値を更新して、現在の日付/時刻が表示されるようにしたい場合もあるでしょう。 ** Word の InsertDateTime メソッドには、ハードコーディングした日付値または日付/時刻フィールドのどちらかを挿入するオプションがあります。

たとえば、次のスクリプトでは、日付/時刻フィールドを特定の書式で挿入します。これについては後述します。

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

Set objSelection = objWord.Selection
objSelection.InsertDateTime "M/d/yyyy h:mm:ss am/pm"

このスクリプトを実行すると、Word 文書は次のようになります。

Microsoft Word

今日のコラムは物足りないと思われたかもしれません。

スクリプト自体はきわめて単純です。Word.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定して、新しい空白の文書を追加します。Word の Selection オブジェクトのインスタンスを作成し、次のコードで日付/時刻フィールドを挿入します。

objSelection.InsertDateTime("M/d/yyyy h:mm:ss am/pm")

では、日付/時刻フィールドを挿入せずに、日付/時刻の値を文書にハードコーディングしたい場合はどうしたらよいでしょうか。その場合は、省略可能な第 2 パラメータ (FALSE) を追加します。これで、入力データが日付/時刻フィールドとして解釈されなくなります。このスクリプトは次のようになります。

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

Set objSelection = objWord.Selection
objSelection.InsertDateTime "M/d/yyyy h:mm:ss am/pm", FALSE

なかなか便利だと思いませんか。しかし、最初のパラメータ "M/d/yyyy h:mm:ss am/pm" は何を意味するのでしょうか。 **

ご想像のとおり、最初のパラメータは日付/時刻情報を表示するときに使用される書式を指定します。このパラメータも省略可能です。これを省略して InsertDateTime を呼び出すと、コンピュータの [地域] の設定で指定した短い形式の書式で日付/時刻の値が挿入されます (これらの設定を確認するには、コントロール パネルの [地域と言語のオプション] を開きます)。このスクリプトでは、日付/時刻を次のような指定の書式で表示したかったので、書式設定を指定する必要がありました。

4/20/2005 12:13:21 PM

書式設定の文字列 M/d/yyyy h:mm:ss am/pm がこのような出力になることはどうしてわかったのでしょう。それは簡単です。Word の [挿入] メニューの [フィールド] をクリックしたのです。[フィールド] ダイアログ ボックスでは、[日付] をクリックし、使用可能なすべての日付書式の一覧を参照しました。ご覧のとおり、書式をクリックするたびに、書式設定の文字列がダイアログ ボックスの上部に表示されます。

Microsoft Word

ここでは、書式設定の文字列をダイアログ ボックスから直接コピーしてスクリプトに挿入しました。

書式はこれらだけに限定されません。想像力を駆使して、固有の日付/時刻書式を作成してもかまいません。たとえば、次の書式設定の文字列を見てください。

objSelection.InsertDateTime "M*d*yyyy"

このような書式を使いたいと思う理由はわかりませんが、この書式設定の文字列は次のように出力されます。

4*20*2005

では、VBScript の Now 関数で同じように出力する場合について考えてみましょうか。 **