Wordのオブジェクト、プロパティ、メソッド

カテゴリー名: [WordVBAとOLE 基本構成とその操作

2016/10/09

Wordをプログラムから動かすときに必要となる基本概念 = オブジェクト、プロパティ、メソッドについて解説。

Word文書の基本的な構成要素にも簡単に言及。

Withステートメントの利用例も掲載。


《このページの目次》


    

1. 概要

 Wordにおけるオブジェクトと、そのプロパティおよびメソッドが主題です。

(1) オブジェクト

 オブジェクトは、何らかの「もの」のことです。

 プロパティ(属性)と、メソッド(属性またはオブジェクト自身に変更を加える手続き)がオブジェクトに所属しています。

 Wordに即していえば、文書(Document)、段落(Paragraph)、文(Sentence)、単語(Word)、文字(Character)などがオブジェクトです。

 更にいえば、Wordというアプリそのものもオブジェクトです。VBAでは Application という名前で表現されます。

 Wordは複数の文書(Document)を開くことができます。なので、Applicationに複数のDocumentをぶら下げることができます。

 また、Documentには複数の段落(Paragraph)が含まれるのが一般的です。

 このように、オブジェクトを枠組みとして捕らえると、「あれがこれを含む」という階層構造になっています。

 とはいえ、Excelに比べると「含む、含まれる」の関係が一様ではありません。

    

 Document → Paragraph → Sentence → Word → Character といった階層をたどることなく、
ActiveDocument.Sentences(1) (作業中の文書の第1センテンス)のように SentenceがDocumentに直結する形をとることもよくあります。

 また、ActiveDocument.Characters(100) は、文書中の100文字目を示しますが、
ActiveDocument.Characters(100).Sentences(1) とすると、
100文字目を含む一つのセンテンスを示します。

 記述からは Character の下に Sentence があるような印象を受けますが、もちろん そうではありません。

 Wordの場合、階層構造を固定的にとらえるのでなく、柔軟に考える必要があります。

    

(2) プロパティ

 プロパティは属性のことです。

 ActiveDocumentは、作業中の文書を示すオブジェクトですが、その名前を示すNameはプロパティの一種です。sample.docといったファイル名を表します。

 FullNameというプロパティは、ドライブ名、フォルダ名を含めたフルパスを示します。C:\work\sample.doc のような名前です。

 ActiveDocument.Name とか ActiveDocument.FullName と書きます。

    

 Sentences(1) は、第1センテンス(オブジェクト)を指しますが、
これにはTextというプロパティがあります。

 Sentences(1).Text は、センテンスの文字列テキストを示します。

 実際のプログラムでは ActiveDocument.Sentences(1).Text のように、文書に帰属させる形で書きます。

    

 プロパティに、新たに文字や数値を代入することもできます。マクロとして書くと、たとえば下のとおり。

Sub Macro1()
  ActiveDocument.Sentences(1).Text = "天気は晴れでした。"
End Sub

    

 Boldというプロパティもあります。該当部分を太字にしたり、太字を解除するのに用います。

 Trueを代入すると太字になり、Falseを代入すると太字が解除されます。

 ActiveDocument.Words(16).Bold = True は、第16番目の単語を太字にします。

    

(3) メソッド

 メソッドは、オブジェクトに対して何らかの処理を施す手続きです。

 オブジェクトそのものに処理を施すこともあれば、属性(プロパティ)に変更を加える場合もあります。

 ActiveDocument.Sentences(1).Delete とすれば、第1センテンスが削除されます。消えてなくなります。

 ActiveDocument.Characters(100).Select とすれば、100文字目にカーソルがいきます。100文字目が選択された状態になります。

 WordのVBAマクロには Selection というのがよく出てきますが、
このSelectメソッドの適用により Selection が100文字目を指し示すものとなります。


    

2. VBAマクロ

 「概要」で述べた事柄を取り上げる形で、VBAマクロの例を掲げます。

 Word文書の構成要素(オブジェクト)には様々なものがあり、「概要」で触れなかったものも出てきますが、適宜 説明を加えます。

 zip圧縮ファイルに同梱の SetWordMacro.vbs を使えば、マクロを組み込んだ Test01.doc を簡単に生成できます(事前にマクロのセキュリティを調整しておく必要がありますが)。

    

△ macro01.txt

 1' Word文書のオブジェクト、プロパティ、メソッド
 2Sub Macro1()
 3    ActiveDocument.Content.Delete  ' 本文を全クリア
 4    Selection.InsertFile ActiveDocument.Path & "\sample01.txt"
 5    ActiveDocument.Characters(1).Select  ' 第1文字目に注目
 6    ActiveDocument.Words(16).Bold = True  ' 太字の設定
 7    MsgBox "第16の単語:「" & ActiveDocument.Words(16).Text & _
 8        "」を太字にしました。"
 9    MsgBox "第5センテンス:" & ActiveDocument.Sentences(5).Text
10End Sub

    

 ActiveDocument.Content.Delete の Content は、文書中の本文部分全体を示すオブジェクトです。脚注、ヘッダ、フッダは含みません。

 Content.Delete とすると、本文部分がクリアされます。

 Delete は、ほんとはクリアでなく削除です。

 ActiveDocument.Sentences(3).Delete とすれば第3センテンスが削除されます。第3センテンスが消えてなくなり、4番目だったものが新たに3番目のセンテンスになります。

 しかし、Content が消えてなくなることはないので Content.Delete は実質的に「クリア」です。

    

 Selection.InsertFile ActiveDocument.Path & "\sample01.txt" は、sample01.txtを読み込んで挿入するものです。

 sample01.txt は、マクロが組み込まれている Test01.doc と同じフォルダにあるものとして処理します。

 ActiveDocument.Path は、Test01.docが存在しているドライブ名+フォルダ名を示します。たとえば C:\work などです。

 Selection は、選択されている部分を示すオブジェクトですが、この場合、本文がクリアされているので文書の先頭位置を示します。そこに sample01.txt を挿入することになります。

    

△ macro01b.txt(Withステートメントの利用)

 先述の macro01.txt には ActiveDocument が頻繁に出てきます。

 このような場合、Withを使うと記述を簡略化できます。下のように書きます。

△ macro01b.txt

 1' Word文書のオブジェクト、プロパティ、メソッド(Withステートメントの利用)
 2Sub Macro1()
 3    With ActiveDocument
 4        .Content.Delete  ' 本文を全クリア
 5        Selection.InsertFile .Path & "\sample01.txt"
 6        .Characters(1).Select  ' 第1文字目に注目
 7        .Words(16).Bold = True  ' 太字の設定
 8        MsgBox "第16の単語:「" & .Words(16).Text & _
 9            "」を太字にしました。"
10        MsgBox "第5センテンス:" & .Sentences(5).Text
11    End With
12End Sub

 半角のピリオドで始まる記述がありますが、これは、その前に ActiveDocument がくるはずのものです。つまり、省略した書き方です。

目次に戻る


    

3. OLEを利用するVBScript

 前述のVBAマクロと同じ処理をする VBScript を掲げます。

△ vovWD01.vbs

 1' Word文書のオブジェクト、プロパティ、メソッド
 2Option Explicit
 3Dim FSO, DocPath
 4Dim WDapp, DOCobj
 5Const wdFormatDocument = 0
 6
 7Set FSO = CreateObject("Scripting.FileSystemObject")
 8DocPath = FSO.GetAbsolutePathName("Test01.doc")
 9If (FSO.FileExists(DocPath) = True) Then FSO.DeleteFile(DocPath)
10Set WDapp = CreateObject("Word.Application")  ' Wordの起動
11WDapp.Visible = True  ' Wordを見える状態に
12Set DOCobj = WDapp.Documents.Add()
13With DOCobj
14    .Content.Delete  ' 本文を全クリア
15    .Application.Selection.InsertFile FSO.GetAbsolutePathName("sample01.txt")
16    .Characters(1).Select  ' 第1文字目に注目
17    .Words(16).Bold = True  ' 太字の設定
18    MsgBox "第16の単語:「" & .Words(16).Text & _
19        "」を太字にしました。"
20    MsgBox "第5センテンス:" & .Sentences(5).Text
21End With
22DOCobj.SaveAs DocPath, wdFormatDocument
23WDapp.Quit

    

 変数 WDapp は、VBAでのApplicationに当たります。

 DOCobjは、ActiveDocument に該当します。

 Withステートメントの辺りは、基本的にVBAマクロと同じです。

 VBAマクロに出てこなかったものがあるので、簡単に触れておきます。

    

(a) ファイル名の絶対パス

 サンプルプログラムでのWordのドキュメント名(ファイル名)は Test01.doc です。ドキュメントをこの名前で保存します。

 これを単2 “Test01.doc” とすると、ユーザーのドキュメントフォルダ(マイドキュメント)に保存されます。カレントフォルダには保存されません。

 そこで FSO.GetAbsolutePathName を適用しています。これは、指定されたファイル名の絶対パスを返します。

 Test01.docの絶対パスを変数 DocPath に代入して、
Wordを起動する前に、そのファイルが既に存在するなら削除します。

    

(b) ドキュメントの新規作成

 ドキュメントの新規作成は、VBAで書けば Application.Documents.Add() で行います。

 このAddメソッドは、新しいドキュメントオブジェクトを返します。

 その新しいドキュメントが ActiveDocument になります。

    

(c) ドキュメントの保存

 全自動の一括処理であるため、ドキュメントを保存し、Wordアプリケーションの終了処理も行っています。

 SaveAsというのはドキュメントのメソッドで、「名前を付けて保存」に相当します。

 その第1パラメータはファイル名(ドキュメントの名前)です。

 第2パラメータはドキュメントの種類です。Word2003の形式(doc)、Word2007以降の形式(docx)、マクロ有効の形式(docm)などのどれにするかを指定します。整数値で指定します。

 0は、Word2003形式を指定する値です。
 docx形式にしたい時は 12(定数名 wdFormatXMLDocument)に、
 docm形式なら 13(定数名 wdFormatXMLDocumentMacroEnabled)にします。

 サンプルプログラムでは、定数wdFormatDocumentに0を代入して、定数名を用いていますが、SaveAsの第2パラメータに 0 の整数値を指定してもかまいません。

目次に戻る


    

4. JScript

 前述のVBScriptと同じ処理を行う JScript は下のとおりです。

△ vovWD01.js

 1// Word文書のオブジェクト、プロパティ、メソッド
 2var fso, docPath;
 3var WdApp, docObj;
 4var wdFormatDocument = 0;
 5
 6fso = WScript.CreateObject("Scripting.FileSystemObject");
 7docPath = fso.GetAbsolutePathName("Test01.doc");
 8if (fso.FileExists(docPath))  fso.DeleteFile(docPath);
 9WdApp = WScript.CreateObject("Word.Application");  // Wordの起動
10WdApp.Visible = true;  // Wordを見える状態に
11docObj = WdApp.Documents.Add();
12with (docObj) {
13    Content.Delete();  // 本文を全クリア
14    Application.Selection.InsertFile(fso.GetAbsolutePathName("sample01.txt"));
15    Characters(1).Select();  // 第1文字目に注目
16    Words(16).Bold = true;  // 太字の設定
17    WScript.Echo("第16の単語:「" + Words(16).Text +
18        "」を太字にしました。");
19    WScript.Echo("第5センテンス:" + Sentences(5).Text);
20}
21docObj.SaveAs(docPath, wdFormatDocument);
22WdApp.Quit();

    

 VBAマクロとVBScriptでは、Delete, Select, InsertFile を呼び出すのに括弧をつけませんでした。SaveAs, Quit もそうです。

 しかし、JScriptでは括弧を付けないとエラーになります。

 パラメータを指定するかどうかにかかわらず、メソッドを呼び出すときには括弧を付けないといけないようです。

〜 以上 〜