PowerPoint 2010 VBA の基礎知識

概要: まだプログラミング経験のない PowerPoint パワー ユーザーを対象に、PowerPoint 2010 での Visual Basic for Applications (VBA) について説明します。内容は、VBA 言語の概要、PowerPoint 2010 で VBA を使用する方法、実際の PowerPoint VBA プログラミングでの問題に対する解決策の詳細な説明、プログラミングとデバッグについてのヒントなどです。

コミュニティ会員アイコン

この記事の内容
PowerPoint 2010 で VBA を使用する理由
VBA プログラミングの基礎
マクロと Visual Basic Editor
不要なものを削除するマクロ
オブジェクトの検索
例から学ぶ
マクロの作成
次のステップ

適用対象: Office 2010 | PowerPoint 2010 | VBA

公開:   2009 年 11 月

提供元:  Ben Chinowsky、SDK Bridge

目次

  • PowerPoint 2010 で VBA を使用する理由

  • VBA プログラミングの基礎

  • マクロと Visual Basic Editor

  • 不要なものを削除するマクロ

  • オブジェクトの検索

  • 例から学ぶ

  • マクロの作成

  • 次のステップ

PowerPoint 2010 で VBA を使用する理由

PowerPoint 2010 は、効果的で魅力的なプレゼンテーションを作成するために使用できる機能で満たされています。そのほとんどの機能は、ユーザー インターフェイスから簡単に確認できます。ただし、標準の PowerPoint ユーザー インターフェイス (UI) は充実した機能を供えていますが、それでも、毎日繰り返し行う作業や、UI が対応していないらしい処理を、簡単に実行できる手段が必要になる場合があります。そのようなときのために、PowerPoint などの Office アプリケーションには、アプリケーションを拡張できるプログラミング言語である Visual Basic for Applications (VBA) が用意されています。

VBA は "マクロ" を実行することで動作します。マクロとは、Visual Basic で記述された手順です。プログラミングの学習は難しく思えることがありますが、多少の忍耐力と、この記事にあるような例があれば、ほんの少し VBA のコードを学習するだけで、作業が簡単になり、それまでは不可能だと思っていた Office での処理を実行できることがわかります。ある程度 VBA のことがわかると、それ以降はもっと簡単に、より多くのことを学習できるようになります。つまり、可能性は無限です。

PowerPoint VBA を使用する最も一般的な理由は、繰り返し行う作業を自動化することです。たとえば、削除する必要のある多くの空のテキスト ボックスが含まれるプレゼンテーションがあるとします。各スライドを表示して、空の各テキストボックスの検索、選択、および削除を行う代わりに、PowerPoint VBA マクロでその処理を自動で行うことができます。

PowerPoint VBA を使用するもう 1 つの一般的な理由は、新しい機能を PowerPoint に追加することです。たとえば、用意したスライドの数に関係なく、プレゼンテーションのちょうど中間で実行する VBA マクロを作成し、プレゼンテーションのために残した時間をポップアップ メッセージで表示できます。

PowerPoint VBA を使用する理由は他にもたくさんあります。中でも、他の Office アプリケーションと共に動作する PowerPoint に関係する作業を実行することです。たとえば、プレゼンテーションからすべてのテキストを、Microsoft Excel 2010 で開くことができるコンマ区切り値ファイル (CSV) に格納できます。

注意

一部の Office アプリケーションでは、マクロ記録を実行して VBA マクロを作成できます。具体的には、ユーザーがいくつかの処理を実行すると、マクロ記録がその処理を記録します。これにより、ユーザーは後でその処理を再生できます。PowerPoint 2010 にマクロ記録はありません。したがって、VBA コードを記述することがマクロを作成する唯一の方法です (PowerPoint 2010 の Visual Basic エディターを使用して以前のバージョンの PowerPoint で記録または記述されたマクロを編集することはできます)。

この記事では、プレゼンテーション内のすべての空のテキスト ボックスを削除するマクロを開発することで、PowerPoint VBA を紹介します。

VBA プログラミングの基礎

コードを使用してアプリケーションに処理を実行させる

コードを記述することは謎の多い難解な作業に思われることもありますが、その基本原理は日常的論理に基づいていて非常に簡単に習得できるものです。Office 2010 アプリケーションは、命令を受け取ることができる "オブジェクト" という概念を公開するように開発されています。アプリケーションとやり取りするには、そのアプリケーションに含まれる各種オブジェクトに命令を送ります。さまざまな多くの柔軟なオブジェクトが用意されていますが、それぞれに制約があります。各オブジェクトはデザインされている機能だけを実行でき、命令されたことだけを実行します。

オブジェクト モデル

プログラミング オブジェクトは、アプリケーションの "オブジェクト モデル" と呼ばれる階層で、相互に体系的に関連しあっています。オブジェクト モデルは、ユーザー インターフェイスで表示されるものをほぼ反映しています。たとえば、PowerPoint オブジェクト モデルには、Application、Presentation、および Slide オブジェクトなど、多数のオブジェクトが含まれます。オブジェクト モデルは、アプリケーションとその機能の概念的な地図です。

プロパティとメソッド

オブジェクトは、"プロパティ" を設定して "メソッド" を呼び出すことで操作できます。プロパティを設定すると、オブジェクトの一部の性質が変化します。メソッドを呼び出すと、オブジェクトは何らかのアクションを実行します。たとえば、Slide オブジェクトには、スライドのコピーをクリップボードに配置する Copy メソッド、およびスライドのレイアウトを表す Layout プロパティがあります。

コレクション

多くのオブジェクトには単数バージョンと複数バージョンがあります。たとえば、Presentation と Presentations、Slide と Slides などです。複数バージョンは "コレクション" と呼ばれます。コレクション オブジェクトは、コレクション内の複数の項目に対してアクションを実行するために使用されます。この記事では、Slides コレクションを使用して、プレゼンテーション内の各スライド上にある不必要なオブジェクトを削除する方法を説明します。

マクロと Visual Basic Editor

ここまで、Microsoft PowerPoint 2010 がオブジェクト モデルを公開する仕組みについて学習しました。ここで、オブジェクト メソッドを呼び出し、オブジェクト プロパティを設定してみましょう。そのためには、Office が認識できる場所と方法でコードを記述する必要があります。通常は Visual Basic Editor を使用します。Visual Basic Editor は既定でインストールされますが、多くのユーザーはリボンで Visual Basic Editor が有効になるまで、それを使用できることも気付いていません

[開発] タブ

すべての Office 2010 アプリケーションでリボンが使用されます。リボンのタブの 1 つに [開発] タブがあり、ここから Visual Basic Editor や他の開発者ツールにアクセスできます。Office 2010 では [開発] タブは既定では表示されないので、次の手順を完了してそのタブを有効にする必要があります。

[開発] タブを有効にするには

  1. [ファイル] タブの [オプション] を選択して、[PowerPoint のオプション] ダイアログ ボックスを表示します。

  2. ダイアログ ボックスの左側にある [リボンのユーザー設定] をクリックします。

  3. ダイアログ ボックスの左側にある [コマンドの選択] で、[基本的なコマンド] を選択します。

  4. ダイアログ ボックスの右側にある [リボンのユーザー設定] で、[メイン タブ] を選択し、次に [開発] チェック ボックスをオンにします。

  5. [OK] をクリックします。

PowerPoint で [開発] タブが表示されたら、そのタブ上の [Visual Basic]、[マクロ]、[マクロのセキュリティ] の各ボタンの位置を確認してください。

図 1. PowerPoint 2010 での [開発] タブ

PowerPoint 2010 の [開発] タブ

セキュリティの問題

実行できるマクロおよび実行条件を指定するには、[マクロのセキュリティ] ボタンをクリックします。悪質なマクロ コードはコンピューターに重大な損傷を与える可能性がありますが、役に立つマクロの実行を妨げるようなセキュリティ条件では生産性が制限される可能性があります。マクロのセキュリティは非常に複雑ですが、PowerPoint マクロを使用する場合は研究して理解する必要があります。

この記事に関しては、マクロを含むブックを開いたときにリボンとワークシートの間に [セキュリティの警告: マクロが無効にされました] というバーが表示される場合は、[コンテンツの有効化] ボタンをクリックしてマクロを有効にできることを覚えておいてください。

また、セキュリティ対策として、マクロを既定の PowerPoint プレゼンテーション形式 (.pptx) で保存することはできません。代わりに、マクロは、特別な拡張子 .pptm を持つファイルに保存する必要があります。

Visual Basic Editor

[開発] タブを表示した後、Visual Basic Editor を開くことができます。これは、PowerPoint の VBA コードを記述したり編集したりするために使用する組み込みのツールです。

Visual Basic Editor で新しいマクロを作成するには

  1. [開発] タブの [マクロ] ボタンをクリックします。

  2. 表示される [マクロ] ダイアログ ボックスで、[マクロ名] に「Hello」と入力します。

  3. [作成] をクリックすると、Visual Basic Editor が開き、そこに新しいマクロのアウトラインが既に入力されています。

VBA は機能を網羅したプログラミング言語であり、それに対応してプログラミング環境にもあらゆる機能が用意されています。ここではプログラミングに着手するために使用するツールのみを説明し、Visual Basic Editor のほとんどのツールにはふれません。Visual Basic Editor の左側にある [プロパティ] ウィンドウを閉じ、コードの上部に表示される 2 つのドロップダウン リストは無視してください。

図 2. Visual Basic Editor

Visual Basic Editor

Visual Basic Editor には次のコードが表示されます。

Sub Hello()

End Sub

Sub は "サブルーチン" を意味し、ここではこれを "マクロ" として定義できます。Hello マクロを実行すると、Sub Hello() と End Sub の間に記述されたすべてのコードが実行されます。

以下のコードのように、このマクロを編集します。

Sub Hello()
   MsgBox("Hello world")
End Sub

PowerPoint の [開発] タブに戻り、もう一度 [マクロ] をクリックします。表示される一覧から Hello マクロを選択し、[実行] をクリックすると、"Hello world" というテキストが含まれる小さなメッセージ ボックスが表示されます。

これで、PowerPoint にカスタム VBA コードを作成して実装することができました。[OK] をクリックすると、メッセージ ボックスが閉じてマクロの実行が完了します。

メッセージ ボックスが表示されない場合は、マクロのセキュリティの設定を確認してから PowerPoint を再起動してください。

マクロを使いやすくする

[表示] タブから [マクロ] ダイアログ ボックスを表示することもできますが、頻繁に使用するマクロは、キーボード ショートカットまたはクイック アクセス ツール バーのボタンから実行できるようにすると便利です。

クイック アクセス ツール バーHello マクロのボタンを作成するには、以下の手順に従います。

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

  1. [ファイル] タブをクリックします。

  2. [オプション] をクリックして [PowerPoint のオプション] ダイアログ ボックスを表示し、次に [クイック アクセス ツール バー] をクリックします。

  3. [コマンドの選択] の一覧から [マクロ] を選択します。表示される一覧で "Presentation1!Hello" のようなテキストを探し、そのテキストを選択します。

  4. [追加 >>] をクリックしてマクロを右側の一覧に追加し、次に [変更…] ボタンをクリックして、このマクロと関連付けるボタン イメージを選択します。

  5. [OK] をクリックします。[ファイル] タブの上のクイック アクセス ツール バーに新しいボタンが表示されます。

これで、[開発] タブを使用しなくても、作成したマクロをいつでも実行できるようになりました。試してみてください。

不要なものを削除するマクロ

プレゼンテーション上でしばらくの間作業すると、そのプレゼンテーションに不必要な空のテキスト ボックスが含まれることがあります。たとえば、今後使用すると考えてテキストボックスを追加したけれど、使用しなかった場合があります。また、テキスト ボックスが意図せずに追加された場合もあります。

このような空のテキスト ボックスを削除するには、プレゼンテーションをくまなく調べて空のテキスト ボックスをすべて手動で削除するか、その処理を自動で実行するマクロを記述することができます。マクロでは、空の非表示のテキスト ボックスも削除できます。

以下のセクションの手順に従って、このマクロを作成して実装できます。

オブジェクトの検索

新しい PowerPoint マクロを作成する場合、最適な開始場所は、「PowerPoint Object Model Reference」です。これは、Microsoft Developer Network (MSDN) の「PowerPoint 2007 Developer Reference」の一部です。「Object Model Reference」では、使用可能なオブジェクト、プロパティ、およびメソッドについて説明されているほかに、それらの使用法に関する多くの例が提供されています。

図 3. PowerPoint Object Model Reference

PowerPoint オブジェクト モデルの参照情報

これらの参考資料は、PowerPoint 2010 が公開リリースされた時点で更新される予定ですが、「PowerPoint 2007 Developer Reference」は PowerPoint 2010 のほとんどの目的に適しています。もう 1 つの重要な資料として、「Visual Basic for Applications Language Reference」があります。これも、「PowerPoint 2007 Developer Reference」から利用できます。

プレゼンテーションから空のテキスト ボックスを削除するための最初の作業は、PowerPoint オブジェクト モデルに TextBox オブジェクトがあるかどうかを確認することです。[PowerPoint Object Model Reference] をクリックして、PowerPoint のすべてのオブジェクトの一覧を表示します。

TextBox オブジェクトはありませんが、TextFrame と呼ばれるオブジェクトがあります。TextFrame のトピックには、TextFrame オブジェクトは "Shape オブジェクト内のレイアウト枠を表す" と記述されています。したがって、Shape オブジェクトが開始場所になる可能性があります。

TextFrame のトピックをさらに下にスクロールすると、"HasText プロパティを使用して、レイアウト枠にテキストが含まれているかどうかを確認" できることが記述されています。空のテキストボックスを探して削除するのに、このオブジェクトを使用できそうです。このオブジェクトをメモしておきます。さらに、Shapes に関して他に見つけたものを確認します。

Shape Object トピックをクリックし、次に Shape Object Members サブトピックをクリックします。Shape をテキスト ボックスとして使用できることを示している情報を探します。メソッドとは、Shape で "実行" できる処理です。ただし、探しているのは、Shape の "状態 " です。したがって、Properties まで下にスクロールします。

Shape オブジェクトには、Type と呼ばれる Property があります。Type のリンクをクリックして、さまざまな種類の Shapes を表す定数のリストを表示します。これらの定数のうち、リストには msoTextBox という定数が含まれます (mso というプレフィックスは、その定数が、PowerPoint だけでなくすべての Office アプリケーションで使用できる Microsoft Office タイプであることを示しています)。

たとえば、Property の使用法の例として、Shape.Type Property トピックの一番下までスクロールします。

For Each sld In ActivePresentation.Slides
    For Each sh In sld.Shapes
        If sh.Type = msoLinkedOLEObject Then
            If sh.OLEFormat.ProgID = "Excel.Sheet" Then
                sh.LinkFormat.AutoUpdate = ppUpdateOptionManual
            End If
        End If
    Next
Next

例から学ぶ

Shape.Type のトピックには、"この例は、アクティブなプレゼンテーション内にあるすべてのスライドのすべての図形をループ処理して、リンク先の Microsoft Office Excel ワークシートを手動で更新するように設定する" と記述されています。

このセクションでは、コードでその作業をどのように実行するかについて説明します。

If…Then

Type を使用する以下のコード行を詳しく見てみましょう。

        If sh.Type = msoLinkedOLEObject Then

数行下に、同じインデントレベルで次の行があります。

        End If

これは、If…Then ステートメントの例です。このステートメントは、最も基本的なプログラミング構造体の 1 つであるとともに、最も理解しやすいプログラミング構造体の 1 つでもあります。If…Then ステートメントは、If 行の条件が真の場合に限り、If と End If の間の行に記述されたすべての処理を実行するように PowerPoint に指示します。この例では、その条件は次のコードです。

        sh.Type = msoLinkedOLEObject

このコードを参考にすると、プレゼンテーションからテキスト ボックスを削除するマクロの条件は、次のようなコードになる可能性があります。

        sh.Type = msoTextBox

If…Then ステートメントの詳細については、「VBA Language Reference」の「Visual Basic Conceptual Topics」セクションを参照してください (完全な名前は、If…Then…Else ステートメントです。Else はオプションのコンポーネントであり、ここでは必要とされません)。

For Each…Next

このサンプル コードも、特に Shapes を操作する場合の PowerPoint VBA プログラミングの一般的なパターンを示しています。具体的には、このステートメントは、"アクティブなプレゼンテーション内にあるすべてのスライドのすべての図形をループ処理する" と記述されています。"ループ"とは、処理を繰り返すことを意味します。その特別な種類のループが For Each…Next ループです。

For Each sld In ActivePresentation.Slides
    For Each sh In sld.Shapes
    Next
Next

プログラミングの基礎であるとともに理解しやすいもう 1 つの構造体は、For Each…Next ループです。コード内で、この 2 つのループは、単語 'For Each' で始まり、単語 'Next' で終了します。ここでは、For Each…Next ループの 1 つがもう一方の内側にあります。つまり、プログラミング用語では "ネスト" されています。外側のループでは、次のコードでプレゼンテーション内の各スライドが検査されます。

For Each sld In ActivePresentation.Slides

ここで、sld は、"変数" です。つまり、ループによって検証されるあらゆるスライドのプレースホルダーです。ActivePresentation は、アクティブな PowerPoint プレゼンテーションを表すオブジェクトであり、Slides は、ここでは、アクティブなプレゼンテーション内のすべてのスライドを表すコレクション オブジェクトです。

内部ループでは、次のコードを使用してスライド上の各図形が検査されます。

    For Each sh In sld.Shapes

sh はもう 1 つの変数です。ただし、その役割りは、ループによって検証される図形のプレースホルダーとしての機能を提供することです。sld 変数は前と同じです。この変数は、現在のスライドを表します。また、Shapes は、ここでは、現在のスライド上のすべての Shapes を表す別のコレクション オブジェクトです。

やろうとしていることに似た処理を行うサンプル コードが常に見つかるとは限りませんが、ほとんどの場合、それを見つけることができます。「Object Model Reference」は、調べる場所として最も適切な場所の 1 つです。「Object Model Reference」を使用して、どのような処理が呼び出されているか、およびそれらがどのように使用されているかを確認してください。特定の方法で、何か (Type プロパティなど) を使用する場合 (たとえば、各 Slide 上の各 Shape の Type を確認する場合)、他の誰かが同じことを既に行っており、「Object Model Reference」に文書化されている可能性が大いにあります。

マクロの作成

PowerPoint を開始して、新しいプレゼンテーションを PowerPoint マクロ有効プレゼンテーション (*.pptm) として保存します。次に、ClutterRemover という新しいマクロを作成し、以下のコードを入力します。

For Each SlideToCheck In ActivePresentation.Slides
    For Each ShapeToCheck In SlideToCheck.Shapes
        ShapeToCheck.Delete
    Next
Next

ActivePresentation の後にピリオドを入力すると、Visual Basic Editor は、ActivePresentation オブジェクトで使用できるすべてのプロパティとメソッドの一覧を含むポップアップを表示します。これは IntelliSense テクノロジの例です。つまり、Visual Basic Editor は、ユーザーが行おうとしていることを判別し、それに対応して、適切なオプションの一覧を提示します。一覧からオプションを選択しても、そのまま入力を続けても、どちらでもかまいません。

入力したコードを詳しく見てみましょう。例のようなネストされたループをセットアップしましたが、sld と sh の代わりに、コードで何を処理しようとしているかを連想するのに役立つ長い変数名を使用します。短い変数名を好むプログラマーもいますが、変数が何を表しているかを簡単に把握できる長い明示的な名前を好むプログラマーもいます。後者の方法では、コードが理解しやすくなるため、コードを学習する場合は後者を使うほうが適切です。

これまでのところ、ループの内側には次のコードが含まれます。

        ShapeToCheck.Delete

たとえば, .Remove や .GetRidOf ではなく、なぜ Delete なのでしょうか。Shape オブジェクトからテキスト ボックスを削除することは 1 つの操作です。したがって、「Object Model Reference」で Shape オブジェクトの「Methods」を調べます。Cut と Delete の 2 つも可能性がありますが、削除した Shapes をクリップボードに配置する必要がないため、Delete の選択が妥当です。

If…Then ステートメントはまだ追加しないでください。まず、図形の削除方法を認識していることを確認します。プログラミングでは、多くの処理を同時に試みないことが推奨されます。既に、ネストされた For Each ループをテストする必要があります。If ステートメントも同時に動作しようとすると、追跡できないバグが生じるリスクが高まります。ShapeToCheck.Delete 行は、確認できる処理 (つまりテスト) をループで実行するための簡単な方法です。ループが正常に動作することを確認した後、空のテキスト ボックスのみを削除するように If 条件を追加できます。

[保存] ボタンをクリックし、Visual Basic Editor を閉じます。PowerPoint の既定のタイトル スライドを削除し、2 つの白紙のスライドを追加します。各スライドに 4 つの図形を配置します (種類をまだ確認していないため、顔文字、稲妻など、どの図形も配置できます)。次に、ClutterRemover マクロを実行します。

バグ

何が起きたのでしょう? 各スライドに 2 つの図形が依然として残っています。もう 1 度実行すると、各スライドに 1 つの図形が残っていることを確認できます。さらにもう 1 度実行すると、最終的にすべての図形が除外されます。何が起きているのでしょうか?

問題は、アイテムが削除されるたびにコレクションの番号が再設定されることです。アイテムのコレクションをループ処理し、最初のアイテムを削除した状況を考えます。アイテム#1 からループを開始して、そのアイテムを削除します。このとき、本来アイテム #2 であったアイテムはアイテム #1 になり、本来アイテム #3 であったアイテムはアイテム #2 になって、アイテム # は以下同様に変わります。ループが新しいアイテム #2 に移動すると、実際上、元のアイテム #2 はスキップされたことになります。

「Object Model Reference」のサンプル コードでは、ループで検査されるアイテムが削除されないため、この問題が生じません。ここでの問題は、サンプル コードに関する重要な点を表しています。つまり、必要とする処理に "似た" コードは簡単に見つかりますが、それが、必要とする処理に "一致する" とは限りません。テストを実行し、予想していなかった変更をいつでも加えるようにしてください。

バグ修正

カウント アップではなくカウント ダウンすることで、コードでアイテムがスキップされることを回避できます。たとえば、4 つのアイテムから #3 を削除するとします。#4 は #3 に再設定されますが、問題は生じません。ループをカウント アップする代わりにカウント ダウンする場合、ループは #4 ではなく #2 に移動するためです。

カウント ダウンするループを作成するには、For…Next ループと呼ばれる少し異なるプログラミング構造が必要です。コレクションの各メンバーには、インデックスと呼ばれる番号があります。For Each…Next ループが、単に、コレクションの各メンバーを検査して VBA にそのインデックスを処理させる場合、For…Next ループにインデックスを明示的に指定します。バグを修正するために必要なことは、このような制御の強化です。

Visual Basic Editor で、ClutterRemover マクロを開き、コードを以下のように変更します。

For Each SlideToCheck In ActivePresentation.Slides
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
        SlideToCheck.Shapes(ShapeIndex).Delete
    Next
Next

2 行目に、以下の For Each コードはありません。

    For Each ShapeToCheck In SlideToCheck.Shapes

代わりに、以下の For…Next コードが使用されています。

    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1

新しいコードでは、Shapes コレクションのメンバーをループ処理する方法が明示的に指定されます。ShapeIndex は、現在のインデックスを保持する変数です。つまり、ループで現在検査されている Shape の番号です。SlideToCheck.Shapes.Count には、Shapes コレクションに含まれるメンバーの合計数が指定されます。ループはこの番号から番号 1 に向かってカウントダウンします。"To 1" の命令によって、VBA は、コレクションの最初のメンバーまでカウントを続けます。また、"Step -1" の命令によって、VBA はカウント アップではなくカウントダウンします。

新しい ShapeIndex 変数が以前の ShapeToCheck 変数に取って代わり、ループの内側の Shapes を参照します。つまり、以下のコードがなくなります。

        ShapeToCheck.Delete

これは、新しい 3 行目のコードで置き換えられます。

        SlideToCheck.Shapes(ShapeIndex).Delete

コードでは、ShapeIndex 変数を使用して SlideToCheck.Shapes コレクションにインデックスが設定されます。また、以前のように Delete メソッドが使用されます。

スライドは削除しないため、外側の For Each ループのコードは同じです。スライドを削除する場合は、外側のループ内でカウント ダウンする For ループをここでも使用できます。

テストを再度セットアップして、新しいバージョンのマクロを実行します。今回のマクロでは、1 度目の実行ですべての Shapes が削除されます。

推奨プログラミング方法

VBA の中で必ずしも厳密に必要とはされませんが、強く推奨される 2 つのことは、コメントと変数宣言です。

アポストロフィで始まるすべてのコード行はコメントであり、マクロの処理に影響を与えません。コメントの主な使用法は次のとおりです。

  1. 作成者だけでなく、後でコードを変更する必要があるかもしれないすべての開発者が、コードを簡単に理解できるようにします。

  2. 一時的にコード行を無効にします ("コメント化" といいます)。

ここまでのマクロにいくつかのコメントを追加しました。

' Visit each slide
For Each SlideToCheck In ActivePresentation.Slides
    ' On each slide, count down through the shapes
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
        ' Delete all shapes
        SlideToCheck.Shapes(ShapeIndex).Delete
    Next
Next

マクロの先頭に "変数宣言" を追加することもお勧めします。変数宣言には、どのような種類のエンティティを変数が表しているかを指定します。変数宣言は VBA で必要とされませんが、変数宣言を使用すると、変数を追跡すること、およびコード内のバグを見つけ出すことが非常に容易になります。

Dim SlideToCheck As Slide
Dim ShapeIndex As Integer

Dim は、"ディメンション (Dimension)" の省略形であり、Slide および Integer は、それらの特別な変数が表すデータ型です。「As」と入力すると、Visual Basic Editor は、使用できるすべてのデータ型の一覧を含むポップアップを表示します。これは、IntelliSense テクノロジのもう 1 つの例です。つまり、Visual Basic Editor は、ユーザーが行おうとしていることを判別し、それに対応して、適切なオプションの一覧を提示します。一覧からオプションを選択しても、そのまま入力を続けても、どちらでもかまいません。また、オブジェクトの種類 (Slide など) と共に変数を宣言した場合、マクロ内の後でそのオブジェクトの変数を使用するときに、IntelliSense によって、そのオブジェクトに関連付けられたプロパティとメソッドの適切な一覧が表示されます。

If 条件の構築

ClutterRemover マクロを完了するための最後の作業は、すべての Shapes を削除するのではなく空のテキスト ボックスのみを削除する方法を見つけ出すことです。Shape を削除するために満たす必要のある条件が 2 つあります。それは、テキスト ボックスであること、および空であることです。

この記事の前半で説明したとおり、.Type プロパティを使用して、Shape がテキスト ボックスかどうかを判別できます。この情報から、以下のコードが提供されます。

SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox

その同じ説明に、TextFrame オブジェクトの .HasText プロパティを使用してテキストがあるかどうかを確認できることが示されています。

SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

Shape のレイアウト枠にテキストが "含まれない" 場合にのみ If 条件を満たす必要があるため、Not キーワードをコードに追加します。

Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

ここで、And キーワードを使用して 2 つの条件を 1 つに結合します (Not、And、および他の論理演算子の詳細については、「VBA Language Reference」を参照してください)。

SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

下線文字を使用すると、Visual Basic Editor 内で、コードの論理行を複数の物理行にわたって拡大できます。

最後に、If を論理行の先頭に追加し、Then を最後に追加します。また、コードを説明するコメントを追加します。

' If the shape IS a text box and DOES NOT have text
If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText Then

すべてをまとめる

最終的なマクロは以下のようになります。

Dim SlideToCheck As Slide
Dim ShapeIndex As Integer
' Visit each slide
For Each SlideToCheck In ActivePresentation.Slides
    ' On each slide, count down through the shapes
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
    ' If the shape IS a text box and DOES NOT have text
    If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
    Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText Then
        ' Delete the shape
        SlideToCheck.Shapes(ShapeIndex).Delete
    End If
    Next
Next

プレゼンテーションからすべてのスライドを削除し、タイトル スライドと 2 つの白紙のスライドを挿入します。2 つの白紙の各スライドに 4 つのテキスト ボックスを挿入し、テキスト ボックスに、表示されるアウトラインまたは塗りつぶしを設定します。次に、一部のテキスト ボックス (すべてのテキストボックスではない) に入力します。マクロを実行します。タイトル スライドの空のプレースホルダー ボックスとともに、空のテキストボックスがなくなり、空でないテキスト ボックスが残ります。

マクロは、テキストボックスの数とスライドの数に関係なく作業を実行します。

次のステップ

この記事の情報、実験、そして「Object Model Reference」および「VBA Language Reference」の学習を組み合わせると、VBA の習得を始める動機になった作業を実行するのに十分な情報が得られることがおわかりになったでしょうか。そうであれば、おめでとうございます。そうでない場合は、もっと範囲を広げて、VBA のさらに一般的な理解を深めることをお勧めします。

VBA についてさらに学習する方法の 1 つは、動作するコードを調べることです。「Object Model Reference」および「VBA Language Reference」の例だけでなく、MSDN の記事、PowerPoint を専門とする Microsoft Most Valuable Professional (MVP) が開いている Web サイト、Web を検索して見つかるものなど、さまざまなオンライン リソースから膨大な量の PowerPoint VBA コードを入手できます。

これらのリソースのコードは、今直面しているコーディングの問題の解決に役立つだけでなく、まだ考えたこともないプロジェクトのアイデアも提供してくれます。

もっと体系的に VBA を学習したい場合は、VBA についての優れた書籍が何冊も出版されています。これらの書籍については、Web でいくつものわかりやすいレビューが発表されているので、自分の学習スタイルに合った最適な本を決定するときの参考になります。