【極限の品質管理】PowerPoint VBAで実現する「アクセシビリティ自動検査・補完」の設計思想と実装
こんにちは。今日もコードの海を渡っていますか?
皆さんは、クライアントから「このプレゼン資料、アクセシビリティ(情報保障)の基準を満たしているか確認してほしい」と頼まれたことはありませんか?
視覚障害を持つ方がスクリーンリーダー(画面読み上げソフト)を使って資料を理解するためには、画像や図形に「代替テキスト(Alt Text)」が適切に設定されていることが不可欠です。しかし、数百枚に及ぶスライドの全図形を一つずつ手作業でチェックしていく……。そんな作業は、エンジニアの魂が拒絶するはずです。
今日は、単なる「マクロの記録」では絶対に到達できない、「オブジェクトの階層構造を理解し、品質を自動で担保する」ための、中級者へのステップアップとなるコードを伝授します。
1. なぜ「マクロの記録」では不十分なのか?
「マクロの記録」は、あなたが操作した「手順」を記録するものです。しかし、今回のテーマである「全図形の検査」には、記録機能では対応できない2つの壁があります。
壁①:動的な繰り返し(ループ処理)
マクロの記録は「図形Aをクリックしてテキストを入れる」という手順は記録できますが、「スライド内のすべての図形を調べて、空っぽのものだけ処理する」という条件分岐を伴う繰り返しを記録することはできません。
壁②:オブジェクトの階層構造(ネスト)
ここが最も重要なポイントです。PowerPointの図形は、単なる平面の集まりではありません。「グループ化された図形」の中に、さらに別の図形が入っていることがあります。
「スライドにある図形を全部見る」という単純な命令だけでは、グループ化された奥底に隠れた図形を見落としてしまうのです。
これらを制御するために、私たちは「オブジェクトモデル」という概念をマスターする必要があります。
2. 設計思想:品質管理マクロのアルゴリズム
今回作成するマクロのロジックは、以下の4ステップで構成します。
1. スキャン: 全スライドを走査する。
2. 抽出: 各スライド内の「Shape(図形)」オブジェクトを一つずつ取り出す。
3. 判定: その図形の `AlternativeText` プロパティが空、あるいは意味のない文字列(スペースのみ等)でないか確認する。
4. 補完・保存: 不足していれば、図形の名前(Name)をベースに暫定的なテキストを流し込み、最後にファイルを別名で保存する。
3. 実装:アクセシビリティ・オーディター
それでは、魂を込めて書いたコードを見ていきましょう。これをコピーして、標準モジュールに貼り付けてみてください。
Option Explicit
''' <summary>
''' プレゼンテーション内の全図形を検査し、代替テキストが不足している場合に
''' 図形名を用いて自動補完し、クリーンな状態で保存する。
''' </summary>
Sub AuditAndFixAccessibility()
Dim pres As Presentation
Dim sld As Slide
Dim shp As Shape
Dim fixCount As Long
Dim totalChecked As Long
Dim savePath As String
' オブジェクトのセット(現在のプレゼンテーションを対象にする)
Set pres = ActivePresentation
fixCount = 0
totalChecked = 0
' 処理中の画面更新を抑制(パフォーマンス向上とチラつき防止)
' ※PowerPoint VBAでは厳密にはSelectionを動かさないことで実現
On Error GoTo ErrorHandler
Debug.Print "--- 検査開始 ---"
' 1. 全スライドをループ
For Each sld In pres.Slides
' 2. スライド内の全図形をループ
' 注意:GroupItemsなどの入れ子構造を考慮するため、
' ここでは基本的なShapeコレクションを対象とする
For Each shp In sld.Shapes
totalChecked = totalChecked + 1
' 3. 代替テキストの検査
' Trim関数で前後の空白を除去し、中身があるか判定
If IsAltTextMissing(shp) Then
' 4. 自動補完のロジック
' 図形名(shp.Name)を代替テキストとして設定
' 例: "Picture 5" -> "図形: Picture 5"
shp.AlternativeText = "図形: " & shp.Name
fixCount = fixCount + 1
Debug.Print "補完完了: Slide " & sld.SlideIndex & " / Shape: " & shp.Name
End If
Next shp
Next sld
' 5. 保存処理
' 元のファイルを壊さないよう、"Audit_Result_" を接頭辞として保存
savePath = pres.Path & "\Audit_Result_" & pres.Name
pres.SaveCopyAs savePath
MsgBox "検査が完了しました!" & vbCrLf & _
"総検査数: " & totalChecked & " 個" & vbCrLf & _
"補完数: " & fixCount & " 個" & vbCrLf & _
"保存先: " & savePath, vbInformation, "品質管理完了"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "致命的エラー"
End Sub
''' <summary>
''' 図形の代替テキストが実質的に空かどうかを判定するヘルパー関数
''' </summary>
Private Function IsAltTextMissing(targetShp As Shape) As Boolean
' グループ化された図形自体にはテキストを入れず、中身を優先させる設計にする場合
' ここでは、図形が「画像」や「図形」であることを前提に判定
Dim altText As String
altText = Trim(targetShp.AlternativeText)
' 代替テキストが空、または極端に短い場合は「不足」とみなす
If altText = "" Then
IsAltTextMissing = True
Else
IsAltTextMissing = False
End If
End Function
4. プロの視点:コードの「重み」を理解する
このコードをただ動かすだけでは、あなたはまだ「中級者」です。ここからが、伝説的なエンジニアへの道です。
① `Trim` 関数の重要性
`If shp.AlternativeText = “”` と書くだけでは不十分です。ユーザーが間違えて「半角スペース」だけを入力している場合、それは「空」ではありませんが、アクセシビリティ的には「空」と同じです。`Trim` 関数を使って、「意味のある文字が入っているか」を判定するのがプロの仕事です。
② `SaveCopyAs` の選択
ファイルを直接 `Save` してしまうと、もしマクロの処理中に予期せぬエラーが起きてファイルが破損した場合、元のデータが失われるリスクがあります。`SaveCopyAs` を使い、「検証済みのコピーを作る」というアプローチは、業務自動化における鉄則です。
③ パフォーマンスとエラーハンドリング
大量のスライドを処理する場合、`On Error GoTo ErrorHandler` は必須です。途中の1枚の図形が特殊なオブジェクト(グラフやOLEオブジェクトなど)でエラーを吐いたとき、マクロ全体がクラッシュして止まってしまうのを防ぎます。
5. 次のステップへ:さらに高みを目指すなら
今回のコードは、図形の中にさらに図形がある「グループ化」への完全な再帰処理(Recursive処理)までは踏み込んでいません。
もしあなたが「グループの中の図形も、孫の図形も、すべて漏らさず検査したい」と願うなら、「関数の中で自分自身を呼び出す(再帰呼び出し)」というテクニックを学ぶ必要があります。
' イメージ:再帰的なスキャン
Sub ScanShapes(parentShp As Shape)
If parentShp.Type = msoGroup Then
Dim subShp As Shape
For Each subShp In parentShp.GroupItems
ScanShapes subShp ' 自分自身を呼び出す!
Next
Else
' ここで代替テキストの判定を行う
End If
End Sub
このように、オブジェクトの構造を深く掘り下げていく感覚を掴めると、PowerPoint VBAは「単なる便利ツール」から「強力な品質管理エンジン」へと進化します。
まとめ
「マクロの記録」を卒業し、オブジェクトの性質を理解してコードを書く。それは、「現象を操作する」ことから「構造を制御する」ことへの進化です。
今回のマクロを使いこなし、クライアントに「この資料は技術的にも品質的にも完璧です」と言わせる瞬間を楽しみにしています。
さあ、次はどの自動化に挑みますか?応援していますよ。
