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

スポンサーリンク

PowerPointの「フォント崩壊」をコードで制圧せよ:社内規定遵守のための自動スキャン・アーキテクチャ

現場の資料を見渡してほしい。部署ごとにバラバラなフォント、統一感のないデザイン。これらは単なる「美意識」の問題ではない。「組織の規律」が視覚的に崩壊している証拠だ。

手動チェックなど無駄の極みだ。我々エンジニアの仕事は、ヒューマンエラーを仕組みで殺すことにある。今回は、保存直前に全スライドのフォントを強制検閲し、規定外のフォントが混入していた場合に警告を発する「フロントライン・ゲートキーパー」を構築する。

—

1. なぜ「全スライド走査」は一筋縄ではいかないのか

初心者が陥りやすい罠は、「とりあえず全スライドを回せばいい」という短絡的な思考だ。しかし、PowerPointのオブジェクトモデルは非常に複雑だ。

  • テキストボックスの深層: テキストは `Shape` に含まれるが、その中の `TextFrame`、さらにその中の `TextRange` まで潜らなければフォントは判定できない。
  • グループ化の障壁: 図形がグループ化されていると、再帰的な探索が必要になる。
  • プレースホルダーの存在: タイトルや本文のプレースホルダーはデフォルト値を持ちやすく、意図せずフォントが引き継がれることが多い。

このコードは、単なるループではなく、「例外を許さない」という設計思想で書かれている。

—

2. プロダクションコード:FontGuard Engine

以下のコードを標準モジュールに配置せよ。`TARGET_FONT`定数を変更するだけで、いかなる組織の規定にも即座に対応できる。

Option Explicit

‘ 規定フォント(ここを組織のルールに合わせて変更)
Private Const TARGET_FONT As String = “游ゴシック”

Public Sub ValidateAndSavePresentation()
Dim sld As Slide
Dim shp As Shape
Dim hasViolation As Boolean

hasViolation = False

‘ 全スライドを走査
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If CheckShapeForFont(shp) Then
hasViolation = True
End If
Next shp
Next sld

If hasViolation Then
MsgBox “【警告】規定外のフォントが検出されました。” & vbCrLf & _
“保存を中断します。スライドを確認してください。”, vbCritical, “フォントチェックエラー”
Else
‘ チェックをパスした場合のみ保存を実行
ActivePresentation.Save
MsgBox “規定フォントを確認しました。正常に保存完了。”, vbInformation
End If
End Sub

‘ 図形内部を再帰的にチェックする関数
Private Function CheckShapeForFont(shp As Shape) As Boolean
Dim subShp As Shape

‘ グループ化されている場合は再帰呼び出し
If shp.Type = msoGroup Then
For Each subShp In shp.GroupItems
If CheckShapeForFont(subShp) Then CheckShapeForFont = True
Next
End If

‘ テキストを持っている場合のみ判定
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
‘ 規定フォントと異なるか判定(Font.Nameは文字列で比較)
If shp.TextFrame.TextRange.Font.Name <> TARGET_FONT Then
CheckShapeForFont = True
End If
End If
End If
End Function

—

3. このコードを「現場の武器」にするための運用指針

このコードをただコピペして満足してはならない。真のエンジニアであれば、以下の拡張性を考慮せよ。

A. ログ出力の実装

警告が出た際、どのスライドのどの図形が違反しているか特定できないと、ユーザーはパニックに陥る。`Debug.Print`でイミディエイトウィンドウに出力するか、あるいは別ファイルのCSVにログを書き出す仕組みを付与すべきだ。

B. 保存処理のフック(イベント駆動)

毎回手動でマクロを実行するのは非効率だ。`Class Module` を使い、`AppEvents` を実装することで、「保存ボタンを押した瞬間」に自動的にこのチェックが走るよう、ライフサイクルを乗っ取るのがベストプラクティスである。

C. パフォーマンスの最適化

スライド枚数が100を超えるような大規模プレゼンの場合、再帰処理は重くなる。その際は、`DoEvents`をループ内に挟むことで、画面が固まる(フリーズする)ことを防ぐ配慮が必要だ。

—

4. 最後に:エンジニアとしての矜持

VBAはレガシーと言われるが、Microsoft Officeの深部に直接アクセスできる唯一の言語であることに変わりはない。今回のような「小さな自動化」が、組織全体の品質を底上げし、無駄な修正作業を何時間、何百時間と削減する。

「仕組みで縛る」ことこそが、最もコストの低い管理術だ。
まずはこのツールを導入し、あなたのチームから「フォントの崩壊」という名の混乱を根絶せよ。コードは嘘をつかない。君が書いたロジックだけが、組織の規律を守る盾となるのだ。

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