PowerPoint VBAの極致:PDF化前の「品質ゲート」を自動構築せよ
こんにちは。業務自動化の現場で血の滲むようなデバッグを乗り越えてきた諸君、ようこそ。
「マクロの記録」ボタンを押して満足している段階はもう卒業だ。君たちがこれから作るプレゼンテーションは、単なる資料ではない。クライアントや経営層に届く「製品」だ。製品にゴミが混入していれば、それは即座に信頼の失墜を意味する。
今回は、「PDF化する前に、リンク切れと孤立オブジェクトを徹底的に排除する」という、実務の現場で最も求められる品質管理マクロを伝授しよう。
—
なぜ「目視」ではいけないのか?
PowerPointで数百枚のスライドをチェックする時、人間は必ず見落とす。リンク切れのハイパーリンクや、画面外に飛び出した不要なテキストボックス(ゴミシェイプ)は、PDF化した瞬間に「見えない瑕疵」として残る。
我々エンジニアがやるべきことはシンプルだ。「人間がやるべき判断」と「機械がやるべき走査」を明確に分けること。 以下のコードは、君たちのプレゼンをPDF化という「出荷」の前に、厳格に検査するゲートキーパーとなる。
—
品質ゲート:自動検知&PDF変換マクロ
このコードは、全スライドを走査し、以下の2点を確認する。
1. ハイパーリンクの生存確認: HTTPリクエストを飛ばしてリンクが生きているか確認。
2. 孤立オブジェクトの検知: 画面外(座標がマイナス、またはスライドサイズ外)にある不要なシェイプを特定。
Option Explicit
‘ 必要な参照設定: Microsoft XML, v6.0
‘ ツール > 参照設定 > Microsoft XML, v6.0 にチェックを入れること
Sub PreFlightAndExportPDF()
Dim sld As Slide
Dim shp As Shape
Dim hl As Hyperlink
Dim logText As String
logText = “— 品質チェックログ: ” & Now & ” —” & vbCrLf
‘ 1. 全スライドを走査
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
‘ ハイパーリンクのチェック
If shp.Type = msoHyperlink Then
If Not CheckHyperlink(shp.Hyperlink.Address, logText) Then
logText = logText & “[警告] スライド” & sld.SlideIndex & “のリンク切れ: ” & shp.Hyperlink.Address & vbCrLf
End If
End If
‘ 画面外オブジェクトの検知(座標が負、またはスライドサイズ超過)
If shp.Left < 0 Or shp.Top < 0 Then
logText = logText & "[警告] スライド" & sld.SlideIndex & "に画面外の孤立シェイプあり: " & shp.Name & vbCrLf
End If
Next shp
Next sld
' 2. ログの出力
Debug.Print logText
MsgBox "検査完了。ログを確認してください。", vbInformation
' 3. PDFエクスポート(エラーがなければ実行)
If MsgBox("PDFを出力しますか?", vbYesNo) = vbYes Then
ActivePresentation.ExportAsFixedFormat _
Path:=Environ("USERPROFILE") & "\Desktop\Report.pdf", _
FixedFormatType:=ppFixedFormatTypePDF
End If
End Sub
' URLの生存確認関数
Function CheckHyperlink(url As String, ByRef log As String) As Boolean
Dim http As Object
On Error Resume Next
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send
If http.Status = 200 Then
CheckHyperlink = True
Else
CheckHyperlink = False
End If
Set http = Nothing
End Function
---
コードの深層解説:ここがプロのポイント
1. `On Error Resume Next` の正しい使い方
VBAで外部API(この場合はURLへのアクセス)を叩く際、接続エラーで即座にプログラムが止まるのは避けたい。エラーを握りつぶすのではなく、「エラーが起きた=リンク切れ」と判定するためにこの構文を戦略的に配置している。
2. オブジェクトの「生存領域」の定義
`shp.Left < 0`。これは非常に強力なチェックだ。作業中に画面外へドラッグして放置したままの「メモ代わりの図形」を、自動的にあぶり出せる。これだけでスライドのファイルサイズは劇的に軽くなる。
3. 拡張性の持たせ方
今回はPDF変換を`ExportAsFixedFormat`で行っているが、ここを `ppFixedFormatTypeXPS` に変えればXPS形式にもなるし、ループを工夫すれば各スライドを個別の画像として書き出すことも容易だ。
—
君たちが次に目指すべき場所
このマクロを導入しただけで満足してはいけない。次に目指すべきは「イベントドリブンな自動化」だ。
PowerPointには `Application_AfterPresentationSave` というイベントがある。これを使えば、「保存ボタンを押した瞬間に自動でこのチェックが走り、エラーがあれば保存をキャンセルする」という、極めて堅牢な品質管理システムを構築できる。
プログラミングとは、書くことではない。「どうすれば人間がミスをする隙をゼロにできるか」を設計することだ。
このコードを叩き台に、君たちの現場に合わせた最適解を見つけてほしい。もし行き詰まったら、オブジェクトブラウザを覗いてみろ。そこに全ての答えが書かれている。
健闘を祈る。君たちのコードが、誰かの仕事を楽にすることを願っている。
