PowerPointの差し込み印刷(≒Excelからスライドを作る方法)

PowerPointマクロを用いて、Excelファイルからスライドを作る方法を説明します。ここでは、Excelで作成した住所録からハガキの宛名を作成する方法(すなわち差し込み印刷)を例にとります。

スポンサーリンク

Excelファイルからスライドを作りたい

世の中にはExcelの表形式にまとめられたデータが沢山存在します。住所録、キーワード、統計データ、等々・・・
そのようなExcelの1行分を1枚のカードに出力できたら便利なことがありませんか?

例えば、次のような場合です。

  1. 住所録からハガキの宛先を印刷したい(差し込み印刷)
  2. 百人一首を覚えるための暗記カードを作りたい
  3. キーワードを名刺大のサイズに印刷して文章構成を練りたい

僕の場合は3.に近いです。
僕は、近年、パワーポイントで情報カードを作っています。その運用にあたり、情報カードからExcelに出力する仕組みは構築しました。今度はExcelファイルからパワーポイントのスライドに戻す仕組みが欲しくなりました。

この仕組みは、いわゆる差し込み印刷とほぼ同様です。そこで、本記事では需要の多いと思われる差し込み印刷を説明します。(そして、後でちょっと改造して、自分の情報システムで使うことにします)

PowerPointのユーザー定義レイアウトの作り方

マクロでレイアウトすることは大変なので、スライドマスターの中にユーザー定義のレイアウトを作ります。

スライドマスターに作成したユーザー定義のレイアウト

スライドマスターに作成したユーザー定義のレイアウト

スライドマスタの完成形はこのようになります。

ハガキのイメージ

ハガキのイメージ

ハガキのイメージはこのようなシンプルな画像を使いました。

作成手順は次の通りです。

  •  パワーポイントを立ちあげる
  •  「表示」→「スライドマスター」
  •  「スライドのサイズ」→「ユーザー設定のスライドのサイズ」
  •  「幅」を「10cm」、「高さ」を「14.8cm」に設定→「OK」→「最大化」
  •  左側のサムネイル欄で、消せない大小1つずつのレイアウトを残して、その他を「Del」キーで削除
  •  大きいサムネイルを選択し、全プレースホルダを選び、「Del」キーで削除
  •  小さいサムネイルを選択し、全プレースホルダを選び、「Del」キーで削除
  •  以下、小さいサムネイルでの作業
  •  「挿入」タブ→「画像」でハガキのイメージを読み込む
  •  ハガキのイメージをスライドいっぱいに広げる
  •  「スライドマスター」タブ→「プレースホルダーの挿入」→「テキスト」
  • 郵便番号欄付近にテキストボックスを作成
  •  テキストボックス内の全てのテキストを削除
  •  「ホーム」タブ→「段落」欄→「箇条書き」アイコンをクリックして中黒を消す
  •  郵便番号のプレースホルダーとして、半角で任意の7桁の数字を打ち込む
  •  好みの郵便番号のフォントとサイズ(18くらい)をセット
  •  「ホーム」タブ→「段落」欄→「均等割り付け」アイコンをクリック
  •  テキストボックスのサイズを調節して郵便番号欄に配置する
  •  同様にして住所と氏名のプレスホルダ(テキスト)を好みの位置、フォントで配置する
  •  小さいサムネイルを選択→右クリック→レイアウトの複製
  •  複製されたレイアウトにおいて、ハガキのイメージを選択→「Del」で削除
  •  「スライドマスター」タブ→「マスター表示を閉じる」
  • 「F12」→ファイルの種類から「PowerPoint マクロ有効プレゼンテーション(*.pptm)」を選ぶ
  • 任意のファイル名を付けて「保存」

Excelによる住所録

次に、Excelで住所録を作ります。

Excelで作成した住所録

Excelで作成した住所録

A列、B列、C列は、それぞれ郵便番号、住所、敬称付き氏名です。郵便番号は半角で入力してください。
見出し行は作りませんでした。1行目からデータです。

マクロでは、第1のシートからデータを読むので、「Sheet1」シートに作成するか、シート数を1枚のみにしてください。

任意の名前をつけて保存してください。

PowerPointのマクロ

PowerPointにマクロを登録し、それを動作させる手順は次の通りです。

(「開発」タブが表示されない場合は、こちらの記事をご参照ください。Excelの記事ですが同様の設定です。ただし、PowerPointではマクロの記録はできない仕様のようです)

  • PowerPointの「開発」タブ→「Visual Basic」を選択
  • 「プロジェクトエクスプローラ」→「VBAProject(ファイル名.pptm)」を右クリック
  • 「挿入」→「標準モジュール」
  • 以下に示すコードをコピー&ペースト
  • 「ツール」→「参照設定」→「Microsoft Excel xx.x Object Library」をチェック→「OK」
    ※ 僕の場合は、xx.xは16.0でした
  • PowerPointに戻って、「開発」タブ→「マクロ」→「CreateSlides」を選択→「実行」
  • 「ファイルダイアログ」→「Excelの住所録ファイル」を選択→「開く」

これで、あて先を示すスライドが作成されます。
実際に印刷する場合には、郵便番号の枠を印刷しないように、次のようにしてください。

  • サムネイル欄で、全スライドを選択→「ホーム」タブ→「レイアウト」→郵便番号枠の無いレイアウトを選択
Option Explicit

'-----------------------------------------------------------------------
' Summary: ユーザー設定レイアウトのスライドを1枚追加する
' Output : 追加したSildeオブジェクト
'-----------------------------------------------------------------------
Public Sub AddSlide(ByRef pptSlide As Slide)
    ' ユーザ設定レイアウトのインデックス番号
    Const cstTargetDesign As Integer = 1
    ' ユーザ設定レイアウトの宣言
    Dim pptLayout As CustomLayout
    ' インデックスで指定するユーザ設定レイアウトを取得する
    Set pptLayout = ActivePresentation.Designs(1).SlideMaster _
            .CustomLayouts(cstTargetDesign)
    ' スライドを1枚追加しつつ、出力値として設定する
    Set pptSlide = ActivePresentation.Slides _
            .AddSlide(ActivePresentation.Slides.Count + 1, pptLayout)
End Sub

'-----------------------------------------------------------------------
' Summary: ファイルダイヤログを開いてExcelファイルのPathを取得する
'-----------------------------------------------------------------------
Private Function GetExcelFile() As String
    ' FileDialogオブジェクトを宣言する
    Dim fd As FileDialog
    ' FileDialogオブジェクトをファイルピッカーダイアログとする
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    ' 選択されたファイルへのPathを保持する変数の宣言
    Dim strFile As String
    With fd
        ' Excelファイル選択用のフィルタをセット
        .Filters.Add "エクセルブック", "*.xls*"
        ' 単一ファイル選択
        .AllowMultiSelect = False
        ' ボタンが押された場合の処理
        If .Show = True Then
            ' ファイルのPathを変数にセットする
            strFile = .SelectedItems(1)
       End If
    End With
    ' FileDialogオブジェクトの解放
    Set fd = Nothing
    ' 戻り値のセット
    GetExcelFile = strFile
End Function

'-----------------------------------------------------------------------
' Summary: ExcelファイルからPowerpointのスライドを作成する
'-----------------------------------------------------------------------
Public Sub CreateSlides()
    ' ファイルのPathを保持する変数の宣言
    Dim strFile As String
    ' ExcelファイルへのPathを取得する
    strFile = GetExcelFile
    ' ExcelファイルへのPathが取得できなければ何もしないで終了
    If strFile = "" Then Exit Sub
    
    ' Excelアプリケーションの宣言
    Dim xlApp   As New Excel.Application
    ' ワークブックの宣言
    Dim xlBook  As Excel.Workbook
    ' Excelファイルを読み取り専用で開く
    Set xlBook = xlApp.Workbooks.Open(FileName:=strFile, ReadOnly:=True)
    ' Excelワークシートの宣言
    Dim xlSheet As Excel.Worksheet
    ' 1枚目のワークシートをオブジェクトに紐付ける
    Set xlSheet = xlBook.Worksheets(1)
    ' Rangeオブジェクトの宣言
    Dim rng As Excel.Range
    ' Rangeオブジェクトを使用範囲とする
    Set rng = xlSheet.UsedRange
    ' 行用のループ変数の宣言
    Dim i As Integer
    ' 行数分だけループする
    For i = 1 To rng.Rows.Count
        ' スライドオブジェクトの宣言
        Dim pptSlide As Slide
        ' ユーザー設定レイアウトのスライドを1枚追加する
        Call AddSlide(pptSlide)
        ' 列用のループ変数の宣言
        Dim j As Integer
        ' スライド内のShape数とExcelの列数の少ない方までループする
        For j = 1 To IIf(pptSlide.Shapes.Count < rng.Columns.Count, _
                pptSlide.Shapes.Count, rng.Columns.Count)
            ' 各Shapeにテキストをセットする
            pptSlide.Shapes(j).TextFrame.TextRange.Text = rng(i, j).Value
        Next j
    Next i
    
        ' シートを解放する
    Set xlSheet = Nothing
    ' ワークブックが存在することの確認
    If xlBook Is Nothing = False Then
        ' ワークブックを閉じる
        xlBook.Close
        ' ワークブックを解放
        Set xlBook = Nothing
    End If
    ' エクセルアプリケーションが存在することの確認
    If xlApp Is Nothing = False Then
        ' アプリケーションを停止する
        xlApp.Quit
        ' アプリケーションを解放する
        Set xlApp = Nothing
    End If
End Sub

 

各種の調整等

ユーザ設定レイアウト

AddSlideでは、ユーザ設定レイアウトを選ぶことができます。デフォルトの、

Const cstTargetDesign As Integer = 1

は、郵便番号枠の入ったレイアウトを使う設定です。
値を2に変更すると、無地のレイアウトを使う設定になり、スライド作成した直後に印刷することができます。

GetExcelFile

マクロの関数である、「GetExcelFile」では、

.Filters.Add “エクセルブック”, “*.xls*”

という行により、ファイルダイヤログにエクセルファイルのみを表示するようにフィルタリングしています。この行を変更すれば、他の種類のファイルを表示/選択することができます。

当然ながら、Excel以外のファイルを選ぶと、本マクロは動きません。ご自身で別のマクロを作る際に、必要に応じてご変更ください。

その他

Excelでは、郵便番号の途中にハイフンを挟みたくなる場合があることでしょう。でも、PowerPointのスライド上ではハイフンを抜かなければなりません。また、郵便番号は0始まりの場合があり、文字列で扱う必要があるかもしれません。住所や氏名を縦書きにしたい方もいらっしゃるでしょう。その際には、番地を漢数字にする方が見栄えが上がることでしょう。また、デフォルトの敬称を「様」としておき、特別な場合に「ちゃん」を使いたかったりするかもしれません。もちろんそのような対応をすることもできます。ただし、今回は説明を簡単にするために、そのような仕様を一切省きました。

まとめ

本記事は、ハガキに対する差し込み印刷を例として挙げながら、ExcelファイルからPowerPointのスライドをマクロで作る方法を説明しました。

市販の年賀状ソフトがあるので、このマクロを使って、ハガキに印刷する場面は少ないと思います。ただ、封筒に印刷するための修正は容易ですし、その他、少しの改造で、各種のスライドを瞬時に作ることができる可能性を秘めています。

 

コメント

  1. 西川公平 より:

    はじめまして
    本文
    <>
    のところで、
    「VBAがブレークモードになっているためこの機能を起動できません」
    と出て、VBAに戻ってデバックすると
    Public Sub CreateSlides()
    ‘ Excelアプリケーションの宣言
    Dim xlApp As New Excel.Application
    のところで
    「コンパイルエラー:ユーザー定義型が定義されていません」
    というエラーが出ますので、実行できません。

    • みすく より:

      西川様

      コメントをありがとうございます。
      「コンパイルエラー:ユーザー定義型が定義されていません」
      というエラーは、参照設定がされていないために出ていると思います。
      下記手順をお試しください。

      1)エラーが出ている状態から、「OK」をクリックしてエラーメッセージを閉じます。
      2)メニューの一行下にある「■」アイコン(リセット)をクリックします
      3)「ツール」メニュー→「参照設定」を選択
      4)「Microsoft Excel xx.x Object Library」をチェック→「OK」
        xx.xには、16.0などの数字が入ります。複数ある場合は、一番大きな数字を選んで下さい

      4)でチェックを入れるときに、チェックボックスにレ点が確実に入っていることを確認してください。たまに、選択されてただけで、レ点が付いていない場合があります。
      これで改善しない場合は、再度、ご連絡下さい。
      よろしくお願いいたします。

  2. 白井 より:

    はじめまして。

    百人一首を暗記する等の教材作成にマクロを使わせて頂きました。
    上の句は最初から表示させておき、下の句はクリックしたらスライドインさせる等、Wordへの差し込みとは違う動きをつけたくて参考になる情報を探しておりましたところ、こちらにたどり着きました。
    有難うございました。

    • みすく より:

      白井様、コメントをありがとうございました。
      自分は、紙に印刷することばかり考えておりましたが、おっしゃられる通り、パワーポイントでそのまま使うこともできますね。
      目からうろこのコメントでした。
      是非、マクロを有効にお使いいただければと存じます。
      よろしくお願いいたします。

  3. 石原 より:

    みすく様
    読ませていただき、大変興味深かったです。でもVBAはそもそも全く分からず、途中で断念しました。でもスライドマスターの部分は大いに助かりました。
    私の目標はエクセルで作成した、単語帳の表の列と裏の列をパワポ に入れて、教室で使いたいというものです。試行錯誤の結果、①ワードの差し込み機能を使いRTFファイルで保存、②(ワードは必ず終了して)パワポ のアウトラインを使ってスライドマスターに流し込むという迂回路で綺麗にできました。
    現在のスライドマスターの画面は「工事中」の様相ですが、きっともっとエレガントに、そして三列以上のデータ(例:住所録)もできるのかなと思っております。また別の機会に、その仕上げなどについてご教示いただければ幸甚です。
    ご報告とお礼申し上げます。

    • みすく より:

      石原様
      コメントをありがとうございました。
      パワポのアウトラインを使って、流し込むという方向もあるのですね。
      いろいろな方法のうち、そちらの方が効率が良い場合もあるかもしれません。
      「RTFファイルで保存」とか、「ワードは必ず終了して」など、いろいろな工夫をされたことと拝察いたします。
      情報を共有いただき、ありがとうございます。
      このコメント欄を通じて、沢山の方々が新たなスキルを共有できると嬉しく思います。
      今後ともどうぞよろしくお願い申し上げます。

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