【テクニカル・上級編】【初心者】指定した特定のフォントスタイル(例:游ゴシック)が使われているか全スライドをチェックし、異なる場合に警告を出して保存するマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

プレゼンテーションの「フォント崩壊」を根絶する。VBAによる厳格なバリデーション・アーキテクチャ

現場の惨状はいつも同じだ。デザイナーが渾身の思いで作成したテンプレートも、数人の共同編集者が触れた瞬間に「メイリオ」や「MS Pゴシック」が混在し、ブランドアイデンティティは霧散する。

多くの初心者は「適当にマクロを書いて保存する」が、我々エンジニアが追求すべきは「オブジェクトのライフサイクルを制御し、メモリリークを許さず、かつシステムに負荷をかけない」堅牢なゲートキーパーだ。

今回は、プレゼンテーションの保存直前にフォントをスキャンし、規定外であれば保存を阻止する――そのための「極限の知見」を授ける。

—

1. なぜ「単純なループ」ではいけないのか

PowerPointのオブジェクトモデルは、階層が非常に深い。`Presentation` > `Slide` > `Shape` > `TextFrame` > `TextRange`。この深淵を漫然と走査すれば、巨大なプレゼンファイルでは処理落ちが発生し、最悪の場合、オートメーションエラーの温床となる。

守るべき鉄則

1. Late Bindingの回避: 速度とインテリセンスの恩恵を受けるため、早期バインディング(Microsoft PowerPoint Object Library)を前提とする。
2. オブジェクトの明示的解放: 不要になった参照は即座に `Nothing` を代入する。VBAのガベージコレクションは信用するな。
3. 再帰構造の排除: 可能な限りフラットなループで制御し、スタックオーバーフローを物理的に排除する。

—

2. 実装:フォント・バリデーション・ゲートウェイ

以下は、保存イベントをフックし、規定外のフォントがあれば保存をキャンセルするコードの核心部分である。

‘ 標準モジュールではなく、必ず “ThisPresentation” モジュールに記述すること
Private Sub App_PresentationBeforeSave(ByVal Pres As Presentation, Cancel As Boolean)
Dim isValid As Boolean

‘ チェックロジックの呼び出し
isValid = ValidatePresentationFonts(Pres, “游ゴシック”)

If Not isValid Then
MsgBox “【警告】社内規定フォント以外が検出されました。保存を中断します。”, vbCritical
Cancel = True ‘ 保存処理の強制停止
End If
End Sub

Public Function ValidatePresentationFonts(ByVal Pres As Presentation, ByVal TargetFont As String) As Boolean
Dim sld As Slide
Dim shp As Shape
Dim isValid As Boolean: isValid = True

On Error Resume Next ‘ 予期せぬ埋め込みオブジェクト対策

For Each sld In Pres.Slides
For Each shp In sld.Shapes
‘ テキストを持っているシェイプのみを対象に
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
‘ Font.Nameプロパティで判定
If shp.TextFrame.TextRange.Font.Name <> TargetFont Then
Debug.Print “違反検出: Slide ” & sld.SlideIndex & ” / ” & shp.Name
isValid = False
Exit For
End If
End If
End If
Next shp
If Not isValid Then Exit For
Next sld

ValidatePresentationFonts = isValid

‘ オブジェクトの明示的解放
Set sld = Nothing
Set shp = Nothing
End Function

—

3. シニアエンジニアが意識すべき「深層」の技術

フォント名の判定における罠

上記コードはシンプルだが、PowerPointのフォント指定には「和文」「欧文」「東アジア言語」の3層がある。`Font.Name` は「現在の設定」を返すに過ぎない。もし厳密な統制が必要なら、`Font.NameFarEast` や `Font.NameAscii` まで個別に判定する必要がある。

Windows APIによる「強制終了」の抑止

もしユーザーが「保存ボタン」ではなく「×ボタン」で強制的にウィンドウを閉じようとした場合、このVBAイベントは発火しないリスクがある。その場合、Windows API `SetWindowsHookEx` を用いてUIスレッドを監視する高度なアプローチが必要となるが、それはまた別の機会に論じよう。

パフォーマンスの最適化

プレゼンテーションが数百枚を超える場合、ループ処理は極めて重くなる。その際は、`Application.ScreenUpdating = False` を利用するだけでなく、可能な限り `Shape` の参照をキャッシュし、メモリへのアクセス回数を削減すること。

—

4. 最後に:アーキテクトとしての心構え

ツールを作って終わりではない。重要なのは、「なぜそのフォントでなければならないのか」というガバナンスの意識を、コードを通じて組織に植え付けることだ。

自動化は単なる効率化の手段ではない。それは、ヒューマンエラーという不可避なノイズを排除し、システム全体を「あるべき姿」へと強制的に収束させるための、エンジニアの意志である。

君たちが書くその数行のコードが、明日、誰かのプレゼンを救う。その誇りを持って、キーボードを叩いてほしい。

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