Word 2010 VBA の基礎知識

概要:  初心者のプログラマのために Visual Basic for Applications (VBA) プログラミングによる Microsoft Word 2010 の拡張について紹介します。このトピックでは、VBA 言語の概要、Word 2010 での VBA へのアクセス方法、Word VBA での実際の問題に対する詳細な解決策、およびプログラミングとデバッグの方法に関するヒントを示します。

適用対象: Office 2010 | Open XML | Visual Studio Tools for Microsoft Office | Word 2007 | Word 2010

この記事の内容
マクロとは何か、なぜマクロを必要とするか、どうやってマクロを作成するか
パート 2: より複雑なマクロを記述する
まとめ
その他の技術情報
著者について

公開日: 2010 年 4 月

提供元: Shauna Kelly

目次

  • パート 1: エンド ツー エンド マクロの例

  • パート 2: より複雑なマクロを記述する

  • まとめ

  • その他の技術情報

  • 著者について

マクロとは何か、なぜマクロを必要とするか、どうやってマクロを作成するか

マクロを使用すると、Word を自動操縦にすることができます。

Word で同じ作業を頻繁に実行する場合、そのたびにマウス クリックやキー入力を延々と行わなければならないとすれば、苛立たしく感じることでしょう。マクロを記述するときは、一連のコマンドをひとまとめにして、1 回のクリックやキー入力で開始するように Word に命じることができます。

この記事では、読者が Word の熟練ユーザーであることを前提にしています。ただし、コンピューター プログラミングやソフトウェア開発に関する知識があることは前提にしていません。

この記事は 2 つのパートに分かれています。

  1. この記事の最初のパートでは、エンド ツー エンドの例として、単純なマクロの記述方法、マクロを保存できる場所、マクロを実行するためのクイック アクセス ツール バー ボタンまたはキーボード ショートカットの作成方法、およびマクロを別のコンピューターにコピーする (つまり、マクロを自宅と職場で使用できるようにしたり、同僚と共有できるようにする) 方法を説明します。それにより、単純な例を示します。

  2. この記事の 2 番目のパートでは、マクロの詳細として、より複雑なマクロの記述方法と、マクロを意図どおりに動作させ、エラーや問題が発生しないように処置する方法を説明します。

パート 1: エンド ツー エンド マクロの例

マクロの目的の 1 つは、1 回のクリックやキー入力で作業を実行できるようにすることです。

筆者は Web サイトへのハイパーリンクが含まれるドキュメントをよく作成します。Word の既定では、ハイパーリンク先を表示する (開く) ためには、 Ctrl キーを押しながらハイパーリンクをクリックする必要があります。

図 1. Ctrl キーを押しながらハイパーリンクをクリックしてリンク先を表示

ハイパーリンク先へ移動する既定オプション

次の図は、ハイパーリンクのクリックによってリンク先を表示するための代替オプションを示しています。

図 2. ハイパーリンクをクリックしてリンク先を表示

ハイパーリンク先へ移動する代替オプション

既定の方法が便利なこともありますが、ハイパーリンクをクリックすることでリンク先を表示したいこともあります (図 2)。筆者は、この設定を 1 日に何度も構成することがあります。それには、[ファイル] ボタンをクリックし、[ヘルプ] の下にある [オプション] をクリックします。[Word のオプション] ダイアログ ボックスで、[詳細設定] をクリックし、[編集オプション] の下にある [Ctrl キー + クリックでハイパーリンクを表示する] をオン (またはオフ) にし、[OK] をクリックします。このような一連のマウス クリックを繰り返すのは苛立たしいことです。1 回のクリックでこの設定を構成できれば手間が省けます。

このセクションでは、 Ctrl キー + クリック の使用と単なるハイパーリンクのクリックとの間で切り替えを行うための単純なマクロの作成方法を説明します。このマクロを作成するためには、次のことを行う方法を学ぶ必要があります。

  • Word マクロ有効テンプレート ファイル (.dotm) を作成してマクロを格納し、そのファイルを Word のスタートアップ フォルダーに保存する。

  • Visual Basic Editor (Word の一部) を開いて使用する。

  • Visual Basic Editor でマクロを記述する。

  • マクロをテストする。

  • マクロを実行するためのクイック アクセス ツール バーのボタンを作成する。

  • マクロを実行するためのキーボード ショートカットを作成する。

  • ファイルを保存し、それをアドインとして読み込み、さらに必要に応じて同僚と共有したり、別のコンピューターで使用する。

以下では、これらについて 1 つずつ説明していきます。

マクロを格納するためのファイルを作成する

マクロの記述を始める前に、そのマクロをどこにどのように保存するかを考えておきましょう。

Word では、マクロを 2 種類の Word ファイルに保存できます。それは Word マクロ有効ドキュメント ファイル (.docm) と Word マクロ有効テンプレート ファイル (.dotm) です。マクロをドキュメントに格納するというやり方は推奨されていません。通常は Word マクロ有効テンプレート ファイル (.dotm) に格納します。

マクロは標準テンプレート (Normal.dotm) に保存することもできますが、そうするとマクロの組織化や共有が難しくなります。通常は独自のファイルを作成して、そこにマクロを保存する方がよいでしょう。

テンプレート ファイルをどこに保存するのがよいかは、マクロをどのように使用するかによります。マクロをすべてのドキュメントで使用するのか、それとも一部のドキュメントでのみ使用するのかを判断する必要があります。

たとえば、月次の販売レポート用のテンプレートを作成し、それらのレポートを書式化するためのマクロを用意するとします。その場合、テンプレート ファイルをユーザー テンプレート フォルダーに保存し、そのテンプレートを新しいドキュメントの基礎として使用します。(ユーザー テンプレート フォルダーを確認するには、[ファイル] タブをクリックし、[オプション] をクリックします。[Word のオプション] ダイアログ ボックスで、[詳細設定] をクリックし、[ファイルの場所] ボタンをクリックします。) マクロをテンプレートに格納した場合、そのマクロにアクセスできるのは、そのテンプレートに関連付けられたドキュメントに限られます。他のドキュメントからは、そのマクロが "見えません"。

この記事では、どの文書でも使用できるマクロを作成します。そのため、マクロ有効テンプレート ファイルを作成します。開いている Word ファイルがあれば、まずそれらのファイルを閉じてください。マクロを格納する新しいファイルを作成するには、[ファイル] ボタンをクリックし、[新規作成] をクリックし、[マイ テンプレート] をクリックします。[新規] ダイアログ ボックスで、[テンプレート] オプション ボタンをクリックし、[OK] をクリックします。そのファイルを MyWordTools.dotm という名前のマクロ有効テンプレート ファイルとして Word スタートアップ フォルダー保存します。(Word スタートアップ フォルダーを確認するには、[ファイル] タブをクリックし、[オプション] をクリックします。[Word のオプション] ダイアログ ボックスで、[詳細設定] をクリックし、[ファイルの場所] ボタンをクリックします。)

Visual Basic Editor を使用する

Word のマクロは、Visual Basic for Applications (VBA) というプログラミング言語で記述されます。

マクロを記述するときは Visual Basic Editor (VBE) を使用します。これは Word の一部ですが、大部分のユーザーはご存じないでしょう。VBE を開くには、次のいずれかの方法を使用します。

  • 次のキーボード ショートカットを押す: Alt + F11

  • [開発] タブで [Visual Basic] ボタンをクリックする。これを行うには、[ファイル] タブをクリックし、[オプション] をクリックします。[Word のオプション] ダイアログ ボックスで、[リボンのユーザー設定] をクリックします。ダイアログ ボックスの右側にある [開発] タブをクリックします。[OK] をクリックしてドキュメントに戻り、[開発] タブで [Visual Basic] ボタンをクリックします。

  • クイック アクセス ツール バーに Visual Basic コマンドを追加する。

VBE を使用する前に、[ツール] メニューで [オプション] をクリックします。[オプション] ダイアログ ボックスの [エディター] タブで、すべてのチェック ボックスがオンになっていることを確認します。

VBE の左上の部分にプロジェクト エクスプローラーが表示されます。ここには Word で現在開いているファイルがすべて表示されます。現在、Normal (Normal.dotm を表している) と MyWordTools (先ほど作成したファイル) が表示されているはずです。

次の図では、Visual Basic Editor のプロジェクト エクスプローラーに MyWordTools プロジェクトが表示されています。

図 3. Visual Basic Editor のプロジェクト エクスプローラー

Visual Basic Editor のプロジェクト エクスプローラー

ファイル内でマクロはモジュールに格納されます。ファイルにモジュールを追加するには、プロジェクト エクスプローラーMyWordTools ファイルを選択します (図 3)。[挿入] メニューで [標準モジュール] をクリックします。ファイルにモジュールを追加すると、そのモジュールがプロジェクト エクスプローラーに表示され、その下の [プロパティ] ウィンドウにも表示されます (図 4)。[プロパティ] ウィンドウを使用すると、モジュールの名前を変更できます。ここでは Module1 のままにしておきます。

次の図では、Visual Basic Editor のプロジェクト エクスプローラーに Module1 が表示されています。

図 4. Visual Basic Editor のプロジェクト エクスプローラー

Visual Basic Editor のプロパティ ウィンドウ

最後に、ファイルのエントリが TemplateProject と名付けられているのが確認できます。必ずしもそうする必要はないのですが、よりわかりやすい名前を付けることをお勧めします。それには、MyWordTools ファイルのエントリを右クリックし、ショートカット メニューで [TemplateProject のプロパティ] をクリックします (図 5)。

次の図は、[TemplateProject のプロパティ] メニュー項目を示しています。

図 5. プロパティ メニュー項目

プロジェクト プロパティのポップアップ メニュー項目の選択

[Template Project - プロジェクト プロパティ] ダイアログ ボックスで、プロジェクト名を MyWordTools に変更します。

マクロを記述する

VBE の右側の大きな空白領域がマクロのコードを記述する場所です。この領域が表示されない場合は、[表示] メニューで [コード] をクリックします。これでコード ウィンドウが表示されます。コード ウィンドウの最上部には、Word によって Option Explicit ステートメントが自動的に挿入されます。これを削除してはなりません。

ここで記述するマクロの目的は、Word でハイパーリンク先を表示するための 2 つの設定を交互に切り替えることです。これは Word で設定を切り替える他のボタンと同様に機能します。たとえば、[ホーム] タブの [太字] ボタンは、テキストが太字でない場合は太字にし、テキストが太字になっている場合は太字を解除します。

次のマクロ コード例をコピーして、コード ウィンドウに貼り付けてください。

    Sub ToggleHyperlinkCtrlClick()
        Options.CtrlClickHyperlinkToOpen = Not Options.CtrlClickHyperlinkToOpen
    End Sub

これは ToggleHyperlinkCtrlClick という名前の短いマクロで、コードは 1 行しかありません。この 1 行のコードの意味は "Word でハイパーリンクを表示するために Ctrl キー + クリック を使用するかどうかを決定するオプションの設定を現在の逆 (つまり、現在の設定に対しての Not) にする" ということです (図 6)。

次の図では、ToggleHyperLinkCtrlClick メソッドの各行について説明しています。

図 6. ToggleHyperLinkCtrlClick メソッドの説明

Visual Basic Editor のコード ウィンドウ内のコード

マクロをテストする

マクロをテストするには、次の手順を使用します。

マクロをテストするには

  1. Word のウィンドウと VBE のウィンドウが左右に並べて表示されるようにします。

  2. Word のメイン ウィンドウをクリックします。MyWordTools.dotm ドキュメントにいくつかの段落のテキストを入力します。テキスト内にハイパーリンクをいくつか挿入します (図 7)。

    次の図では、MyWordTools ドキュメントと ToggleHyperLinkCtrlClick コード (VBE) が左右に並んで表示されています。

    図 7. ドキュメントと Visual Basic Editor を左右に並べて表示

    ドキュメントと Visual Basic Editor の画面を分割する

  3. VBE でマクロ内のどこかをクリックします。マクロを実行するには、[実行] メニューで [Sub/ユーザー フォームの実行] をクリックするか、F5 キーを押します。

  4. ハイパーリンク先を表示するための設定が変更されます。Word のメイン ウィンドウ内のハイパーリンクにマウスを合わせると、ツールヒントが変化していることがわかります。

  5. マクロを再度実行して設定を切り替えます。

Word 自体の中でマクロを実行することもできます。[表示] タブの [マクロ] グループで [マクロ] ボタンをクリックします。[マクロ] ダイアログ ボックスに ToggleHyperlinkCtrlClick マクロが表示されます。マクロを実行するには、マクロの名前をクリックし、[実行] ボタンをクリックします。

マクロを実行するためのクイック アクセス ツール バーのボタンを作成する

1 回のクリックでマクロにアクセスするために、クイック アクセス ツール バーにボタンを追加できます。それには、次の手順を使用します。

クイック アクセス ツール バーのボタンを作成するには

  1. クイック アクセス ツール バーを右クリックし、ショートカット メニューで [クイック アクセス ツール バーのユーザー設定] をクリックします。

  2. [クイック アクセス ツール バーをカスタマイズします] の下にある [コマンドの選択] ボックスの一覧で [マクロ] をクリックします。

  3. [クイック アクセス ツール バーのユーザー設定] ボックスの一覧で [MyWordTools.dotm] をクリックします。(MyWordTools.dotm を選択するのは、Word でクイック アクセス ツール バーのこのボタンが MyWordTools.dotm ファイルに保存されるようにするためです。そうすることにより、そのファイルを別のコンピューターにコピーしたときにも、このボタンが使用できるようになります。)

  4. マクロ ToggleHyperlinkCtrlClick を選択し、[追加] をクリックします。

  5. [変更] ボタンをクリックして記号を選択し、名前を ToggleHyperlinkCtrlClick に変更します。

以上の操作が完了すると、クイック アクセス ツール バーでこの新しいボタンをクリックすることにより、いつでもこのマクロを実行できます。

マクロを実行するためのキーボード ショートカットを作成する

マクロを実行するためのキーボード ショートカットも作成できます。それには、次の手順を使用します。

マクロを実行するためのキーボード ショートカットを作成するには

  1. クイック アクセス ツール バーを右クリックし、ショートカット メニューで [リボンのユーザー設定] をクリックします。[ショートカット キー] の横にある [ユーザー設定] ボタンをクリックします。

    次の図は、[キーボードのユーザー設定] ダイアログ ボックスを示しています。

    図 8. [キーボードのユーザー設定] ダイアログ ボックス

    [キーボードのユーザー設定] ダイアログ ボックス

  2. [キーボードのユーザー設定] ダイアログ ボックス (図 8) で次のことを行います。

    1. [分類] ボックスの一覧で [マクロ] をクリックします。

    2. [マクロ] ボックスの一覧で目的のマクロ名をクリックします。

    3. [割り当てるキーを押してください] ボックス内をクリックし、使用するキーボード ショートカットを入力します。ここでは Alt + Hを使用しますが、このショートカットはハイパーリンク (Hyperlink) の設定を切り替えるためのものなので、覚えやすいように "H" キーを使用することにしました。このダイアログ ボックスを見るとわかるように、このショートカットは現在割り当てられていないので、既存のキーボード ショートカットとぶつかることはありません。

    4. [保存先] ボックスの一覧で [MyWordTools.dotm] をクリックします。(MyWordTools.dotm を選択するのは、Word でこのキーボード ショートカットが MyWordTools.dotm ファイルに保存されるようにするためです。そうすることにより、そのファイルを別のコンピューターにコピーしたときにも、このキーボード ショートカットが使用できるようになります。)

    5. [割り当て] をクリックします。

このマクロを実行するには、 Alt + Hキーを押します。

最後の仕上げ

ここまでで、マクロを格納する新しいファイル (MyWordTools.dotm) を作成し、モジュール (Module1) を追加し、マクロ (ToggleHyperlinkCtrlClick) を作成し、このマクロを起動するためにクイック アクセス ツール バーのボタンを作成し、キーボード ショートカットも作成しました。そこで、次に MyWordTools.dotm ファイルを保存します (これは VBE でも Word のメイン ウィンドウからでもできます)。

VBE での作業は完了したので、VBE を閉じて Word に戻ります。それには、VBE で [ファイル] メニューをクリックし、[終了して Microsoft Word へ戻る] をクリックします。

マクロをテストするには、クイック アクセス ツール バーの該当するボタンをクリックします。これが機能することを確認したら、ファイルを保存して閉じます。

アドインの管理と読み込み

目標は、作業中のドキュメントが何であっても、このマクロを使用できるようにすることでした。しかし、新しいドキュメントを作成すると ( Ctrl + Nを使用) 、先ほどのクイック アクセス ツール バー ボタンは表示されません。作成したマクロを起動する方法がありません。

MyWordTools.dotm に格納したマクロを、どのドキュメントを開いているときでも使用できるようにするには、MyWordTools.dotm をアドインとして読み込む必要があります (.dotm ファイルはアドインとして使用されるとき、"グローバル テンプレート" とも呼ばれます)。アドインとしての .dotm ファイルの読み込みは、手動でも自動でもできます。

  • .dotm ファイルをアドインとして手動で読み込むには、まず、その.dotm ファイルを開いていれば閉じます。[開発] タブで [アドイン] ボタンをクリックします。[テンプレートとアドイン] ダイアログ ボックスで、[追加] をクリックし、目的の .dotm ファイルを見つけて [開く] をクリックします。

  • .dotm ファイルをアドインとして自動で読み込むには, .dotm ファイルを Word スタートアップ フォルダーに保存しておく必要があります。Word を終了して再起動すると、Word によってアドインが自動的に読み込まれます。

現在、Word にどんなアドインが読み込まれているのかを確認できます。[開発] タブで [アドイン] ボタンをクリックしてください。

MyWordTools.dotm を Word スタートアップ フォルダーに保存したので、Word を閉じてから再起動します。Word によって MyWordTools.dotm がアドインとして自動的に読み込まれます。クイック アクセス ツール バーに該当するボタンが表示され、そのマクロを使用できるようになります。

MyWordTools.dotm がアドインとして読み込まれると、Word のメイン ウィンドウに MyWordTools.dotm 内のテキストが残っていても見えなくなります。Word はドキュメント自体の表面上の内容は利用しません。アドインとして使用する .dotm ファイルを保存する前に、Word のメイン ウィンドウ内のテキストは削除してください。

アドイン ファイルを開く (たとえば、[ファイル] をクリックしてから [開く] をクリックする) こととアドインを読み込む (たとえば、[開発] タブの [アドイン] ボタンを使用する) ことの違いを理解することが大切です。ファイルを編集するときは、そのファイルを開きます。一方、アドインとして使用するときは、そのファイルをアドインとして読み込みます。

注意

ファイルが Word で開かれているときは、そのファイルをアドインとして読み込まないでください。アドイン ファイルがアドインとして読み込まれているときは、そのアドイン ファイルを開いて編集しないでください。そのようなことをすると、予測できない動作を引き起こす可能性があります。

マクロを別のコンピューターで使用する

マクロを使用するには、次のものが必要です。

  • マクロ コード。

  • マクロを実行するためのクイック アクセス ツール バーのボタン。

  • マクロを実行するためのキーボード ショートカット。

上記の 3 つとも MyWordTools.dotm に保存しました。したがって、このマクロを別のコンピューターで使用したり、共有したりするには、MyWordTools.dotm を別のコンピューターの Word スタートアップ フォルダーにコピーするだけで済みます。Word を起動すると、Word によって MyWordTools.dotm がアドインとして読み込まれ、マクロとボタンとキーボード ショートカットが使用できるようになります。

パート 2: より複雑なマクロを記述する

パート 1 のエンド ツー エンドの例では、1 行の単純なマクロを紹介しました。パート 2 では、この基本的なエンド ツー エンド プロセスを拡張することで、より複雑なマクロを作成する方法を説明します。

MyWordTools.dotm ファイルにマクロを追加する

パート 1 で作成した MyWordTools.dotm ファイルには、現在、1 つのモジュール (Module1) が含まれており、このモジュールには 1 つのマクロが (ToggleHyperlinkCtrlClick) が含まれています。

アドインとして読み込まれているファイルは編集しないでください。ファイルにマクロを追加するには、次のことをする必要があります。

  1. アドインとして読み込まれているファイルの読み込みを解除する。それには、[開発] タブで [アドイン] をクリックし、そのアドインのチェック ボックスをオフにし、[OK] をクリックします。

  2. そのファイルを編集用に開く。それには、[ファイル] タブをクリックします。[情報] の下にある [開く] をクリックします。目的のファイルを見つけ、そのファイルをクリックし、[開く] をクリックします。

ファイルを編集用に開くと、次のことができます。

  • コード ウィンドウへの入力によって、既存のモジュール (Module1) にマクロを追加する。または、

  • ファイルに新しいモジュールを追加し、その新しいモジュールに新しいマクロを入力する。

どちらの方法を使用するかは、マクロがどれだけ複雑かによります。短いマクロが数個しかない場合は、それらを 1 つのモジュールにまとめて格納するのが一般的なやり方です。長いマクロが数多くある場合は、それらを別々のモジュールに分けて格納し、各モジュールに適切な名前を付けて、どのようなマクロが格納されているのかわかるようにするとよいでしょう。

ファイルに新しいマクロを追加した後は、最初のマクロのときと同様に、新しいマクロをテストし、そのマクロのボタンをクイック アクセス ツール バーに作成し、そのマクロのキーボード ショートカットも作成できます。

コメント

プロの開発者はコードの中にコメントを挿入して、そのコードの目的を書くのが一般的です。

ここで作成するマクロにもコメントを追加できます。それには、コメントのテキストの前にアポストロフィを付けます。VBE の既定では、コメントが緑で表示されます。

堅牢なコードを記述する: テキストを並べ替えるためのマクロ

マクロを同僚と共有する場合は、留意することが 2 つあります。第一に、相手のコンピューターの設定が自分のものと完全に同じであるとは到底考えられません。第二に、出来の悪いコードに対して相手が自分よりも寛大であるとは考えない方がよいでしょう。したがって、記述するコードは堅牢でなければなりません。

マクロが堅牢なら、ユーザーが不可解なエラー メッセージを受け取ることはなく、マクロは意図したとおりに動作するでしょう。

堅牢なコードを記述する際の問題をいくつか例示するために、以下でテキストを並べ替えるためのマクロを紹介します。

いくつかの段落から成るテキストを並べ替えるためには、何回かのマウス クリックが必要です。テキストの並べ替えを頻繁に行う必要がある場合は、単純な並べ替えを実行するためのボタンを 1 つ用意しておくと便利でしょう (より複雑な並べ替えが必要になったときは、[ホーム] タブにある組み込みボタンも引き続き使用できます)。このマクロの動作は次のコード例に示してあります。

    Sub SortText1()
    ' A macro to sort the selected text
         Selection.Sort
    End Sub

このマクロも先ほどのマクロと同様にテストできます。Word のウィンドウと VBE のウィンドウを左右に並べて表示してください。Word のメイン ウィンドウで、いくつかの段落から成るテキストを入力し、それらを選択します。VBE で、マクロを実行するために、マクロ コード内をクリックし、 F5キーを押します。Word によって、それらの段落がアルファベット順に並べ替えられます。

この SortText1 マクロは、うまく動作するように見えます。ただし、堅牢ではありません。どこが悪いのかを調べるために、ドキュメント内に図を挿入してみましょう。この図は文字列の上に配置される図にします。それには、その図を選択します。[図ツール] の下の [書式] タブで [配置] グループの [位置] をクリックします。[文字列の折り返し] ページ位置オプションのいずれかを選択します。

図を選択し、SortText1 マクロを実行します。文字列の上に配置された図を 1 つだけ並べ替えるというのは Word にとって意味のないことなので、Visual Basic からエラー メッセージが表示されます。それでは堅牢なマクロとは言えません。

Selection.Sort という 1 行のコードが適切に動作するのは、通常のテキストを選択した場合に限られます。この問題の解決方法を考える前に、もう 1 つ別の問題を検討することにします。

注意

テキストをまったく選択せずにドキュメント内をクリックしてから、SortText1 を実行した場合、ドキュメント全体が並べ替えられます。それは少なくとも予想外のことですし、悪くするとデータが壊れてしまう可能性もあります。

次のコード例では、選択された段落テキストが 2 つ以上ある場合にだけ並べ替えを行うようにマクロを修正する方法を示します。

    Sub SortText2()
    ' A macro to sort the Selection if the user has selected more than one
    ' paragraph of text.
        If Selection.Paragraphs.Count > 1 Then
            Selection.Sort
        End If
    End Sub

この SortText2 マクロを実行してみましょう。SortText1 と違って、このマクロでは図を選択してからマクロを実行してもエラー メッセージが表示されません。さらに、誤ってドキュメント全体を並べ替えてしまうこともありません。何が起こるかを調べるために、次の手順を使用して、コードを 1 行ずつ実行することにします。

VBA コードを 1 行ずつ実行するには

  1. Word のメイン ウィンドウ内をクリックし、図を選択します。

  2. SortText2 マクロ内のどこかをクリックします。

  3. F8キーを押します。Word によってマクロ内の最初の行 (Sub SortText2()) が強調表示されます。

  4. F8 キーを繰り返し押して、コードを 1 行ずつ実行していきます。

F8 キーを使用してコードを 1 行ずつ実行するのは、コードの動作を調べて問題を解決するための一般的な方法です。この例では、図が選択されている場合、Word は If ステートメントを処理するものの、Selection.Sort ステートメントはスキップすることがわかります。

SortText2 マクロには注目すべき重要な点がいくつかあります。

  • If と End If を使用して、Word でコードが処理されるかスキップされるかを制御できます。

  • If 行は Then というキーワードで終了します。

  • それぞれの If ごとに対応する End If が必要です。

  • このマクロでは Selection を 2 回使用しています。Selection.Paragraphs.Count は、ユーザーが選択したものについての情報を提供します。Selection.Sort は、選択されたテキストを並べ替えます。

次のコード例では、Else と MsgBox というキーワードを使用してユーザーに情報を提供するように、このマクロを拡張する方法を示します。

    Sub SortText3()
        If Selection.Paragraphs.Count > 1 Then
            ' The user has selected more than one paragraph of text.
            ' Sort the selection.
            Selection.Sort
        Else
            ' Tell the user what to do.
            MsgBox "Please select two or more paragraphs and try again."
        End If
    End Sub

このマクロから次のことがわかります。

  • If…Then、Else、および End If を使用して、Word でコードが処理されるかスキップされるかを制御できます。

  • Else ステートメントの使用はオプションです。それぞれの If ステートメントに対して、0 個または 1 個の Else ステートメントを使用できます。

  • Else を使用する場合も、End If が必要です。

  • このコマンドはユーザーにメッセージを表示します。MsgBox キーワードの後ろにメッセージのテキストを入力し、そのテキストを二重引用符で囲んでください。マクロ内にテキスト (たとえば、このメッセージのテキスト) を記述する場合は、そのテキストを二重引用符 (") で囲む必要があります。二重引用符がないと、Word は Word オブジェクト モデル内から、たとえば "Please" を探そうとします。Word には "Please" の意味がわからないので、マクロでエラー メッセージが出されることになります。

この問題を調べるには、次の手順を使用します。

SortText3 マクロをテストするには

  1. SortText3 マクロを起動するためにクイック アクセス ツール バーのボタンを作成します。Word でこのボタンを MyWordTools.dotm に保存します。

  2. このボタンをテストして、SortText3 マクロが間違いなく実行されることを確認します。

  3. MyWordTools.dotm ファイルを保存します。

  4. Word を終了して再起動します。

  5. ドキュメントを開いている場合は、それを閉じて、開いているドキュメントがない状態にします。

  6. 作成したクイック アクセス ツール バーのボタンを再度テストします。

エラー メッセージが表示されるはずです。このエラーが発生するのは、マクロの最初の行で Selection を参照しているからです。アドインが読み込まれます。Word のメイン ウィンドウ内に開いているドキュメントがないと、Selection は存在しません。Selection がなければ、Word はマクロ内のコードを実行できません。

このマクロを堅牢にするために、さらに変更を加えることにします。マクロの冒頭にコメントを追加します。このようにコメントを記述して、だれが見てもマクロでの意図がわかるようにしておくのが好ましいやり方です。

アドインの読み込みを解除し、そのファイルを編集用に開きます。既存のマクロを次のコード例に置き換えてください。

    Sub SortText()
    ' A macro to sort the selected text, if the user has selected 
    ' more than one paragraph
    
        If Documents.Count > 0 Then
            ' The user has at least one document open.
            
            If Selection.Paragraphs.Count > 1 Then
                ' The user has selected more than one paragraph
                ' of text, so sort it.
                Selection.Sort
            Else
                ' Tell the user what to do.
                MsgBox "Please select two or more paragraphs and try again."
            End If
        End If
    End Sub

これは SortText の最終バージョンです。この例では、ネストした If…End If ブロックを使用しています。コードの行をインデントすることが大切です。それぞれの If と、それに対応する End If とで、インデント レベルを一致させます。

マクロが堅牢でないと、次のような結果を引き起こす可能性があります。

  • エラー メッセージ (たとえば、Selection が使用されているのに、開いているドキュメントが存在せず、したがって Selection が存在しないとき)、または

  • 好ましくない動作 (たとえば、Selection.Sort コマンドによって、ユーザーが意図しないのにドキュメント全体が並べ替えられてしまう)

堅牢なマクロを記述するためのヒントを以下に示します。

  • マクロで Selection を参照する場合は、まずテスト用のドキュメントを作成します。それからマクロをテストしますが、マクロを実行する前に、そのドキュメント内のいくつかの異なる部分を選択します。つまり、テキストをまったく選択せずに単純にクリックするか、カーソルをドキュメントの先頭または終わりに移動するか、1 つの単語、複数の段落、図、表の一部または全部、ヘッダーまたはフッターのテキスト、脚注または文末脚注またはコメントのテキストなどを選択します。

  • ファイルを閉じ、それをアドインとして読み込み、マクロをテストして、開いているドキュメントがない場合にマクロが正常に動作することを確認します。開いているドキュメントがあるかどうかの検証には、If Documents.Count > 0 を使用します。

Word オブジェクト モデルについて学ぶ

ここまでで作成したマクロでは、3 つの重要な Word 要素を使用していました。

  • Options。これは Word を設定するために使用されるオプションを表します。

  • Documents。これは Word で現在開いているすべてのドキュメントを表します。ActiveDocument キーワードを使用すると、現在アクティブになっているドキュメントを表すことができます。

  • Selection。これはユーザーが ActiveDocument 内で選択したものを表します。それは 1 つの単語の場合もあれば、複数の段落や、図や、その他のコンテンツである場合もあります。

これらのマクロのそれぞれについて、次の下位レベル要素が使用されています。

これらの要素 (Options、Documents、Selection) は、"オブジェクト" と呼ばれ、Word オブジェクト モデルの一部になっています。

オブジェクト モデルは階層構造です。この階層構造には、マクロで制御しなければならない可能性がある Word のすべてのパーツが含まれています。たとえば、ActiveDocument オブジェクトは現在アクティブになっているドキュメントを表します。

現在のドキュメントに少なくとも 3 つの行と 2 つの列を持つ表が含まれているとします。次のようにすると、そのアクティブなドキュメントの最初の表の 3 番目の行の 2 番目のセルのテキストが表示されます。

    MsgBox ActiveDocument.Tables(1).Rows(3).Cells(2).Range.Text

マクロではオブジェクト (Selection オブジェクトや ActiveDocument オブジェクト) を操作できます。実は、オブジェクトにはメソッドとプロパティという 2 つの操作手段があります。

メソッドは動詞に似ており、動作を記述するものです。以下に例を示します。

  • ActiveDocument.PrintPreview

  • ActiveDocument.AcceptAllRevisionsShown

プロパティは形容詞に似ており、オブジェクトの特徴を記述するものです。以下に例を示します。

  • MsgBox ActiveDocument.Paragraphs(1).Range.Text

  • ActiveDocument.Paragraphs(1).Range.Text = "New text for Paragraph 1"

最初の例では、マクロが Text プロパティの "読み取り" を行い、そのテキストをメッセージ ボックスに表示します。2 番目の例では、マクロが Text プロパティの "書き込み" (設定) を行います。このコード行を実行すると、最初の段落の既存のテキストが "New text for Paragraph 1" に変更されます。

一般に、マクロではプロパティの "読み取り" または "書き込み" を行えます。ただし、読み取り専用のプロパティもあります。たとえば、Documents オブジェクトには .Count というプロパティがあります。次の例を見てください。

  • MsgBox Documents.Count ' Reports the number of currentlyopen documents.

  • Documents.Count = 4 ' Does not work: .Count is a readonly property.

ショートカット コードを記述する: 文字列表示範囲枠を切り替えるためのマクロ

大きなドキュメントを編集するときは、ドキュメント内に文字列表示範囲枠が表示されると便利です。校正するときは、文字列表示範囲枠がない方が作業しやすいと思います。そのため、筆者は文字列表示範囲枠の表示を 1 日に何度もオンにしたりオフにしたりすることがあります。そのためには、[ファイル] ボタンをクリックし、[ヘルプ] の下にある [オプション] をクリックします。[Word のオプション] ダイアログ ボックスで、[詳細設定] をクリックし、[構成内容の表示] の下にある [文字列表示範囲枠を表示する] をオン (またはオフ) にし、[OK] をクリックします。このような一連のマウス クリックを繰り返すのは苛立たしいことです。1 回のクリックで文字列表示範囲枠の表示をオン/オフできれば手間が省けます。

次のコード例は、文字列表示範囲枠の表示を切り替えるためのマクロです。

    Sub ToggleTextBoundaries1()
    ActiveDocument.ActiveWindow.View.ShowTextBoundaries = Not ActiveDocument.ActiveWindow.View.ShowTextBoundaries
    End Sub

この 1 行のコードは、Word にとってはそれほど長いものではないでしょうが、入力するのは大変ですし、人間にとって決して読みやすいとは言えません。このマクロを短くして読みやすくするには、次のコード例のように With キーワードを使用します。

    Sub ToggleTextBoundaries2()
        With ActiveDocument.ActiveWindow.View
            .ShowTextBoundaries = Not .ShowTextBoundaries
        End With
    End Sub

オブジェクト モデル内では、階層構造の各項目の間にピリオド (.) を使用して、オブジェクトから別のオブジェクトへと "ドリルダウン" することができます。ピリオドには子オブジェクトを親オブジェクトから区分する働きがあるので、With キーワードを使用しない限り、コード行をピリオドで始めることはできません。

With は End With ステートメントと対になっている必要があります。With と End With の間では、ピリオドを使用してショートカットを開始できます。

    With ActiveDocument.ActiveWindow.View
            ' Between With and End With you can use 
            ' a period to begin shortcut code.
            ' The shortcut will refer to ActiveDocument.ActiveWindow.View.
        End With

たとえば、With と End With の間では、ショートカット .ShowTextBoundaries は ActiveDocument.ActiveWindow.View.ShowTextBoundaries を表します。

同じオブジェクトを何度も参照するコードでは、With と End With を使用することで、入力の手間が減り、コードが読みやすくなります。

これはまだ堅牢なマクロではありませんが、次のコード例に示してあるような堅牢な最終バージョンを作成できます。

    Sub ToggleTextBoundaries()
        If Documents.Count > 0 Then
            With ActiveDocument.ActiveWindow.View
                .ShowTextBoundaries = Not .ShowTextBoundaries
            End With
        End If
    End Sub

これは ToggleTextBoundaries の最終バージョンです。If…End If ブロック内にネストした With…End With ブロックがあります。行のインデントによって、それぞれの With と該当する End With との対応関係を明確にし、それぞれの If ステートメントと該当する End If ステートメントとの対応関係を明確にすることが大切です。

With と Selection オブジェクトを使用する: 横セクションを挿入するためのマクロ

ここでは、With のより効果的な使用例として、カーソル位置に横セクションを挿入するためのマクロを紹介します。

このマクロでは、With キーワードを Selection オブジェクトに (つまり、With Selection として) 使用しています。マクロを書く腕前が上達するにつれて、Selection オブジェクトを使用する機会は減っていくでしょう。Range オブジェクトを使用する方が効果的なことが多いからです。このマクロをよく見ていけば、Word で Selection がどのように扱われているかを学ぶことができます。Word と VBE を左右に並べて表示してください。そして、このマクロ内をクリックし、 F8 キーを繰り返し押して、マクロ コードを 1 行ずつ実行していきます。そのとき、Word のメイン ウィンドウ内で何が起こるかを観察してください。

また、行数が多い場合は、このマクロでしているように、それらを論理的な "段落" に分け、コメントを付けてコードの目的を記述することをお勧めします。

    Public Sub InsertLandscapeSectionHere()
    ' Purpose: Insert a landscape section at the insertion point, 
    ' and insert text to tell the user where the landscape section is.
        If Documents.Count > 0 Then
            ' The user has a document open, so insert a 
            ' landscape section.
            With Selection
                ' Do not accidentally over-write selected text
                .Collapse Direction:=wdCollapseStart
    
                ' Insert section breaks with blank paragraphs
                ' in the new section.
                .TypeParagraph
                .Style = ActiveDocument.Styles(wdStyleNormal)
                .InsertBreak Type:=wdSectionBreakNextPage
                .TypeParagraph
                .TypeParagraph
                .TypeParagraph
                .InsertBreak Type:=wdSectionBreakNextPage
                .MoveUp Unit:=wdLine, Count:=3
    
                ' Set the orientation of new section to landscape.
                .PageSetup.Orientation = wdOrientLandscape
    
                ' Provide guidance to the user.
                .TypeText Text:="Your landscape section starts here."
            End With
        Else
            ' Tell the user what to do.
            MsgBox "Please open a document and try again."
        End If
    End Sub

このマクロでは、次のような 2 種類の構文を使用しています。

  1. 等号 (=) を使用した構文: Selection.PageSetup.Orientation = wdOrientLandscape

  2. コロンと等号 (=) を使用した構文: Selection.InsertBreak Type:=wdSectionBreakNextPage

これらの構文の相違点の詳細については、VBE ヘルプの記事「Understanding Visual Basic Syntax」を参照してください。

Word のマクロと Visual Basic Editor について学ぶ

Visual Basic Editor (VBE) には、独自のマクロを記述するのに役立つツールが含まれています。以下の点に留意してください。

  • Word のマクロの記録は強力なツールです。マクロを記述する必要があっても、Word オブジェクト モデルのどのパーツを使用すればよいのかわからない場合は、マクロの記録を使用するのが最善策です。詳細については、「Recording a Macro to Generate Code」および「How to modify a recorded macro」を参照してください。

  • Word オブジェクト モデル内のオブジェクトの名前 (Selection や ActiveDocument) を入力してからピリオド (.) を入力すると、Word でそのオブジェクトのプロパティとメソッドの一覧が表示されます。詳細については、「Getting to grips with VBA basics in 15 minutes」を参照してください。

  • VBE のイミディエイト ウィンドウを使用すると、Word オブジェクト モデルの詳細について学ぶことができ、単純なマクロをテストすることもできます。詳細については、「Extending Word 2007, Excel 2007, and PowerPoint 2007 with a Single Line of VBA Code」を参照してください。

  • VBE のメニューとツール バーはカスタマイズできます。たとえば、コメント用のキーボード ショートカットを作成すると便利です。それには、メニューまたはツール バーの近傍の何もない領域を右クリックし、[ユーザー設定] をクリックします。[ユーザー設定] ダイアログ ボックスの [ツールバー] タブで [編集] をオンにします。[ユーザー設定] ダイアログ ボックスを開いたままにしておきます。[編集] ツールバーの [コメント ブロック] ボタンを右クリックし、名前を &Comment に変更し、[イメージとテキストを表示] をクリックします。[非コメント ブロック] ボタンに対しても同じことを行い、名前を &Uncomment に変更します。このようにしておくと、複数行のコードを選択してから、キーボード ショートカットの Alt + C および Alt + U を使用して、選択したコードをコメント化したり、コメント化を解除したりできます。

  • VBE には大量のヘルプ情報が含まれています。これは Word オブジェクト モデルに関する主要な情報源となります。

    • 一般的な情報については、VBE の [ヘルプ] メニューで [Microsoft Visual Basic for Applications ヘルプ] をクリックします。クライアント ヘルプ ビューアーのツール バーにある小さな本のアイコンをクリックして、[目次] が表示されるようにしてください。これで開発者用ヘルプの参照がずっと直観的になります。特に [概念] の下の [Visual Basic Q & A 集] に記載されているトピックを読んでください。

    • Word オブジェクト モデルのキーワードやオブジェクト (ActiveDocument など) に関する詳細なヘルプについては、目的の語をクリックし、 F1 キーを押して、そのキーワードやオブジェクトに関するヘルプを読んでください。

まとめ

Word のマクロには長くて複雑で強力なものがあります。たとえば、外部データベースにアクセスし、計算を実行し、結果を Word に返すマクロを記述できます。Word で Excel、PowerPoint、または Outlook を制御するマクロを記述することもできます。また、単純なマクロでも有用で時間の節約になるものもあります。

マクロの目的がテキストを書式化することであれば、マクロを記述するよりもスタイルを作成する方がよいこともあります。マクロの目的がドキュメントのレイアウトを制御することであれば、新しいテンプレートを作成する方がよいこともあります。また、クイック アクセス ツール バーに追加できる組み込みコマンドが存在することもあります (クイック アクセス ツール バーをカスタマイズするときは、[コマンドの選択:] ボックスの一覧で [すべてのコマンド] をクリックします)。

マクロの作成を楽しんでください。ただし、もともと Word でできることを実行するマクロをわざわざ作成することのないように注意してください。

その他の技術情報

詳細については、次のリソースを参照してください。

著者について

Shauna Kelly は、政府機関および企業のユーザーが Word をより能率的に使用できるように、Word のアドインとテンプレートを開発しています。彼女は 2002 年から Microsoft Word MVP になっています。