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

スポンサーリンク

【PowerPoint VBA】セクション非表示の罠を撃破せよ:スライドショー判定の階層アルゴリズム

現場で自動化ツールを開発していると、必ず突き当たる「透明な壁」がある。
それが、`Slide.SlideShowTransition.Hidden` だけを信じて痛い目を見る、「セクション非表示」によるスライドスキップ問題だ。

多くのエンジニアが、「このスライドは非表示じゃないのに、なぜスライドショーで飛ばされるのか?」とデバッグに時間を浪費する。結論から言おう。PowerPointのオブジェクトモデルにおいて、スライドの表示状態は独立していない。 親であるセクションの「表示・非表示」という階層構造を把握しなければ、真の表示判定は不可能なのだ。

本稿では、この「見えない制約」を突破するための堅牢な階層解析アルゴリズムを伝授する。

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

PowerPointのオブジェクトモデルにおいて、`Slide.SlideShowTransition.Hidden` は、あくまでそのスライド「単体」の表示設定を指す。

しかし、PowerPoint 2010以降導入された「セクション」には、「セクションの折りたたみ」や「セクションの表示/非表示」という概念が存在する。 厄介なことに、VBAの標準プロパティには「そのスライドが属するセクションが現在有効か」を直接返す単一のフラグが存在しない。

単一スライドの判定のみに頼るコードは、プレゼン資料の構成変更やセクション管理が導入された途端、脆弱なレガシーコードへと成り下がる。我々が書くべきは、プレゼンテーションの階層をトップダウンで走査するアーキテクチャである。

2. セクション階層解析アルゴリズムの設計思想

堅牢なシステムを構築するためには、以下のロジックを実装する必要がある。

1. スライドインデックスから所属セクションを特定する
PowerPointには `Slide.SectionIndex` プロパティがあるが、これはセクションの順序を指すものであり、セクションそのものの状態を保持するオブジェクトではない。
2. セクションの表示状態を逆引きする
`Presentation.SectionProperties` を走査し、対象スライドが属するセクションのIDを特定し、そのセクションの「隠しフラグ」を確認する。
3. 論理積(AND)の判定
`(スライドが非表示でない) AND (親セクションが非表示でない)` という条件を満たしたときのみ、そのスライドは「生きて」いると見なす。

3. 実装コード:`IsSlideVisible` プロダクション関数

この関数は、単に判定するだけでなく、将来的な拡張性を考慮して作成している。そのままプロジェクトの共通モジュールに組み込んでほしい。

/

  • @brief スライドが真に表示可能か(セクション状態を含めて)判定する
  • @param sld 対象のスライドオブジェクト
  • @return Boolean スライドショーで表示されるならTrue

/
Public Function IsSlideVisible(ByVal sld As Slide) As Boolean
Dim pres As Presentation
Set pres = sld.Parent

‘ 1. スライド単体の非表示設定を確認
If sld.SlideShowTransition.Hidden = msoTrue Then
IsSlideVisible = False
Exit Function
End If

‘ 2. セクション階層の解析
‘ PowerPoint 2010未満の環境ではSectionPropertiesは存在しないためエラーハンドリングが必要
On Error Resume Next
Dim secIndex As Long
secIndex = sld.SectionIndex

If Err.Number <> 0 Then
‘ セクションが存在しない場合は単体判定の結果を返す
IsSlideVisible = True
Exit Function
End If
On Error GoTo 0

‘ 3. 所属セクションの表示状態を確認
‘ セクションプロパティから該当セクションの隠し状態を取得
‘ 注意: SectionPropertiesは1始まりのインデックス
If pres.SectionProperties.SectionHidden(secIndex) = msoTrue Then
IsSlideVisible = False
Exit Function
End If

‘ すべてのチェックを通過
IsSlideVisible = True
End Function

4. 開発現場で生き残るための「鉄則」

データベース連携の注意点

PowerPointからデータを抽出してDBへ送る際、この「非表示スライド」を誤ってカウントしてしまうと、集計結果に致命的な誤差が生じる。
特に、「全スライド数」をカウントする際は、必ず上記ロジックをラップした関数を通すこと。「全スライドのテキストを抽出せよ」という要件に対し、非表示スライドのゴミデータまで抽出するのは、エンジニアとしての怠慢である。

パフォーマンスへの配慮

もしプレゼンテーションが数千スライドを超えるような大規模な場合、`SectionProperties` へのアクセスをループ内で繰り返すとわずかなオーバーヘッドが生じる。
その場合は、スライドのループを回す前に、あらかじめ `Dictionary` オブジェクト等に「表示可能なセクションIDリスト」をキャッシュしておくのが、ハイレベルな自動化エンジニアの嗜みだ。

結びに代えて

「動けばいい」というコードは、数ヶ月後の自分自身を苦しめる呪いとなる。
PowerPointのセクション機能は、GUI上では親切に見えて、内部構造は非常に複雑なスパゲッティ状態になりやすい。だからこそ、我々エンジニアは、オブジェクトモデルの裏側に隠された「論理階層」をコード化し、可視化しなければならない。

このコードが、あなたの業務自動化プロジェクトをより堅牢なものにすることを確信している。
設計に妥協するな。コードの裏にある「仕様の闇」を照らせる者だけが、真の自動化を成し遂げられるのだ。

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