カテゴリー名: [WordVBAとOLE 基本構成とその操作]
Wordをプログラムから動かすときに必要となる基本概念 = オブジェクト、プロパティ、メソッドについて解説。
Word文書の基本的な構成要素にも簡単に言及。
Withステートメントの利用例も掲載。
Wordにおけるオブジェクトと、そのプロパティおよびメソッドが主題です。
オブジェクトは、何らかの「もの」のことです。
プロパティ(属性)と、メソッド(属性またはオブジェクト自身に変更を加える手続き)がオブジェクトに所属しています。
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の場合、階層構造を固定的にとらえるのでなく、柔軟に考える必要があります。
プロパティは属性のことです。
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番目の単語を太字にします。
メソッドは、オブジェクトに対して何らかの処理を施す手続きです。
オブジェクトそのものに処理を施すこともあれば、属性(プロパティ)に変更を加える場合もあります。
ActiveDocument.Sentences(1).Delete
とすれば、第1センテンスが削除されます。消えてなくなります。
ActiveDocument.Characters(100).Select
とすれば、100文字目にカーソルがいきます。100文字目が選択された状態になります。
WordのVBAマクロには Selection というのがよく出てきますが、
このSelectメソッドの適用により Selection が100文字目を指し示すものとなります。
「概要」で述べた事柄を取り上げる形で、VBAマクロの例を掲げます。
Word文書の構成要素(オブジェクト)には様々なものがあり、「概要」で触れなかったものも出てきますが、適宜 説明を加えます。
zip圧縮ファイルに同梱の SetWordMacro.vbs を使えば、マクロを組み込んだ Test01.doc を簡単に生成できます(事前にマクロのセキュリティを調整しておく必要がありますが)。
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 を挿入することになります。
先述の macro01.txt には ActiveDocument が頻繁に出てきます。
このような場合、Withを使うと記述を簡略化できます。下のように書きます。
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 がくるはずのものです。つまり、省略した書き方です。
前述のVBAマクロと同じ処理をする VBScript を掲げます。
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マクロに出てこなかったものがあるので、簡単に触れておきます。
サンプルプログラムでのWordのドキュメント名(ファイル名)は Test01.doc です。ドキュメントをこの名前で保存します。
これを単2 “Test01.doc” とすると、ユーザーのドキュメントフォルダ(マイドキュメント)に保存されます。カレントフォルダには保存されません。
そこで FSO.GetAbsolutePathName を適用しています。これは、指定されたファイル名の絶対パスを返します。
Test01.docの絶対パスを変数 DocPath に代入して、
Wordを起動する前に、そのファイルが既に存在するなら削除します。
ドキュメントの新規作成は、VBAで書けば Application.Documents.Add()
で行います。
このAddメソッドは、新しいドキュメントオブジェクトを返します。
その新しいドキュメントが ActiveDocument になります。
全自動の一括処理であるため、ドキュメントを保存し、Wordアプリケーションの終了処理も行っています。
SaveAsというのはドキュメントのメソッドで、「名前を付けて保存」に相当します。
その第1パラメータはファイル名(ドキュメントの名前)です。
第2パラメータはドキュメントの種類です。Word2003の形式(doc)、Word2007以降の形式(docx)、マクロ有効の形式(docm)などのどれにするかを指定します。整数値で指定します。
0は、Word2003形式を指定する値です。
docx形式にしたい時は 12(定数名 wdFormatXMLDocument)に、
docm形式なら 13(定数名 wdFormatXMLDocumentMacroEnabled)にします。
サンプルプログラムでは、定数wdFormatDocumentに0を代入して、定数名を用いていますが、SaveAsの第2パラメータに 0 の整数値を指定してもかまいません。
前述のVBScriptと同じ処理を行う JScript は下のとおりです。
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では括弧を付けないとエラーになります。
パラメータを指定するかどうかにかかわらず、メソッドを呼び出すときには括弧を付けないといけないようです。
〜 以上 〜