【入門編】【社外秘クレンジング】非表示スライド(”ShowInSlideShow = msoFalse”)のみを自動検出し、特定の透かし(ウォーターマーク)を一括挿入・削除するセキュリティマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPointの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がよく分からない…」という状態から抜け出し、自分の手で自由自在にプレゼンテーションをコントロールしたい——今日はそんなあなたに向けて、実務でそのまま使える「本物の技術」をお伝えします。

今回取り組むテーマは、「非表示スライドの自動検出とウォーターマーク(透かし)の一括制御」です。

会議の資料を作っていると、「このページは予備だから今は隠しておこう」「ここはまだドラフト段階だから社外秘にしておこう」という場面、よくありますよね。でも、手作業で非表示スライドを一枚ずつめくって「社外秘」の文字を配置したり消したりするのは、ヒューマンエラーの元だし、何より退屈な作業です。

ここをクリアすれば、PowerPoint VBAのオブジェクトモデルの本質(親と子の関係性)が手に取るように分かるようになります。さあ、一緒にプロの扉を開きましょう!

1. PowerPoint VBAの心臓部:オブジェクトモデルを理解する

まず、VBAでPowerPointを操作するときの「地図」頭に入れましょう。
PowerPointのVBAは、ロシアの民芸品「マトリョーシカ」のような階層構造(オブジェクトモデル)になっています。

Application (PowerPointアプリ全体)
┗ Presentations (開いているファイルたち)
┗ Presentation (いま操作している特定のファイル)
┗ Slides (スライドたち)
┗ Slide (特定のスライド)
┗ Shapes (そのスライドにある図形や文字たち)

私たちが書きたいコードは、突き詰めると「どの階層の、どの引き出しを開けて、中身をどうするか」をコンピュータに正確に指示する作業に他なりません。

今回のミッションをこの構造に翻訳してみましょう。
1. 開いているプレゼンテーションの、すべてのスライドを順番に覗き見ます。
2. そのスライドが「非表示(ShowInSlideShow = msoFalse)」かどうかを判定します。
3. 条件に合致していれば、そのスライドのシェイプ(図形)のコレクションにアクセスし、ウォーターマークを追加、あるいは削除します。

基本のキですが、これが分かっていればどんな複雑な自動化も怖くありません。

2. 実装:非表示スライド制御セキュリティマクロ

それでは、開発の現場でそのままコピペして使える実践コードを公開します。
VBE(Visual Basic Editor)を開き、標準モジュールに以下のコードを貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ 処理名 : ToggleHiddenSlideWatermark
‘ 概要 : 非表示スライドを自動検出し、社外秘ウォーターマークの一括挿入・削除を行う
‘ 使い方 : 処理モード(”ADD” または “DELETE”)を指定して実行します
‘ ==============================================================================
Public Sub RunWatermarkManager()
Dim targetPres As Presentation
Set targetPres = ActivePresentation

‘ 実行確認のダイアログ(実務での誤爆を防ぐプロの配慮です)
Dim userChoice As VbMsgBoxResult
userChoice = MsgBox(“非表示スライドに対するウォーターマーク処理を開始します。” & vbCrLf & _
“「はい」で挿入 / 「いいえ」で削除を行います。”, _
vbYesNoCancel + vbQuestion, “セキュリティクレンジング”)

If userChoice = vbCancel Then Exit Sub

If userChoice = vbYes Then
Call ManageWatermarkForHiddenSlides(targetPres, “ADD”)
Else
Call ManageWatermarkForHiddenSlides(targetPres, “DELETE”)
End If
End Sub

Private Sub ManageWatermarkForHiddenSlides(pres As Presentation, mode As String)
Dim sld As Slide
‘ ウォーターマークを特定するためのユニークな名前(タグ代わりに使用)
Const WM_NAME As String = “SecurityWatermark_Auto”

Dim processedCount As Long
processedCount = 0

‘ 1. すべてのスライドを「最初から最後尾まで」ループ処理
Dim i As Long
For i = 1 To pres.Slides.Count
Set sld = pres.Slides(i)

‘ 2. 判定:そのスライドは「非表示」設定になっているか?
If sld.SlideShowTransition.Hidden = msoTrue Then

If mode = “ADD” Then
‘ すでに同じウォーターマークが存在しないか重複チェック
If Not TargetShapeExists(sld, WM_NAME) Then
Call CreateWatermarkShape(sld, WM_NAME)
processedCount = processedCount + 1
End If

ElseIf mode = “DELETE” Then
‘ 存在するウォーターマークを綺麗にクレンジング
If TargetShapeExists(sld, WM_NAME) Then
Call RemoveWatermarkShape(sld, WM_NAME)
processedCount = processedCount + 1
End If
End If

End If
Next i

‘ 完了通知
MsgBox “処理が完了しました。” & vbCrLf & _
“対象となった非表示スライド数: ” & processedCount & ” 枚”, _
vbInformation, “完了”
End Sub

‘ — ヘルパー関数:指定した名前のシェイプが既に存在するかチェック —
Private Function TargetShapeExists(sld As Slide, shapeName As String) As Boolean
Dim shp As Shape
TargetShapeExists = False

For Each shp In sld.Shapes
If shp.Name = shapeName Then
TargetShapeExists = True
Exit Function
End If
Next shp
End Function

‘ — ヘルパー関数:美しいウォーターマークを生成する —
Private Sub CreateWatermarkShape(sld As Slide, shapeName As String)
Dim shp As Shape

‘ スライド中央に半透明のテキストボックスを配置
‘ (数値は一般的な16:9スライドを想定した中央配置の座標です)
Set shp = sld.Shapes.AddTextbox(msoTextOrientationHorizontal, 100, 220, 760, 120)

With shp
.Name = shapeName
With .TextFrame.TextRange
.Text = “【社外秘 / DRAFT】”
.Font.Name = “Meiryo UI”
.Font.Size = 54
.Font.Bold = msoTrue
.Font.Color.RGB = RGB(220, 20, 60) ‘ 警告色(クリムゾンレッド)
.Paragraphs(1).Alignment = ppAlignCenter
End With

‘ 視認性を邪魔しないよう、シェイプ自体を斜めに回転させる
.Rotation = -25

‘ チーフアーキテクトのこだわり:最背面ではなく、コンテンツの邪魔にならない絶妙なレイヤーへ配置
‘ (必要に応じて .ZOrder msoSendToBack に変更可能)
End With
End Sub

‘ — ヘルパー関数:ウォーターマークの削除 —
Private Sub RemoveWatermarkShape(sld As Slide, shapeName As String)
Dim shp As Shape
For Each shp In sld.Shapes
If shp.Name = shapeName Then
shp.Delete
Exit For
End If
Next shp
End Sub

3. コードの注目ポイントと「陥りやすい罠」の回避策

このコードには、現場で泥臭く培ってきた「バグを出さないための工夫」が詰まっています。いくつか重要なポイントを解説しますね。

① 非表示プロパティの正しい指定先

初心者が一番ハマるのが、「スライドの非表示ってどうやって取得するの?」という点です。
実は、`Slide` オブジェクトの直下に `.Hidden` というプロパティはありません。正解は、`sld.SlideShowTransition.Hidden` です。スライドショーの切り替え効果や設定の中に隠されているため、最初は迷いやすいポイントです。ここをクリアできれば一安心です。

② シェイプに「名前(Name)」をつけて管理する

マクロで図形を作ると、PowerPointは自動的に「テキストボックス 3」のような名前を付けます。しかし、これでは後から削除するときに「どれがウォーターマークだっけ?」と分からなくなってしまいます。
コード内では、生成した瞬間に `.Name = “SecurityWatermark_Auto”` と固有の名前を刻み込んでいます。削除する際も、この名前を名札代わりに探してピンポイントで消去するため、他の大切な図形を巻き込んで消してしまう事故を防げます。

③ 重複実行への耐性(冪等性:べきとうせい)

同じボタンをうっかり2回押してしまったとき、ウォーターマークが何重にも重なって画面が真っ赤になったら困りますよね。
そのため、`TargetShapeExists` というチェック関数を挟み、「すでに存在していれば作らない」という安全装置(冪等性の確保)を実装しています。これがプロのコードの作法です。

おわりに

お疲れ様でした!ここをクリアすれば、もはや「マクロの記録の奴隷」ではありません。あなたは自分の手でプレゼンテーションのライフサイクルをコントロールする「エンジニア」の領域に踏み込みました。

実務の現場では、ほんの少しの自動化が、何時間もの手作業とヒューマンエラーを消し去ってくれます。ぜひ自分の手元の資料でこのマクロを動かし、スライドがパッと一瞬でクレンジングされる爽快感を味わってみてください。

それでは、次回の高度なVBA解説でお会いしましょう。あなたの開発ライフが素晴らしいものになりますように!

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