【入門編】【初心者】複数選択したPPTXファイルをダイアログの並び順通りに結合し、1つのPDFとして連続出力するマクロ – PowerPoint VBA解析バイブル

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

【極限の自動化】バラバラの資料を「一撃」で1つのPDFへ。ファイル選択ダイアログを使いこなす結合マクロの真髄

「あぁ、またこれか……」

会議の直前、バラバラに届いた複数のアジェンダ、報告資料、補足データ。それらを一つひとつ開き、スライドをコピーして、新しいファイルに貼り付け、最後にPDFとして書き出す……。

もしあなたが、そんな「人間が行うにはあまりに単純で、しかし精神を削る作業」に時間を費やしているなら、今日、その習慣に別れを告げましょう。

プログラミング初学者の皆さんが「マクロの記録」という安全な殻を破り、真の自動化エンジニアへと一歩踏み出すためのステップ。それは、「ユーザーの意思(ファイル選択)」をプログラムに組み込むことです。

今日は、複数選択したPowerPointファイルを、選択した順番通りに結合し、たった一つのPDFとして出力する「極限の結合マクロ」を伝授します。

1. 設計図:私たちが作るものの構造

ただコードを書くのではありません。エンジニアは常に「オブジェクトのライフサイクル」を意識します。今回の処理は、以下の4つのフェーズで構成されます。

1. 対話フェーズ (Dialog): ユーザーに「どのファイルを使うか」を問いかける。
2. 基盤構築フェーズ (Base Setup): 最初に選んだファイルを「マスター(土台)」として開く。
3. 統合フェーズ (Merge): 残りのファイルを順番に読み込み、マスターへスライドを流し込む。
4. 完結フェーズ (Export & Cleanup): PDFとして書き出し、開いたファイルをメモリから解放する。

ここでの肝は、`InsertFromFile` というメソッドです。コピー&ペーストを繰り返すのではなく、ファイルから直接スライドを流し込む。これが、パフォーマンスと安定性を両立させるプロの選択です。

2. 実装:魂を込めたコード

さあ、準備はいいですか? 以下のコードを標準モジュールに貼り付けてください。コメントには、なぜその記述が必要なのか、その「理由」を書き込んでおきました。

Option Explicit

''' <summary>
''' 選択した複数のPPTXファイルを結合し、1つのPDFとして出力する
''' </summary>
Sub MergePPTXToSinglePDF()
    Dim fd As FileDialog
    Dim selectedFiles As Variant
    Dim i As Long
    Dim basePres As Presentation
    Dim targetPres As Presentation
    Dim savePath As String
    Dim currentFile As String
    
    ' 1. ファイル選択ダイアログの設定
    ' msoFileDialogFilePicker を使うことで、ユーザーにファイルを選ばせる
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    
    With fd
        .Title = "結合したいPowerPointファイルを選択してください(Ctrlキーで複数選択可)"
        .Filters.Clear
        .Filters.Add "PowerPoint Presentations", "*.pptx; *.ppt"
        .AllowMultiSelect = True ' 複数選択を許可するのが今回の肝
        
        ' ダイアログで「キャンセル」が押されたら終了
        If .Show = False Then Exit Sub
        
        ' 選択されたファイルのパスを配列に格納
        ' ※ダイアログの選択順(またはファイル名順)に格納される
        Set selectedFiles = .SelectedItems
    End With

    ' 画面更新を停止して高速化(※PPTにはExcelのようなScreenUpdatingはないが、
    ' 処理の安定性のためにオブジェクト管理を徹底する)
    On Error GoTo ErrorHandler

    ' 2. 基盤となるプレゼンテーションを開く
    ' 最初に選択されたファイルを「マスター」とする
    Set basePres = Presentations.Open(selectedFiles(1), WithWindow:=msoTrue)
    
    ' 3. 統合フェーズ
    ' 2番目以降のファイルに対してループ処理を行う
    For i = 2 To selectedFiles.Count
        currentFile = selectedFiles(i)
        
        ' InsertFromFile(ファイル名, 挿入先スライド番号, 開始スライド, 終了スライド)
        ' basePresの最後に、currentFileのスライドをすべて挿入する
        basePres.Slides.InsertFromFile currentFile, basePres.Slides.Count
        
        ' 💡 アーキテクトの知恵: 
        ' InsertFromFileは非常に強力だが、書式が崩れるリスクを避けるため
        ' 結合対象のファイルが正しく閉じられるよう、バックグラウンドでの処理を意識する
    Next i

    ' 4. 保存パスの決定(マスターファイルと同じフォルダに「結合済み.pdf」として保存)
    savePath = basePres.Path & "\結合済み資料_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"

    ' 5. PDFとしてエクスポート
    ' ExportAsFixedFormat は、高品質なPDF出力を実現する標準的なメソッド
    basePres.ExportAsFixedFormat _
        Path:=savePath, _
        FixedFormatType:=ppFixedFormatTypePDF, _
        Intent:=ppFixedFormatIntentPrint

    MsgBox "完了しました!" & vbCrLf & "保存先: " & savePath, vbInformation, "Success"

CleanUp:
    ' 6. 後片付け(リソースの解放)
    ' 開いたファイルを閉じ、メモリを解放する。これを忘れるとPCが重くなる原因に。
    If Not basePres Is Nothing Then
        basePres.Close
    End If
    Exit Sub

ErrorHandler:
    MsgMsgBox "エラーが発生しました: " & Err.Description, vbCritical, "Error"
    Resume CleanUp
End Sub

3. プロフェッショナルの視点:ここをクリアすれば、VBAの基本はバッチリ

コードをただ動かすだけでは、あなたはまだ「マクロを使える人」に過ぎません。一歩先の「エンジニア」になるために、以下の3つの本質を理解してください。

① オブジェクトのライフサイクルとメモリ管理

コードの最後にある `CleanUp` セクションを見てください。なぜ `basePres.Close` が必要なのか?
プログラムがファイルを「開く」ということは、コンピュータの貴重なメモリ(RAM)を占有するという意味です。もしエラーが起きたときにそのまま放置されると、目に見えない「幽霊ファイル」がメモリの中に残り続け、最終的にPowerPointがクラッシュする原因になります。
「使い終わったら、必ず片付ける」。これは、あらゆるプログラミングにおける黄金律です。

② `FileDialog` の挙動を制御する

`AllowMultiSelect = True` を設定することで、ユーザーは `Ctrl` キーや `Shift` キーを使って、直感的にファイルを選べるようになります。
ここで一つ注意点があります。ファイルを選択する際の「並び順」です。Windowsの仕様上、ダイアログで選択した順序が配列に格納されますが、複雑な選択をすると意図しない順序になることがあります。実務でより厳密な順序(例:ファイル名順)を求める場合は、取得したパスを一度ソートする処理を加えるのが「極限」への道です。

③ `InsertFromFile` vs `Copy & Paste`

多くの初心者は、スライドを `Copy` して `Paste` するコードを書きます。しかし、それは非効率です。

  • Copy/Paste: クリップボードを経由するため、他の作業を邪魔する可能性がある。また、メモリ消費が激しい。
  • InsertFromFile: ファイルから直接スライドの構造を読み込むため、高速で、クリップボードを汚さない。

終わりに:次なるステージへ

お疲れ様でした。今、あなたの手元には、単なる「便利ツール」ではなく、「設計思想に基づいた堅牢なプログラム」があります。

「マクロの記録」は、いわば「既製品のパーツ」を手に入れる作業です。しかし、今回のように「複数のパーツを組み合わせて、新しい価値を生み出す」ことこそが、エンジニアリングの本質です。

エラーが出ても恐れないでください。エラーメッセージは、コンピュータからの「もっとこうしてほしい」という愛あるアドバイスです。

さあ、次はどんな退屈な作業を、あなたの魔法(コード)で消し去りますか?

*執筆:Legendary Chief Architect*

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