PowerPoint VBAのFor Each文とFor文によるループとその使い分けについて

loop

photo credit: Prayitno / Thank you for (12 millions +) view Electric Eel ~ Summer 2018 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

PowerPoint VBA初心者向けに、プレゼンテーションの全ての描画オブジェクトのフォントを変更するマクロの作り方をお伝えしています。

前回の記事はコチラ。

PowerPoint VBAでシェイプのフォント設定をする色々なプロパティまとめ
PowerPoint VBA入門編ということで、図形やテキストボックスのフォントを変更するマクロの作り方をお伝えしています。今回は、テキストのフォントを変更するいろいろなプロパティまとめをお伝えします。

1枚目のスライドのシェイプに関しては、フォントの変更をすることができるようになりました。

あとは、全てのスライドについて同様に処理できるようにしていけば良いですね。

それを題材に今回はループの構文について理解を深めていきましょう。

PowerPoint VBAのFor Each文とFor文のループの作り方、またその使い分けについてです。

では、行ってみましょう!

スポンサーリンク

前回のおさらい

では、まず前回のおさらいからです。

題材とするプレゼンテーションはコチラです。

プレゼンテーションの例

それで、前回作成したプロシージャがコチラですね。

Sub Shapesコレクションのループでフォントを設定()

Dim shp As Shape
For Each shp In ActivePresentation.Slides(1).Shapes
    With shp.TextFrame.TextRange.Font
        .Name = "Meiryo UI"
        .NameFarEast = "Meiryo UI"
        .Color = RGB(89, 89, 89)
    End With
Next shp

実行すると以下のように1枚目のスライドについて、フォントの種類と色を変更することができました。

PowerPoint VBAでフォント設定をした

ただ、このプロシージャ。4行目に「Slides(1)」とあるように、1枚目のスライド専用なんですね。

シェイプのフォントの変更について、全てのスライドに行えるようにするのが今回の目標です。

For Each文によるループ

オーソドックスにFor Each文をネストするというする方法が考えられます。

が、ネストの話の前に、いったんFor Each文自体について復習しておきましょう。

For Each文とは

まず、For Each文は以下書式で作られる反復、つまりループ用の構文です。

For Each 変数 In コレクション
 ’処理
Next 変数

あるコレクションから一つずつオブジェクトを取り出し、全てのオブジェクトについて何らかの処理をするというような繰り返し処理を行うことができます。

詳細は以下の記事もご覧ください。

PowerPoint VBAでShapeコレクションについてFor Eachループを回す方法
初心者向けPowerPoint VBAの入門シリーズをお伝えしています。今回は、PowerPoint VBAでFor Eachループを使って、コレクション内のShapeオブジェクトを取得する方法です。

現在のコードには、以下のようなShapesコレクションについてのFor Eachループがありますので、確認しておきましょう。

For Each Shapeオブジェクト In Shapesコレクション
 ’フォントの変更
Next Shapeオブジェクト

For Each文によるネスト

それで、ネストというのは、「入れ子」のことです。

上記のShapesコレクションについてのループを、さらにSlidesコレクションについてのFor Eachループでくるむんですね。

For Each Slideオブジェクト In Slidesコレクション
 For Each Shapeオブジェクト In Shapesコレクション
  ’フォントの変更
 Next Shapeオブジェクト
Next Slideオブジェクト

とすれば良いわけです。

そうすれば、これで「全てのスライド×全てのシェイプ」のフォント変更が可能になります。

なお、ネストした場合は、その分インデントを加えておきましょう。インデントをちゃんとするかどうかは、コードの読みやすさに大きな影響を与えますので、大事にしてください。

全てのシェイプのフォント設定を変更するプロシージャ

コードとしては以下のようになります。

Sub 全てのシェイプのフォントを設定()

Dim sld As Slide, shp As Shape
For Each sld In ActivePresentation.Slides
    For Each shp In sld.Shapes
        With shp.TextFrame.TextRange.Font
            .Name = "Meiryo UI"
            .NameFarEast = "Meiryo UI"
            .Color = RGB(89, 89, 89)
        End With
    Next shp
Next sld

End Sub

実行すると、以下のように2ページ目のスライドも含めて、シェイプのフォントを変更することができます。

PowerPoint VBAで全てのシェイプのフォント設定を変更

For文を使う方法

For文によるループ

今回は、別のループ用の構文をお伝えします。

以下のFor文という構文です。

For カウント変数 = 初期値 To 最終値
 ’処理
Next カウント変数

For文は整数型のカウント変数が初期値から最終値になるまで繰り返しをするというループの構文です。

カウント変数は整数型の変数で、一般的には「i」を使います。

そのカウント変数について初期値がスタートの値となり、繰り返しのたびに自動で1ずつ増やされます。

そして、カウント変数の値が最終値に達したらループを終了する、というものです。

繰り返しの構文でいうと、For Each文よりFor文のほうがメジャーですかね…

コレクションについてのFor Each文をFor文に書き換える

それで、For Each文によるコレクションについてのループは、For文によるループに書き換えることができるんです。

ポイントは、カウント変数をインデックスとして使うという点です。

どんなコレクションであっても、インデックスを使用することができ、その最小値は1です。

では、その最大値はいくつかというと、そのコレクションの数ですから、例えばSlidesコレクションであれば

Slidesコレクション.Count

とすることで、取得することができるのです。

つまり、SlidesコレクションについてのループをFor文で作ろうとするならば

For カウント変数 = 1 To Slidesコレクション.Count
 ’処理
Next カウント変数

とすれば良いわけです。

For文を使った場合のフォント変更プロシージャ

For文を使った場合のプロシージャはコチラです。

Sub 全てのシェイプのフォントを設定()

Dim i As Long, shp As Shape
With ActivePresentation
    For i = 1 To .Slides.Count
        For Each shp In .Slides(i).Shapes
            With shp.TextFrame.TextRange.Font
                .Name = "Meiryo UI"
                .NameFarEast = "Meiryo UI"
                .Color = RGB(89, 89, 89)
            End With
        Next shp
    Next i
End With
End Sub

With文も増やしたのでだいぶネストが深くなっちゃいましたね。

読みやすさでいうとFor Each文のネストのほうが良さそうです。

For文を使うべきときとその理由

ただ、場合によってはFor文を使うべきときがあります。

それは、「インデックス通りの順番で処理したいとき」です。

For Each文でのループは、その実行順序は保証されていないんですね。経験則で概ねインデックス通りに実行されるのですが、保証はされていません。

一方でFor文を使う場合は、カウント変数は初期値から最終値まで1ずつ増えるということが保証されている、すなわちインデックス順に処理がされることが保証されているのです。

ですから、確実にインデックス通りにループ処理をしたい場合はFor文を使う必要があります。

まとめ

以上、PowerPoint VBAのFor Each文とFor文について、またその使い分けについてお伝えしました。

For Each文もFor文も、いずれも非常に重要な構文ですので、ぜひ使いこなしてくださいね。

本シリーズはいったんこちらで終了です。

別シリーズでまた便利なマクロの作り方を紹介していきます。

どうぞお楽しみに!

連載目次:初心者向けPowerPoint VBAのはじめの一歩

PowerPointはお仕事で非常によく使うプレゼンテーション作成ソフトですよね。実は、PowerPointでもVBAでプログラミングができるんです。本シリーズでは、初心者向けにPowerPoint VBAの初め方についてお伝えしていきます。
  1. 初心者向けPowerPoint VBAを始める際にはじめにやっておくべきセッティングと手順
  2. 【初心者向け】はじめてのPowerPoint VBAを作成して実行してみよう
  3. 【初心者向けPowerPoint VBA】オブジェクト・プロパティ・メソッドって何?
  4. PowerPoint VBAでアクティブなプレゼンテーションを取得する方法
  5. 【初心者向けPowerPoint VBA】SlidesコレクションとSlideオブジェクトを取得する
  6. PowerPoint VBAでShapeコレクションについてFor Eachループを回す方法
  7. 【初心者向けPowerPoint VBA】Shapeオブジェクトのテキストを取得する方法
  8. PowerPoint VBAでフォント設定をするFontオブジェクトを取得する
  9. PowerPoint VBAでシェイプのフォント設定をする色々なプロパティまとめ
  10. PowerPoint VBAのFor Each文とFor文によるループとその使い分けについて
タイトルとURLをコピーしました