こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と頭を抱えていませんか?大丈夫です。ここをクリアすれば、あなたも立派なPowerPoint VBAの使い手になれますよ。
今回は、実務でめちゃくちゃ役立つ「非表示スライドのインデックスを高速で洗い出すユーティリティ関数」を一緒に作っていきましょう。
—
1. なぜ「非表示スライドの取得」が実務で重要なのか?
プレゼン資料を作っていると、「このスライドはバックアップ用だから、普段の発表では隠しておこう」「相手企業に合わせて一部のスライドだけスキップさせたい」という場面がありますよね。これがPowerPointの「非表示スライド(ShowInSlideShow = msoFalse)」機能です。
しかし、いざVBAでPDFの一括出力や、特定の配布資料用バッチ処理を作るとき、こんな問題にぶ和かります。
- 「あれ、全スライドをループさせると、隠したはずのスライドまで処理されちゃうぞ?」
- 「非表示のスライド番号だけをピンポイントで除外して、綺麗に処理を回したい!」
これを手動でやっていたら日が暮れてしまいます。だからこそ、「非表示になっているスライドのインデックス(何番目か)を、一瞬で配列として抜き出す専用の関数」を部品(ユーティリティ)として持っておく必要があるのです。
—
2. PowerPointオブジェクトモデルの基本と罠
コードを書く前に、PowerPoint VBAの「土地勘」を少しだけ養いましょう。WordやExcelと違って、PowerPointには独特の階層構造があります。
Application (PowerPointアプリ全体)
└ Presentation (開いているファイル)
└ Slides (スライドのコレクション=束)
└ Slide (個別のスライド)
ここでプログラミング初心者がやりがちな「重い処理の罠」があります。
それは、「VBAから無駄に画面(ウィンドウ)をチラチラ描き換えさせること」です。スライドを1枚ずつ選択して `Select` や `Activate` なんて書いていると、画面がパカパカ点滅して処理がもの凄く遅くなります。
今回紹介するコードでは、画面を一切いじらず、メモリ上だけで高速にスライドを走査します。これがプロのエンジニアの技です。
—
3. 実装コード:非表示スライド取得ユーティリティ
それでは、実際のコードを見てみましょう。
標準モジュールに以下のコードを貼り付けてください。そのままコピペして実務で使えるクオリティに仕上げています。
Option Explicit
/
- プレゼンテーション内の全スライドを走査し、
- 非表示に設定されているスライドのインデックスを動的配列で返す
- @param targetPres 対象のプレゼンテーションオブジェクト(省略時はアクティブプレゼンテーション)
- @return Long型の1次元動的配列(非表示が存在しない場合は要素数0の配列を返す)
/
Public Function GetHiddenSlideIndices(Optional ByVal targetPres As Presentation = Nothing) As Long()
‘ 1. 引数が省略された場合は、現在アクティブなプレゼンテーションを対象とする
If targetPres Is Nothing Then
Set targetPres = ActivePresentation
End If
Dim totalSlides As Long
totalSlides = targetPres.Slides.Count
‘ 非表示スライドが一つもなかった場合の「空の配列」を初期値として準備
Dim emptyResult() As Long
‘ スライドが1枚もない異常系へのガード
If totalSlides = 0 Then
GetHiddenSlideIndices = emptyResult
Exit Function
End If
‘ 2. 最大で全スライド分の要素を持つ一時的な動的配列を確保
ReDim tempIndices(1 To totalSlides) As Long
Dim i As Long
Dim hiddenCount As Long
hiddenCount = 0
‘ 3. 全スライドを高速走査
Dim currentSlide As Slide
For i = 1 To totalSlides
Set currentSlide = targetPres.Slides(i)
‘ スライドが非表示設定かどうかを判定
If currentSlide.SlideShowTransition.Hidden = msoTrue Then
hiddenCount = hiddenCount + 1
tempIndices(hiddenCount) = i ‘ インデックス番号を一時配列に格納
End If
Next i
‘ 4. 非表示スライドが一件もなかった場合の処理
If hiddenCount = 0 Then
GetHiddenSlideIndices = emptyResult
Exit Function
End If
‘ 5. 実際にヒットした数だけに配列のサイズを縮小(ReDim Preserveの妙技)
ReDim Preserve tempIndices(1 To hiddenCount)
‘ 6. 呼び出し元へ結果を返す
GetHiddenSlideIndices = tempIndices
End Function
—
4. コードの解説:ここがエンジニアのこだわりポイント!
このコードには、VBAを安定して高速に動かすためのエッセンスが詰まっています。ポイントを3つに分けて解説しますね。
① `Optional ByVal targetPres As Presentation`
関数を汎用的に使うため、「どのファイル(Presentation)を検査するか」を引数で渡せるようにしています。もし引数を省略して `GetHiddenSlideIndices()` とだけ呼んでも、自動的に「今開いているファイル」を対象にしてくれる賢い設計です。
② `ReDim Preserve` による動的配列のメモリ最適化
最初は「最大で全スライド分のサイズ」で配列を確保しておき、ループを抜けた後に `ReDim Preserve` を使って「実際に非表示だった数」にサイズをピタッと縮小させています。
これにより、メモリを無駄に消費せず、かつ呼び出し元で `UBound()`(配列の最後の要素番号)を使ったループ処理が非常に書きやすくなります。
③ `.SlideShowTransition.Hidden` の正確なキャッチ
PowerPointでスライドが非表示かどうかを判定する正しいプロパティは `SlideShowTransition.Hidden` です。これが `msoTrue` であるものを正確に拾い上げています。
—
5. 動作確認用テストマクロ(どうやって使うの?)
上記の関数をただ置いておくだけでは動きません。実際にこの関数を呼び出して、結果をイミディエイトウィンドウに出力するテスト用マクロもセットで用意しました。
Public Sub Test_GetHiddenSlideIndices()
‘ ユーティリティ関数を呼び出して、非表示スライドの配列を受け取る
Dim hiddenIndices() As Long
hiddenIndices = GetHiddenSlideIndices()
‘ 配列の下限から上限までデータをチェック
‘ (※非表示がない場合はエラーを防ぐために判定を入れる)
On Error GoTo NoHiddenSlides
Dim i As Long
Debug.Print “=== 非表示スライドの検索結果 ===”
For i = LBound(hiddenIndices) To UBound(hiddenIndices)
Debug.Print “非表示スライドを発見: インデックス ” & hiddenIndices(i) & ” 番”
Next i
Exit Sub
NoHiddenSlides:
Debug.Print “このプレゼンテーションに非表示スライドはありません。”
End Sub
使い方:
1. PowerPointを開き、適当なスライドを何枚か作成して、そのうちの何枚かを「非表示スライド」に設定します(スライド一覧で右クリック >「スライド非表示」)。
2. VBAエディタ(Alt + F11)を開き、標準モジュールに上記の2つのコードを貼り付けます。
3. `Test_GetHiddenSlideIndices` の中にカーソルを置いた状態で、キーボードの `F5` を押して実行します。
4. 画面下部のイミディエイトウィンドウ(Ctrl + Gで見られます)に、非表示にしたスライドの番号がずらりと表示されます!
—
おわりに
お疲れ様でした!今回はPowerPoint VBAのオブジェクトモデルを正しく理解し、実務でそのまま使える「非表示スライド取得関数」を構築しました。
こうした「小さな部品(関数)」を綺麗に作れるようになると、将来的にPDFの一括変換ツールや、資料の自動クレンジングツールを作る際に見違えるほどスムーズに開発が進むようになります。
ここをクリアできれば、もうPowerPoint VBAの基礎はバッチリです!ぜひご自身の業務自動化ツールに組み込んで活用してみてくださいね。
