Excel VBAユーザーのためのWord VBA入門 「chapter 1. Excel VBAとWord VBAの違い」
Excel VBAとWord VBAでは何が違うのでしょうか。
詳細はこれから解説していきますが、chapter 1では、違いを簡潔にお伝えしておきます。
このnoteは、『Excel VBAユーザーのためのWord VBA入門』のchapter 1です。「はじめに」をまだお読みいただいていない方は、「はじめに」を先にお読みください。
1-1. VBAやVBEは同じ
プログラミング言語Visual Basic for Applications(VBA)については、Excel VBAとWord VBAに違いはありません。
If文やFor~Next文などの制御構文は同じです。
変数の宣言方法や代入方法も同じです。
マクロの実体がSubプロシージャであることも同じです。
VBAの開発環境であるVisual Basic Editor(VBE)の基本的な使い方も同じです。
ですから、WordからVBEを起動してどこかで見つけた簡単なWordマクロを標準モジュールに貼り付けて実行することは、Excel VBAを知っていればすぐできます。
しかし、どこかで拾ってきたWord VBAのコードに何らかの修正を加えたいとなると、話は違ってきます。Excel VBAを知っていれば、Word VBAもスラスラ書けるかといえば、そのようなことはありません。
VBAで操作する対象(オブジェクト)が、Excel VBAとWord VBAではまったく異なるためです。
1-2. Excel VBAとWord VBAでは
操作するオブジェクトが全く異なる
Excel VBAの場合、VBAで操作する対象は表計算ソフトであるExcelです。
一方Word VBAでは、ワープロソフトであるWordが、VBAから操作する対象です。
表計算ソフトExcelとワープロソフトWordは、いずれもMicrosoftの製品ですから、似たところもありますが、違う部分がたくさんあります。
その違いが、Excel VBAとWord VBAの違いとして現れてきます。
同じ名前であっても別のオブジェクト
VBAを使って操作するオブジェクトが、Excel VBAとWord VBAではまったく異なります。
たまたま同じ名前のオブジェクトがあったとしても、実際にはまったく別のオブジェクトであることを、しっかり意識する必要があります。
例えば、Excel VBAにもWord VBAにも「Range」という名前のオブジェクトが存在します。ですが、Excel VBAのRangeとWord VBAのRangeは、まったく別のオブジェクトです。
Excel VBAにもWord VBAにも、「Application」という名前のオブジェクトが存在します。ですが、Excel VBAのApplicationとWord VBAのApplicationは、まったく別のオブジェクトです。
Excel VBAのRangeとWord VBAのRange
Excel VBAにもWord VBAにも、「Range」という名前のオブジェクトが存在します。
Excel VBAのRangeについては、本書をお読みの皆さんはよくご存じでしょう。Excel VBAのRangeは、セル範囲や1個のセルを表すオブジェクトです。
それに対しWord VBAのRangeは、Word文書上の主に文字列範囲を表すオブジェクトです。
Excel VBAの経験がある皆さんの場合、Word VBAで「Range」というコードを見た時に、無意識にExcel VBAのRangeオブジェクトを想起してしまう可能性があることに注意が必要です。
Rangeオブジェクトについては、「chapter 3. WordのRangeは文字列範囲を表す」以降で解説します。
Excel VBAのApplicationとWord VBAのApplication
Excel VBAにもWord VBAにも、「Application」という名前のオブジェクトが存在します。
Excel VBAのApplication(図1-2a)は、表計算ソフトであるExcelを表すオブジェクトです。
それに対し、Word VBAのApplication(図1-2b)は、ワープロソフトであるWordを表すオブジェクトです。
図1-2bのメンバーペインには、ActivePrinterやActiveWindowなど同じ名前のプロパティもいくつかありますが、Excel VBAのApplicationオブジェクトとは別のプロパティ&メソッドがたくさん表示されています。
もちろん、Excel VBAのApplication.ActivePrinterと、Word VBAのApplication.ActivePrinterは別のプロパティです。
Excel VBAのApplication.ActiveWindowと、Word VBAのApplication.ActiveWindowも別のプロパティです。
ここで紹介したRangeやApplicationのように、たまたま同じ名前のオブジェクトもいくつかありますが、Excel VBAには存在しないオブジェクトが、Word VBAには当然たくさん存在します。
1-3. Excel VBAユーザーがWord VBAで注意すべき点
VBAで操作するオブジェクトが全く異なること以外にも、Excel VBAとWord VBAにはいくつかの違いがあります。それらを紹介しておきます。
For Each~Nextループの挙動
For Each~Nextループの挙動が、Excel VBAとWord VBAでは異なる場合があります。
Excel VBAの場合、以下のようなコードで、アクティブシート上の図形をすべて削除できます。
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
shp.Delete
Next
この考え方をWord VBAに適用した以下のコードで、アクティブ文書の本文に存在する図形をすべて削除できそうなものですが、できません。
Dim shp As Shape
For Each shp In ActiveDocument.Shapes
shp.Delete
Next
For Each~Next文で処理できない場合には、以下のような「Step -1」を指定したFor~Next文を利用してください。
With ActiveDocument.Shapes
Dim i As Long
For i = .Count To 1 Step -1
.Item(i).Delete
Next
End With
マクロ記録時の保存先
Wordでマクロ記録しようとすると、[マクロの記録]ダイアログボックスの[マクロの保存先]欄に、「すべての文書(Normal.dotm)」がデフォルトで表示されます(図1-3a)。
Excelでは「個人用マクロブック」を使ってどのブックでも実行可能なマクロを作れますが、Wordの場合は「テンプレート」を使って、どのWord文書でも共通して使えるマクロを作ります。
この仕様のため[マクロの記録]ダイアログボックスの[マクロの保存先]欄に「すべての文書(Normal.dotm)」がデフォルト表示されるのです。
ですが、このままの状態でマクロ記録を開始することはおすすめしません。マクロの保存先はNormal.dotmテンプレートではなくマクロが有効なWord文書にしておいて、完成した汎用的に使えるコードのみをNormal.dotmなどのテンプレートに保存することをおすすめします。
なお、ExcelでVBAのコードを含むブックは拡張子が「.xlsm」の「Excelマクロ有効ブック」で保存しなければならないのと同様に、Wordの場合は拡張子が「.docm」の「Wordマクロ有効文書」として保存してください。
1-4. Word VBAのほうが優れている点
Word VBAには、Excel VBAより優れていると言える部分がありますのでお伝えしておきます。
マクロの実行結果をWordで元に戻せる
Excelでは、マクロの実行結果をExcelで元に戻すことはできません。
それに対しWord VBAの場合、Wordで[Ctrl]+[Z]を押すことなどによって、マクロの実行結果を元に戻せます。
マクロ処理の結果を、Wordで簡単に元に戻せる手軽さは、Wordマクロを作るときの心理的ハードルを下げてくれるでしょう。
引数を指定できるプロパティが少ない
Excel VBAの場合、プロパティであっても引数を指定できるものが少なくありません。
引数を指定できるプロパティは、ローカルウィンドウを使ってオブジェクト変数の中身を確認することができません。そのため、引数を指定できるプロパティの調査は面倒です。
それに対しWord VBAでは、引数を指定できるプロパティは、それほどありません。ですからローカルウィンドウを使った、オブジェクト変数の中身の調査・確認が、Excel VBAより行いやすくなっています。
本書でも、随所でローカルウィンドウを使ったオブジェクト変数の確認を行います。
コレクションから単独オブジェクトを取得する既定メンバー
コレクションから要素オブジェクトを取得するコードについては、Microsoftが規定しているCOMアプリケーションの原則に、Word VBAのほうが近くなっています。
Excel VBAの場合、コレクションから単独のオブジェクトを取得するときに、非表示メンバーとなっている_Defaultプロパティ(図1-4a)を利用するケースがほとんどです。
それに対しWord VBAでは、Microsoftが規定した原則どおりItemメソッド(図1-4b)が、既定メンバーであるコレクションが多くなっています。
オブジェクトブラウザー詳細ペイン2行目の「Word.Documentsの既定メンバー」表示や、メンバーペインのアイコンから、ItemメソッドがDocumentsコレクションの既定メンバーであることがわかります。
以上のように、Excel VBAとWord VBAには(似ている部分もありますけれど)さまざまな違いがあります。特に、微妙な違いに注意しながら、学習を進めていきましょう。