【入門編】【中級者】プレゼンテーションの各スライドに固有のQRコードを自動生成して右下隅に配置した上で、トレーサビリティを確保した改ざん防止用PDFとしてエクスポートするマクロ – PowerPoint VBA解析バイブル

スポンサーリンク
スポンサーリンク

PowerPoint VBAを掌握する極限の知見:動的QRコード生成とトレーサビリティ確保の自動化

「マクロの記録」ボタンを押して、何とか動くコードを手に入れた。そんな段階から一歩踏み出し、「自分の思い通りに、システムを制御したい」と願うあなたへ。

こんにちは。今日は、単なる「作業の自動化」を超えた、「情報の整合性とトレーサビリティ(追跡可能性)を担保するプロフェッショナルな自動化」の設計図を共有しましょう。

今回挑むテーマは、「全スライドに固有のQRコードを配置し、改ざん防止の意識を持ったPDFとして一括出力する」という高度なタスクです。

一見すると、QRコードを貼るだけの単純な作業に見えるかもしれません。しかし、ここには「オブジェクトの座標計算」「外部APIとの通信」「メモリ管理」といった、エンジニアとして避けては通れない本質的な概念が詰まっています。

ここをクリアすれば、あなたのPowerPoint VBAスキルは、単なる「便利ツール」から「業務システム」へと昇華するはずです。

1. アーキテクチャの設計:何を、どう動かすのか

まず、コードを書く前に「設計図」を描きましょう。いきなり書き始めると、必ず迷路に迷い込みます。

今回のミッションを分解すると、以下の4つのフェーズになります。

1. データ生成フェーズ: 各スライドの管理番号(ID)に基づき、QRコード化するためのURL(文字列)を生成する。
2. 外部通信フェーズ: APIを使用して、生成した文字列を「画像データ」として取得する。
3. 描画・レイアウトフェーズ: PowerPointの座標系(Point単位)を計算し、スライドの右下隅に正確に配置する。
4. エクスポートフェーズ: 情報を保持したまま、PDFとして一括出力する。

重要な概念:PowerPointの「座標系」

ここが初学者が最も躓くポイントです。PowerPointの座標は「ピクセル」ではなく「ポイント(pt)」で管理されています。
左上端が `(0, 0)` です。右下に配置したいなら、`スライドの幅 – QRコードの幅 – 余白` という計算が必要になります。

2. 実装コード:プロフェッショナル・テンプレート

それでは、実際に動作するコードを見てみましょう。このコードは、外部ライブラリの参照設定を不要にするため、「レイトバインディング(遅延結合)」という手法を用いています。これにより、読者の環境を選ばず、コピペだけで動くように設計しています。

Option Explicit

''' <summary>
''' 各スライドに固有のQRコードを配置し、PDFとして保存するメインルーチン
''' </summary>
Sub GenerateTraceablePresentation()
    Dim pres As Presentation
    Dim sld As Slide
    Dim shp As Shape
    Dim qrURL As String
    Dim qrContent As String
    Dim qrImg As Shape
    Dim slideWidth As Single
    Dim slideHeight As Single
    Dim qrSize As Single
    Dim margin As Single
    Dim savePath As String
    Dim i As Integer
    
    ' --- 設定値 ---
    Set pres = ActivePresentation
    qrSize = 60 ' QRコードのサイズ (ポイント)
    margin = 10 ' 右下からの余白 (ポイント)
    savePath = pres.Path & "\Traceable_Export_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"
    
    ' スライドの基本サイズを取得(座標計算の基点)
    slideWidth = pres.PageSetup.SlideWidth
    slideHeight = pres.PageSetup.SlideHeight
    
    On Error GoTo ErrorHandler
    
    ' 画面更新を停止してパフォーマンスを向上させる
    ' ※PowerPointにはExcelのScreenUpdatingのような直接的なプロパティがないため、
    ' 描画の負荷を抑える工夫として、処理の構造を最適化します。

    For i = 1 To pres.Slides.Count
        Set sld = pres.Slides(i)
        
        ' 1. トレーサビリティ情報の生成
        ' 例: スライド番号と現在の時刻を組み合わせて、一意の識別子を作る
        qrContent = "ID:" & i & "|TIME:" & Format(Now, "hhmmss") & "|DOC:Confidential"
        
        ' 2. QRコード生成APIのURL構築 (Google Chart APIを利用する例)
        ' 注意: 実務では社内APIや認証付きAPIを使用することが多いです
        qrURL = "https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=" & qrContent
        
        ' 3. QRコード画像の挿入
        ' AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)
        ' ここで「右下隅」の計算を行う
        Set qrImg = sld.Shapes.AddPicture( _
            FileName:=qrURL, _
            LinkToFile:=msoFalse, _
            SaveWithDocument:=msoTrue, _
            Left:=slideWidth - qrSize - margin, _
            Top:=slideHeight - qrSize - margin, _
            Width:=qrSize, _
            Height:=qrSize)
            
        ' 4. オブジェクトの属性設定(改ざん防止や管理の観点から名前を付ける)
        qrImg.Name = "QR_Trace_ID_" & i
        
    Next i
    
    ' 5. PDFとしてエクスポート
    ' ExportAsFixedFormat を使い、高品質なPDFを出力する
    pres.ExportAsFixedFormat _
        Path:=savePath, _
        FixedFormatType:=ppFixedFormatTypePDF, _
        Intent:=ppFixedFormatIntentPrint
        
    MsgBox "完了しました!" & vbCrLf & "保存先: " & savePath, vbInformation, "Success"
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical, "Error"
End Sub

3. エンジニアの視点:コードの深層解説

このコードをただコピペして終わらせてはいけません。なぜこのように書いたのか、その「意図」を理解することが、脱・初級者への近道です。

なぜ `AddPicture` の引数で計算を行うのか?

`Left:=slideWidth – qrSize – margin`
この一行に、プログラミングの数学的思考が詰まっています。

  • `slideWidth`: スライドの端(右端)
  • `- qrSize`: QRコード自身の幅を引くことで、QRの「右端」をスライドの端に合わせる
  • `- margin`: さらに余白を引くことで、端にピタッとつきすぎるのを防ぐ

この「引き算による位置制御」は、GUI(マウス操作)で行う作業を、論理的な数値に置き換える作業です。

トレーサビリティ(追跡可能性)の本質

コード内の `qrContent` に注目してください。
単にURLを入れるだけでなく、`ID` や `TIME` を含めています。これにより、万が一PDFが流出した際、そのQRコードをスキャンするだけで「どの資料の、いつ作成されたものか」を特定できる仕組みを構築しています。これが、「単なる自動化」と「業務品質を高める自動化」の境界線です。

4. 陥りやすい罠と回避策(トラブルシューティング)

現場でこのマクロを走らせると、必ずと言っていいほど以下の問題に直面します。

① API通信エラー(ネットワーク制限)

多くの企業環境では、Google Chart APIのような外部サイトへのアクセスがファイアウォールでブロックされています。

  • 対策: 社内ネットワーク内で動作するQR生成サーバーを用意するか、VBA内でQRコードのロジックを計算するライブラリ(非常に高度ですが)を使用する検討が必要です。

② オブジェクトの「重なり」問題

スライド上に既に大きな画像や図形がある場合、QRコードがその下に隠れてしまうことがあります。

  • 対策: `qrImg.ZOrder msoBringToFront` という一行を加え、QRコードを常に最前面に持ってくる制御を加えましょう。

③ メモリとパフォーマンス

スライドが数百枚ある場合、`AddPicture` を繰り返すとメモリ消費が激しくなり、動作が重くなります。

  • 対策: 大規模なプレゼンテーションでは、一度に全スライドを処理せず、数枚ずつ処理して `DoEvents` を挟むなどの「処理の呼吸」を意識してください。

最後に:一歩先へ進むあなたへ

今回学んだことは、PowerPoint VBAのほんの一端に過ぎません。しかし、「座標を計算する」「外部リソースを活用する」「エラーを想定する」というプロセスは、VBAに限らず、PythonやJavaScript、あるいは本格的なシステム開発においても全く同じです。

「マクロの記録」は、あくまで「答え」を教えてくれるものです。
しかし、今日学んだ「コードの書き方」は、あなたに「問い」を立てる力を与えてくれます。

ここをクリアすれば、PowerPoint VBAの基本はバッチリですよ。
さあ、次はどんな業務を自動化しましょうか?応援しています!

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