みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
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枚目のスライドについて、フォントの種類と色を変更することができました。
ただ、このプロシージャ。4行目に「Slides(1)」とあるように、1枚目のスライド専用なんですね。
シェイプのフォントの変更について、全てのスライドに行えるようにするのが今回の目標です。
For Each文によるループ
オーソドックスにFor Each文をネストするというする方法が考えられます。
が、ネストの話の前に、いったんFor Each文自体について復習しておきましょう。
For Each文とは
まず、For Each文は以下書式で作られる反復、つまりループ用の構文です。
’処理
Next 変数
あるコレクションから一つずつオブジェクトを取り出し、全てのオブジェクトについて何らかの処理をするというような繰り返し処理を行うことができます。
詳細は以下の記事もご覧ください。
現在のコードには、以下のようなShapesコレクションについてのFor Eachループがありますので、確認しておきましょう。
’フォントの変更
Next Shapeオブジェクト
For Each文によるネスト
それで、ネストというのは、「入れ子」のことです。
上記のShapesコレクションについてのループを、さらにSlidesコレクションについてのFor Eachループでくるむんですね。
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ページ目のスライドも含めて、シェイプのフォントを変更することができます。
For文を使う方法
For文によるループ
今回は、別のループ用の構文をお伝えします。
以下のFor文という構文です。
’処理
Next カウント変数
For文は整数型のカウント変数が初期値から最終値になるまで繰り返しをするというループの構文です。
カウント変数は整数型の変数で、一般的には「i」を使います。
そのカウント変数について初期値がスタートの値となり、繰り返しのたびに自動で1ずつ増やされます。
そして、カウント変数の値が最終値に達したらループを終了する、というものです。
繰り返しの構文でいうと、For Each文よりFor文のほうがメジャーですかね…
コレクションについてのFor Each文をFor文に書き換える
それで、For Each文によるコレクションについてのループは、For文によるループに書き換えることができるんです。
ポイントは、カウント変数をインデックスとして使うという点です。
どんなコレクションであっても、インデックスを使用することができ、その最小値は1です。
では、その最大値はいくつかというと、そのコレクションの数ですから、例えばSlidesコレクションであれば
とすることで、取得することができるのです。
つまり、SlidesコレクションについてのループをFor文で作ろうとするならば
’処理
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の初め方についてお伝えしていきます。- 初心者向けPowerPoint VBAを始める際にはじめにやっておくべきセッティングと手順
- 【初心者向け】はじめてのPowerPoint VBAを作成して実行してみよう
- 【初心者向けPowerPoint VBA】オブジェクト・プロパティ・メソッドって何?
- PowerPoint VBAでアクティブなプレゼンテーションを取得する方法
- 【初心者向けPowerPoint VBA】SlidesコレクションとSlideオブジェクトを取得する
- PowerPoint VBAでShapeコレクションについてFor Eachループを回す方法
- 【初心者向けPowerPoint VBA】Shapeオブジェクトのテキストを取得する方法
- PowerPoint VBAでフォント設定をするFontオブジェクトを取得する
- PowerPoint VBAでシェイプのフォント設定をする色々なプロパティまとめ
- PowerPoint VBAのFor Each文とFor文によるループとその使い分けについて