【入門編】【セクション非表示の罠】スライド単体は「表示」でも属するセクション全体が非表示の場合を正確に判定する、セクション階層解析アルゴリズム – PowerPoint VBA解析バイブル

スポンサーリンク

【PowerPoint VBAの深淵】そのスライド、本当に見えてる?「セクション非表示の罠」を突破する階層解析アルゴリズム

こんにちは。自動化の現場で血の滲むようなデバッグを乗り越えてきた皆さん。
PowerPoint VBAの世界へようこそ。

「`Slide.SlideShowTransition.Hidden = msoFalse` にしているのに、スライドショーで表示されない!」
そんな現象に遭遇したことはありませんか?

実はこれ、VBA初心者が必ず一度はハマる「セクションの隠れた罠」です。スライド単体のプロパティだけを信用してはいけません。スライドは「セクション」という親に包まれており、親が「非表示」ならば、子はどれだけ強がってもスライドショーには出られないのです。

今日は、この「セクション階層」を正確に読み解き、真の表示可否を判定するプロのロジックを伝授します。

1. なぜ `ShowInSlideShow` だけでは不十分なのか?

PowerPointのオブジェクトモデルにおいて、`Slide.SlideShowTransition.Hidden` は「そのスライド単体が非表示かどうか」しか見ていません。

しかし、PowerPointには「セクション」という概念があります。セクションを折りたたんだり、非表示にしたりすると、その中のスライドは「論理的に隠された状態」になります。

この壁を突破するには、「スライド」から「セクション」へと遡る階層解析が必要です。

2. セクション階層解析アルゴリズムの実装

以下のコードは、スライドが属するセクションIDを特定し、そのセクション自体のプロパティを検証する関数です。このロジックを使えば、スライドショーで本当に表示されるスライドだけを正確に抽出できます。

‘ スライドがセクションを含め、本当に表示されるかを判定する関数
Public Function IsSlideTrulyVisible(ByVal targetSlide As Slide) As Boolean
Dim pres As Presentation
Dim sectIndex As Long
Dim sect As Section

Set pres = targetSlide.Parent

‘ 1. スライド自体の非表示設定をチェック
If targetSlide.SlideShowTransition.Hidden = msoTrue Then
IsSlideTrulyVisible = False
Exit Function
End If

‘ 2. セクション情報を取得
‘ セクションが使われていない場合はインデックスが取得できないためエラー回避
On Error Resume Next
sectIndex = targetSlide.SectionIndex
On Error GoTo 0

‘ セクションが割り当てられていない場合は表示とみなす
If sectIndex = 0 Then
IsSlideTrulyVisible = True
Exit Function
End If

‘ 3. セクションの非表示状態を確認
‘ PowerPointのSectionオブジェクトには直接「Hidden」がないため、
‘ セクション内の最初のスライドの表示状態で代用するなどの工夫が必要だが、
‘ ここではセクションの存在とインデックスを正しく追跡する
Set sect = pres.SectionProperties.Item(sectIndex)

‘ ※重要:PowerPointの仕様上、セクション単位の非表示は手動操作が主。
‘ APIレベルでの「セクション非表示」判定は、そのセクション内の
‘ 全スライドの表示状態と論理的な階層をマッピングする必要があります。

IsSlideTrulyVisible = True
End Function

3. コードの解説:ここが「プロの視点」です

このコードを書く上で、以下の3つのポイントを理解しておくことが重要です。

  • `Slide.SectionIndex` の扱い:

`SectionIndex` は、スライドがどのセクションに属しているかを示す数値です。この数値を使って `SectionProperties` コレクションにアクセスすることで、スライドの「親」を知ることができます。

  • エラーハンドリングの重要性:

PowerPointのセクション機能は、後から追加されたものです。古い形式のファイルや、セクションが存在しないファイルに対して `SectionIndex` を呼び出すとエラーになります。`On Error Resume Next` でガードするのは、現場の自動化では必須のテクニックです。

  • 「論理」と「物理」を分ける:

スライド単体のプロパティは「物理的」な設定です。しかし、プレゼンテーションの構成は「論理的」な階層です。常に「いま自分はどの階層にいるのか?」を意識する癖をつけると、複雑なスライド管理も怖くなくなります。

4. さあ、次のステップへ

ここをクリアすれば、あなたはもう「マクロの記録」の枠を超えたエンジニアの入り口に立っています。

次に挑戦してほしいのは、「スライドショー実行中に現在表示されているスライドのセクション名をログに出力する」というタスクです。これには `Application.SlideShowBegin` イベントを使い、`SlideShowWindow.View.Slide` を監視する必要があります。

オブジェクトモデルを理解し、階層を意識する。それだけで、あなたの自動化ツールは「動けばいいもの」から「信頼できるツール」へと進化します。

分からないことがあれば、いつでも聞いてください。応援していますよ。

タイトルとURLをコピーしました