【VBA】ExcelデータからPowerPointスライドを自動生成する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でできること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. PowerPointのインストールを確認する
    2. バックアップを取る
    3. Excelをマクロ有効ブック(.xlsm)で保存する
  5. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  6. コード(基本版)– Excelの値からスライドを作成
    1. 書き換えポイント
    2. Excelシートのレイアウト例
    3. コードの流れ
  7. コード(応用版)– 表やグラフをスライドに貼り付け
    1. 書き換えポイント
    2. コードの流れ
  8. コード(実務版)– 一覧表から複数スライドを一括生成
    1. 書き換えポイント
    2. 一覧シートの列構成
    3. コードの流れ
  9. よくある落とし穴5選
    1. 1. Quit忘れでPOWERPNT.EXEが残留する
    2. 2. スライドレイアウトの番号が環境によって異なる
    3. 3. ActiveXコンポーネントエラー429
    4. 4. 貼り付けた表やグラフの位置・サイズがズレる
    5. 5. グラフの画質が粗い
    6. VBAでExcelからPowerPointに表が貼り付けられないときの対処法
    7. VBAで生成したPowerPointのレイアウトが崩れるときの対処法
    8. VBAでPowerPointのテンプレートにデータを差し込む方法がわからないときの対処法
  10. FAQ
    1. Q1: 既存のPowerPointテンプレート(.pptx)を使いたい
    2. Q2: フォントやフォントサイズを変えたい
    3. Q3: 生成したPowerPointをPDFで保存したい
    4. Q4: スライドに画像ファイルを挿入したい
    5. Q5: 1つのExcelファイルから複数のプレゼンテーション(.pptx)を作りたい
  11. まとめ
    1. 関連記事
  12. 次にやりたくなること

この記事でできること

VBAでExcelのデータを読み取って、PowerPointスライドを自動生成できるようになる。表やグラフの貼り付けも、複数スライドの一括生成も対応。

  • 対象:ExcelからPowerPointへの転記を毎回手作業でやっている人、VBAが初めての人
  • 所要時間:コピペ → 実行まで約5分(基本版)

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

必要: PowerPoint(デスクトップ版)インストール済み

どんな場面で使う?

  • 月次報告の資料作成 — 毎月の売上・実績データをExcelで集計し、報告用PowerPointを作っている。拠点別・商品別でスライドが10〜60枚になり、1枚ずつ手作業で転記すると丸1日潰れる
  • 顧客別の提案書・見積書の量産 — 顧客リスト(Excel)の会社名・金額・条件を、提案書テンプレート(PPT)に差し込んで顧客ごとにカスタマイズ。週3〜5本の手作業が限界
  • 品質報告・検査レポートの作成 — 検査データ(Excel)と検査写真をPowerPointに貼り付けて報告書にする。表とグラフの位置合わせが毎回地獄
  • 研修資料・修了証の個別作成 — 受講者リスト(Excel)から、名前や成績を差し込んだ個別スライドを人数分作る
  • 経営会議・役員報告の資料集約 — 各部門からExcelで上がってきた報告を1つのPowerPointにまとめる。数字の転記ミスが怖い

完成イメージ(Before / After)

Before(手動コピペ):

  1. Excelの集計データを確認する
  2. PowerPointを開いて新しいスライドを作成する
  3. タイトル・本文を手入力する
  4. Excelの表をコピーしてスライドに貼り付ける
  5. グラフもコピーして貼り付ける
  6. 位置やサイズを手動で調整する
  7. 次のスライドで同じ作業を繰り返す
  8. 10枚のスライドで30分以上かかる

After(VBAで自動生成):

  1. マクロを実行(またはボタンをクリック)
  2. ExcelのデータからPowerPointスライドが自動生成される
  3. 表やグラフも指定位置・指定サイズで自動配置される
  4. 10枚のスライドが5秒で完成。位置ズレなし

自分も以前、毎月20拠点分の売上報告PowerPointを手作業で作っていた。1拠点あたりスライド3枚、合計60枚。Excelの数字をPPTに手入力して、表をコピペして、グラフを貼り付けて、位置を微調整して。これだけで毎月丸1日が消えていた。正直、月末が来るたびに憂鬱だった。

しかも一度、売上の桁を1つ間違えたまま経営会議に出してしまったことがある。「この数字、本当に合ってる?」と役員に指摘されたときは冷や汗が止まらなかった。それ以来、転記後のダブルチェックに30分追加。合計で1日半かかるようになった。

「ExcelとPowerPointは別アプリだからVBAで連携できないんじゃないか」と思っていたが、CreateObject を使えば参照設定すら不要で、Excelの標準モジュールからPowerPointを丸ごと操作できた。VBAで自動生成するようにしてからは、60枚のスライドが10分で完成。位置もサイズも毎回同じ。転記ミスもゼロ。あの毎月の憂鬱な1日がなくなった。

同じように「ExcelからPPTへの転記が苦行」と感じている人が、この記事で一気にラクになればうれしい。

ExcelからPowerPointスライドを自動生成するコツは「CreateObject(“PowerPoint.Application”) でPowerPointを操作し、Slides.Add でスライドを追加して Shapes にテキストや表を配置する」こと。手動コピペでは再現できない正確な位置・サイズで毎回統一された資料が作れる。

なお、Excelの表をOutlookメール本文に貼り付けたい場合は Excelの表をOutlookメール本文に貼り付けて送る方法 を参照。ExcelのデータをWordに転記したい場合は Excelの表をWordに自動転記する方法 を参照。この記事では「ExcelのデータからPowerPointスライドを自動生成する」に特化する。

実行前の準備

PowerPointのインストールを確認する

VBAからPowerPointを操作するには、PowerPointのデスクトップ版がインストールされている必要がある。Web版やストア版では CreateObject("PowerPoint.Application") が動作しない場合がある。Microsoft 365の場合、「アプリのインストール」からデスクトップ版をインストールすること。

バックアップを取る

元データのExcelファイルは、作業前にコピーしてバックアップを取ること。

Excelをマクロ有効ブック(.xlsm)で保存する

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す
  2. VBE(Visual Basic Editor)が開く

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」
  2. 白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. コード内のシート名・保存先パスを自分の環境に書き換える
  3. Alt + F8 → マクロ名を選んで「実行」
  4. PowerPointにスライドが生成されることを確認する

ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。

コード(基本版)– Excelの値からスライドを作成

まずはこれだけで動く。Excelシートのセル値を読み取り、PowerPointにタイトルスライドとコンテンツスライドを自動生成する。


'============================================================
' ■ Excelの値からPowerPointスライドを作成(基本版)
'   → PowerPointを起動してスライドを追加
'   → Excelのセル値をタイトル・本文に設定
'   → .pptx で保存
'============================================================
Sub CreatePptBasic()

    '--- ★書き換えポイント ---
    Dim savePath As String
    savePath = "C:\Output\プレゼン資料.pptx"  '← 保存先のパス

    Dim sheetName As String
    sheetName = "Sheet1"  '← データがあるシート名
    '--- ★ここまで ---

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(sheetName)

    '--- PowerPoint を起動(参照設定不要)
    Dim ppApp As Object
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True  ' PowerPointを表示(確認用)

    '--- 新しいプレゼンテーションを作成
    Dim ppPres As Object
    Set ppPres = ppApp.Presentations.Add

    '--- タイトルスライドを追加(レイアウト 1 = タイトルスライド)
    Dim ppSlide As Object
    Set ppSlide = ppPres.Slides.Add(1, 1)

    '--- ★書き換えポイント ---
    '    タイトルとサブタイトルのセル位置を書き換える
    '--- ★ここまで ---
    ppSlide.Shapes(1).TextFrame.TextRange.Text = ws.Range("A1").Value  ' タイトル
    ppSlide.Shapes(2).TextFrame.TextRange.Text = ws.Range("A2").Value  ' サブタイトル

    '--- コンテンツスライドを追加(レイアウト 2 = タイトルとコンテンツ)
    Dim ppSlide2 As Object
    Set ppSlide2 = ppPres.Slides.Add(2, 2)

    ppSlide2.Shapes(1).TextFrame.TextRange.Text = ws.Range("A4").Value  ' タイトル
    ppSlide2.Shapes(2).TextFrame.TextRange.Text = ws.Range("A5").Value  ' 本文

    '--- 保存
    ppPres.SaveAs savePath

    '--- PowerPoint を終了しない(内容を確認するため)
    '    確認後に手動で閉じる
    Set ppSlide2 = Nothing
    Set ppSlide = Nothing
    Set ppPres = Nothing
    Set ppApp = Nothing

    MsgBox "スライドを作成しました。" & vbCrLf & savePath, vbInformation

End Sub

書き換えポイント

変数 / 箇所 説明 初期値
savePath 生成した.pptxの保存先パス "C:\Output\プレゼン資料.pptx"
sheetName データがあるシート名 "Sheet1"
ws.Range("A1") タイトルスライドのタイトル A1セル
ws.Range("A2") タイトルスライドのサブタイトル A2セル
ws.Range("A4") コンテンツスライドのタイトル A4セル
ws.Range("A5") コンテンツスライドの本文 A5セル

Excelシートのレイアウト例

セル 内容
A1 タイトルスライドのタイトル 2026年3月 売上報告
A2 タイトルスライドのサブタイトル 営業企画部 鈴木
A4 コンテンツスライドのタイトル 月次売上推移
A5 コンテンツスライドの本文 3月の売上は前月比120%…

コードの流れ

  1. CreateObject("PowerPoint.Application") でPowerPointを起動する(参照設定不要)
  2. Presentations.Add で新しいプレゼンテーションを作成する
  3. Slides.Add(スライド番号, レイアウト番号) でスライドを追加する
  4. Shapes(番号).TextFrame.TextRange.Text にExcelのセル値を設定する
  5. SaveAs で .pptx として保存する

Slides.Add の第2引数(レイアウト番号): 1 はタイトルスライド、2 はタイトルとコンテンツ、12 は白紙。環境やテーマによって番号が異なる場合がある。まずはこの3つを覚えておけば十分。

コード(応用版)– 表やグラフをスライドに貼り付け

Excelの表(セル範囲)やグラフをスライドに貼り付ける版。位置とサイズを指定するので、毎回同じレイアウトで配置される。


'============================================================
' ■ Excelの表・グラフをPowerPointスライドに貼り付け(応用版)
'   → 表(セル範囲)を画像としてスライドに貼り付け
'   → グラフを画像としてスライドに貼り付け
'   → 位置・サイズを指定して正確に配置
'============================================================
Sub CreatePptWithTableAndChart()

    '--- ★書き換えポイント ---
    Dim savePath As String
    savePath = "C:\Output\売上報告.pptx"  '← 保存先のパス

    Dim sheetName As String
    sheetName = "Sheet1"  '← データがあるシート名

    Dim tableRange As String
    tableRange = "A1:D6"  '← 貼り付ける表の範囲
    '--- ★ここまで ---

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(sheetName)

    '--- PowerPoint を起動
    Dim ppApp As Object
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True

    Dim ppPres As Object
    Set ppPres = ppApp.Presentations.Add

    '=== スライド1: タイトル ===
    Dim ppSlide1 As Object
    Set ppSlide1 = ppPres.Slides.Add(1, 1)  ' タイトルスライド
    ppSlide1.Shapes(1).TextFrame.TextRange.Text = "売上報告"
    ppSlide1.Shapes(2).TextFrame.TextRange.Text = Format(Date, "yyyy年m月")

    '=== スライド2: 表を貼り付け ===
    Dim ppSlide2 As Object
    Set ppSlide2 = ppPres.Slides.Add(2, 12)  ' 白紙スライド

    '--- タイトルをテキストボックスで追加
    Dim titleShape As Object
    Set titleShape = ppSlide2.Shapes.AddTextbox( _
        Orientation:=1, _
        Left:=30, Top:=20, Width:=660, Height:=40)
    titleShape.TextFrame.TextRange.Text = "売上一覧表"
    titleShape.TextFrame.TextRange.Font.Size = 24
    titleShape.TextFrame.TextRange.Font.Bold = True

    '--- Excelの表をコピーしてスライドに貼り付け
    ws.Range(tableRange).Copy
    DoEvents  ' コピー完了を待つ
    ppSlide2.Shapes.PasteSpecial DataType:=2  ' 2 = 拡張メタファイル
    Application.CutCopyMode = False

    '--- 貼り付けた表の位置とサイズを調整
    Dim tblShape As Object
    Set tblShape = ppSlide2.Shapes(ppSlide2.Shapes.Count)
    tblShape.Left = 50
    tblShape.Top = 80
    tblShape.Width = 620
    tblShape.Height = 380

    '=== スライド3: グラフを貼り付け ===
    If ws.ChartObjects.Count > 0 Then
        Dim ppSlide3 As Object
        Set ppSlide3 = ppPres.Slides.Add(3, 12)  ' 白紙スライド

        '--- タイトルをテキストボックスで追加
        Dim chartTitle As Object
        Set chartTitle = ppSlide3.Shapes.AddTextbox( _
            Orientation:=1, _
            Left:=30, Top:=20, Width:=660, Height:=40)
        chartTitle.TextFrame.TextRange.Text = "売上推移グラフ"
        chartTitle.TextFrame.TextRange.Font.Size = 24
        chartTitle.TextFrame.TextRange.Font.Bold = True

        '--- Excelのグラフをコピーしてスライドに貼り付け
        ws.ChartObjects(1).Chart.CopyPicture xlScreen, xlPicture
        DoEvents
        ppSlide3.Shapes.Paste

        '--- 貼り付けたグラフの位置とサイズを調整
        Dim chtShape As Object
        Set chtShape = ppSlide3.Shapes(ppSlide3.Shapes.Count)
        chtShape.Left = 50
        chtShape.Top = 80
        chtShape.Width = 620
        chtShape.Height = 380
    End If

    '--- 保存
    ppPres.SaveAs savePath

    Set ppPres = Nothing
    Set ppApp = Nothing

    MsgBox "表・グラフ付きスライドを作成しました。" & vbCrLf & savePath, vbInformation

End Sub

書き換えポイント

変数 / 箇所 説明 初期値
savePath 生成した.pptxの保存先パス "C:\Output\売上報告.pptx"
sheetName データがあるシート名 "Sheet1"
tableRange スライドに貼り付ける表の範囲 "A1:D6"
ChartObjects(1) 貼り付けるグラフの番号 1番目のグラフ

コードの流れ

  1. タイトルスライドを作成する
  2. 白紙スライドを追加し、テキストボックスでタイトルを配置する
  3. ws.Range(範囲).CopyppSlide.Shapes.PasteSpecial で表を貼り付ける
  4. Left, Top, Width, Height で位置とサイズを調整する
  5. ChartObjects(1).Chart.CopyPictureppSlide.Shapes.Paste でグラフを貼り付ける

PasteSpecial の DataType: 2(拡張メタファイル)を指定すると高画質で貼り付けられる。0(デフォルト)だと編集可能なオブジェクトとして貼り付くが、ファイルサイズが大きくなることがある。

コード(実務版)– 一覧表から複数スライドを一括生成

実務では一覧データから複数のスライドを一括生成する場面がある。各行のデータをスライドのタイトル・本文に展開し、1つのプレゼンテーションとして保存する版。エラーハンドリング付き。

一覧シート(「スライド一覧」シート)のレイアウト:

A列 B列 C列 D列
スライドタイトル 本文 備考 ステータス
1月の売上報告 売上合計: 1,200万円。前月比115%で推移。 グラフ追加予定
2月の売上報告 売上合計: 1,350万円。前月比112%で推移。
3月の売上報告 売上合計: 1,500万円。前月比111%で推移。

'============================================================
' ■ 一覧データからPowerPointスライドを一括生成(実務版)
'   → 一覧シートの各行をスライドに展開
'   → タイトル+本文のスライドを行数分生成
'   → ステータス列にログ記録
'   → エラーハンドリング + ppApp.Quit 確実実行
'============================================================
Sub CreatePptBatch()

    '--- ★書き換えポイント ---
    Dim savePath As String
    savePath = "C:\Output\月次報告.pptx"  '← 保存先のパス

    Dim listSheet As String
    listSheet = "スライド一覧"  '← 一覧データのシート名

    Dim presTitle As String
    presTitle = "月次売上報告"  '← タイトルスライドのタイトル

    Dim presSubTitle As String
    presSubTitle = "営業企画部"  '← タイトルスライドのサブタイトル
    '--- ★ここまで ---

    '--- 出力先フォルダの存在チェック
    Dim outputFolder As String
    outputFolder = Left(savePath, InStrRev(savePath, "\"))
    If Dir(outputFolder, vbDirectory) = "" Then
        MsgBox "出力先フォルダが存在しません。" & vbCrLf & _
               outputFolder, vbExclamation
        Exit Sub
    End If

    Dim wsList As Worksheet
    Set wsList = ThisWorkbook.Worksheets(listSheet)

    Dim lastRow As Long
    lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row

    If lastRow < 2 Then
        MsgBox "一覧データがありません。" & vbCrLf & _
               "A2セル以降にデータを入力してください。", vbExclamation
        Exit Sub
    End If

    '--- PowerPoint を起動
    Dim ppApp As Object
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True

    Dim ppPres As Object
    Set ppPres = ppApp.Presentations.Add

    '--- タイトルスライドを追加
    Dim ppTitleSlide As Object
    Set ppTitleSlide = ppPres.Slides.Add(1, 1)  ' 1 = ppLayoutTitle
    ppTitleSlide.Shapes(1).TextFrame.TextRange.Text = presTitle
    ppTitleSlide.Shapes(2).TextFrame.TextRange.Text = presSubTitle & vbCrLf & Format(Date, "yyyy年m月d日")

    Dim genCount As Long
    Dim errCount As Long
    genCount = 0
    errCount = 0

    Dim i As Long
    For i = 2 To lastRow

        '--- タイトルが空欄ならスキップ
        If Trim(wsList.Cells(i, 1).Value) = "" Then
            wsList.Cells(i, 4).Value = "スキップ(タイトルなし)"
            GoTo NextRow
        End If

        On Error GoTo ErrHandler

        '--- コンテンツスライドを追加(レイアウト 2 = タイトルとコンテンツ)
        Dim slideIndex As Long
        slideIndex = ppPres.Slides.Count + 1

        Dim ppSlide As Object
        Set ppSlide = ppPres.Slides.Add(slideIndex, 2)

        '--- タイトルを設定
        ppSlide.Shapes(1).TextFrame.TextRange.Text = _
            wsList.Cells(i, 1).Value  ' A列:スライドタイトル

        '--- 本文を設定
        If Trim(wsList.Cells(i, 2).Value) <> "" Then
            ppSlide.Shapes(2).TextFrame.TextRange.Text = _
                wsList.Cells(i, 2).Value  ' B列:本文
        End If

        '--- フォント設定(見やすさ統一)
        ppSlide.Shapes(1).TextFrame.TextRange.Font.Size = 28
        ppSlide.Shapes(1).TextFrame.TextRange.Font.Bold = True
        ppSlide.Shapes(2).TextFrame.TextRange.Font.Size = 18

        '--- ステータスを記録
        wsList.Cells(i, 4).Value = "生成済み"
        genCount = genCount + 1
        On Error GoTo 0

NextRow:
    Next i

    '--- 保存
    On Error Resume Next
    ppPres.SaveAs savePath
    On Error GoTo 0

    '--- PowerPoint を終了しない(内容を確認するため)
    Set ppPres = Nothing
    Set ppApp = Nothing

    MsgBox genCount & " 枚のスライドを生成しました。" & vbCrLf & _
           "エラー:" & errCount & " 件" & vbCrLf & _
           "D列にステータスを記録しました。" & vbCrLf & vbCrLf & _
           "保存先:" & savePath, vbInformation, "完了"

    Exit Sub

ErrHandler:
    wsList.Cells(i, 4).Value = "エラー:" & Err.Description
    errCount = errCount + 1
    On Error GoTo 0
    Resume NextRow

End Sub

書き換えポイント

変数 / 箇所 説明 初期値
savePath 生成した.pptxの保存先パス "C:\Output\月次報告.pptx"
listSheet 一覧データのシート名 "スライド一覧"
presTitle タイトルスライドのタイトル "月次売上報告"
presSubTitle タイトルスライドのサブタイトル "営業企画部"

一覧シートの列構成

内容 必須
A列 スライドタイトル 必須
B列 本文 任意(空欄時は空のスライド)
C列 備考(マクロでは使用しない) 任意
D列 ステータス(自動記録) 自動

コードの流れ

  1. 事前チェック: 出力先フォルダの存在と一覧データの有無を確認
  2. PowerPointを起動: CreateObject("PowerPoint.Application") で起動
  3. タイトルスライド作成: プレゼンテーション全体のタイトルとサブタイトルを設定
  4. 一覧をループ: 2行目から最終行まで、行ごとにスライドを追加
  5. テキスト設定: A列のタイトルとB列の本文をスライドに設定
  6. フォント統一: フォントサイズ・太字を統一設定
  7. ステータス記録: D列に「生成済み」「スキップ」「エラー」を記録
  8. 保存: SaveAs で .pptx として保存

PowerPointを閉じない設計: 実務版では生成後にPowerPointを開いたままにしている。内容を確認してから手動で閉じる運用を想定。バックグラウンドで処理して自動終了したい場合は ppApp.Visible = False に変更し、SaveAs の後に ppPres.CloseppApp.Quit を追加する。

エラーハンドリングの仕組みは エラー処理で止まらないマクロを作る方法 を参照。ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。

よくある落とし穴5選

1. Quit忘れでPOWERPNT.EXEが残留する

自分もこれで失敗した。エラーが起きてマクロが途中で止まり、ppApp.Quit が実行されなかった。タスクマネージャーを開いたらPOWERPNT.EXEが大量に残っていた。PCが重くなった原因がこれだった。

対策: バックグラウンド処理する場合は、エラー発生時も必ず ppApp.Quit が実行されるよう、On Error でクリーンアップ処理を入れる。この記事の実務版コードではPowerPointを開いたまま確認する設計にしているが、自動終了する場合は ErrHandler 内で ppApp.Quit を忘れないこと。

2. スライドレイアウトの番号が環境によって異なる

自分もレイアウト番号を間違えて、意図しないレイアウトのスライドが生成されたことがある。Slides.Add の第2引数はレイアウト番号だが、テーマやバージョンによって番号が変わることがある。

対策: よく使うレイアウトは 1(タイトル)、2(タイトルとコンテンツ)、12(白紙)の3つ。これらは環境が変わっても概ね同じ。それでもズレる場合は ppPres.SlideMaster.CustomLayouts で利用可能なレイアウトを確認する。

3. ActiveXコンポーネントエラー429

原因: CreateObject("PowerPoint.Application") はPowerPointのデスクトップ版が必要。Web版やストア版では動作しない場合がある。

対策: PowerPointのデスクトップアプリがインストールされていることを確認する。Microsoft 365の場合、「アプリのインストール」からデスクトップ版をインストールする。

4. 貼り付けた表やグラフの位置・サイズがズレる

原因: Shapes.PasteShapes.PasteSpecial で貼り付けた直後は、位置やサイズが指定されていない。

対策: 貼り付け後に Left, Top, Width, Height プロパティで明示的に位置とサイズを指定する。応用版コードではこの調整を入れている。

5. グラフの画質が粗い

自分もグラフを貼り付けたら画質が粗くなったことがある。CopyPictureのFormat引数を指定していなかった。

対策: CopyPicture xlScreen, xlPicture で拡張メタファイル形式を指定する。ビットマップ(xlBitmap)よりも高画質で貼り付けられる。

VBAでExcelからPowerPointに表が貼り付けられないときの対処法

Shapes.PasteSpecial を実行すると『クリップボードにデータがありません』というエラーが出る」という場合、原因は Range.Copy の直後に DoEvents を入れていないことが多い。ExcelからPowerPointへのアプリ間コピペは、Excelのコピー処理が完了する前にPowerPoint側のPasteが実行されてしまうタイミング問題が起きやすい。対処法は、ws.Range(範囲).Copy の直後に DoEvents を1行入れること。これでExcelのコピーが完了してからPasteが実行される。自分も最初これを入れずに「5回に1回くらいエラーになる」という不安定な挙動に悩まされた。DoEventsを入れてからは一度もエラーが出ていない。

VBAで生成したPowerPointのレイアウトが崩れるときの対処法

「スライドを生成したらフォントや配置が意図したものと違う」という場合、原因は Slides.Add の第2引数(レイアウト番号)が環境やテーマによって異なることだ。たとえばレイアウト番号 2(タイトルとコンテンツ)が、会社のテンプレートでは別のレイアウトに割り当てられている場合がある。対処法は、まず白紙スライド(レイアウト 12)で追加し、テキストボックスやオブジェクトを Shapes.AddTextbox で自分で配置すること。テンプレートに依存しないので、どの環境でもレイアウトが崩れない。応用版コードではこの方法を採用している。

VBAでPowerPointのテンプレートにデータを差し込む方法がわからないときの対処法

「会社指定のPPTテンプレートがあるのに、新規プレゼンテーションでしかスライドが作れない」という場合、Presentations.Add の代わりに Presentations.Open("テンプレート.pptx") を使えばよい。既存テンプレートを開いてからスライドを追加すれば、会社のデザイン・マスタースライド・フォント設定がすべて引き継がれる。自分はこの方法を覚えてから、上司に「テンプレートに沿っていない」と指摘されることがなくなった。パスの指定は ファイルやフォルダの存在を確認してから処理する方法Dir チェックと組み合わせると安全だ。

FAQ

Q1: 既存のPowerPointテンプレート(.pptx)を使いたい

ppApp.Presentations.Open("C:\Template\テンプレート.pptx") でテンプレートを開き、Slides.Add でスライドを追加する。既存のデザインやマスタースライドをそのまま活用できる。

Q2: フォントやフォントサイズを変えたい

ppSlide.Shapes(1).TextFrame.TextRange.Font.Name = "メイリオ" でフォント名、.Font.Size = 24 でサイズ、.Font.Bold = True で太字を設定できる。実務版コードではフォントサイズの統一設定を入れている。

Q3: 生成したPowerPointをPDFで保存したい

ppPres.ExportAsFixedFormat savePath, 2 で保存できる(2 = ppFixedFormatTypePDF)。ExcelファイルのPDF変換は ExcelファイルをPDFに一括変換 も参考になる。

Q4: スライドに画像ファイルを挿入したい

ppSlide.Shapes.AddPicture "C:\画像\photo.jpg", False, True, Left, Top, Width, Height で画像を挿入できる。Left/Top で位置、Width/Height でサイズを指定する。

Q5: 1つのExcelファイルから複数のプレゼンテーション(.pptx)を作りたい

実務版コードをベースに、行ごとに Presentations.Add → スライド追加 → SaveAsClose のループに変更する。ファイル名はセル値から取得すればよい。

まとめ

  • CreateObject("PowerPoint.Application") で参照設定不要。コピペで動く
  • Slides.Add(番号, レイアウト) でスライドを追加し、Shapes.TextFrame.TextRange.Text でテキストを設定できる(基本版)
  • Range.CopyShapes.PasteSpecial で表を、CopyPictureShapes.Paste でグラフをスライドに貼り付けられる(応用版)
  • 一覧データをループして複数スライドを一括生成できる(実務版)

関連記事

次にやりたくなること

60枚のスライドが10分で完成すると、資料作成は「作業」から「内容の確認だけ」に変わる。しかも転記ミスがゼロになるので、ダブルチェックの時間もなくなる。自分はこのマクロを作ってから、毎月の月末報告が「憂鬱な1日」から「10分で終わるルーティン」に変わった。まずは基本版で「ExcelのデータがPowerPointに自動で入る」感覚を体験してみてほしい。一度動くのを見たら、もう手作業には戻れなくなるはずだ。

コメント

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