PowerPointのマクロを用いて、Excelファイルからスライドを作る方法を説明します。ここでは、Excelで作成した住所録からハガキの宛名を作成する方法(すなわち差し込み印刷)を例にとります。
Excelファイルからスライドを作りたい
世の中にはExcelの表形式にまとめられたデータが沢山存在します。住所録、キーワード、統計データ、等々・・・
そのようなExcelの1行分を1枚のカードに出力できたら便利なことがありませんか?
例えば、次のような場合です。
- 住所録からハガキの宛先を印刷したい(差し込み印刷)
- 百人一首を覚えるための暗記カードを作りたい
- キーワードを名刺大のサイズに印刷して文章構成を練りたい
僕の場合は3.に近いです。
僕は、近年、パワーポイントで情報カードを作っています。その運用にあたり、情報カードからExcelに出力する仕組みは構築しました。今度はExcelファイルからパワーポイントのスライドに戻す仕組みが欲しくなりました。
この仕組みは、いわゆる差し込み印刷とほぼ同様です。そこで、本記事では需要の多いと思われる差し込み印刷を説明します。(そして、後でちょっと改造して、自分の情報システムで使うことにします)
PowerPointのユーザー定義レイアウトの作り方
マクロでレイアウトすることは大変なので、スライドマスターの中にユーザー定義のレイアウトを作ります。
スライドマスタの完成形はこのようになります。
ハガキのイメージはこのようなシンプルな画像を使いました。
作成手順は次の通りです。
- パワーポイントを立ちあげる
- 「表示」→「スライドマスター」
- 「スライドのサイズ」→「ユーザー設定のスライドのサイズ」
- 「幅」を「10cm」、「高さ」を「14.8cm」に設定→「OK」→「最大化」
- 左側のサムネイル欄で、消せない大小1つずつのレイアウトを残して、その他を「Del」キーで削除
- 大きいサムネイルを選択し、全プレースホルダを選び、「Del」キーで削除
- 小さいサムネイルを選択し、全プレースホルダを選び、「Del」キーで削除
- 以下、小さいサムネイルでの作業
- 「挿入」タブ→「画像」でハガキのイメージを読み込む
- ハガキのイメージをスライドいっぱいに広げる
- 「スライドマスター」タブ→「プレースホルダーの挿入」→「テキスト」
- テキストボックス内の全てのテキストを削除
- 「ホーム」タブ→「段落」欄→「箇条書き」アイコンをクリックして中黒を消す
- 郵便番号のプレースホルダーとして、任意の7桁の数字を打ち込む
- 好みの郵便番号のフォントとサイズ(18くらい)をセット
- 「ホーム」タブ→「段落」欄→「均等割り付け」アイコンをクリック
- テキストボックスのサイズを調節して郵便番号欄に配置する
- 同様にして住所と氏名のテキストボックスのプレスホルダを配置する
- 小さいサムネイルを選択→右クリック→レイアウトの複製
- 複製されたレイアウトにおいて、ハガキのイメージを選択→「Del」で削除
- 「スライドマスター」タブ→「マスター表示を閉じる」
Excelによる住所録
次に、Excelで住所録を作ります。
A列、B列、C列は、それぞれ郵便番号、住所、敬称付き氏名です。
見出し行は作りませんでした。1行目からデータです。
マクロでは、第1のシートからデータを読むので、「Sheet1」シートに作成するか、シート数を1枚のみにしてください。
PowerPointのマクロ
PowerPointにマクロを登録し、それを動作させる手順は次の通りです。
(「開発」タブが表示されない場合は、こちらの記事をご参照ください。Excelの記事ですが同様の設定です。ただし、PowerPointではマクロの記録はできない仕様のようです)
- 「開発」タブ→「Visual Basic」を選択。
- 「プロジェクトエクスプローラ」→「VBAProject(ファイル名.pptm)」を右クリック
- 「挿入」→「標準モジュール」
- 以下に示すコードをコピー&ペースト
- 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では、ユーザ設定レイアウトを選ぶことができます。デフォルトの、
は、郵便番号枠の入ったレイアウトを使う設定です。
値を2に変更すると、無地のレイアウトを使う設定になり、スライド作成した直後に印刷することができます。
GetExcelFile
マクロの関数である、「GetExcelFile」では、
という行により、ファイルダイヤログにエクセルファイルのみを表示するようにフィルタリングしています。この行を変更すれば、他の種類のファイルを表示/選択します。
当然ながら、Excel以外のファイルを選ぶと、本マクロは動きません。ご自身でマクロを作る際に、必要に応じてご変更ください。
その他
Excelでは、郵便番号の途中にハイフンを挟みたくなる場合があることでしょう。でも、PowerPointのスライド上ではハイフンを抜かなければなりません。また、郵便番号は0始まりの場合があり、文字列で扱う必要があるかもしれません。住所や氏名を縦書きにしたい方もいらっしゃるでしょう。その際には、番地を漢数字にする方が見栄えが上がることでしょう。また、デフォルトの敬称を「様」としておき、特別な場合に「ちゃん」を使いたかったりするかもしれません。もちろんそのような対応をすることもできます。ただし、今回は説明を簡単にするために、そのような仕様を一切省きました。
まとめ
本記事は、ハガキに対する差し込み印刷を例として挙げながら、ExcelファイルからPowerPointのスライドをマクロで作る方法を説明しました。
市販の年賀状ソフトがあるので、このマクロを使って、ハガキに印刷する場面は少ないと思います。ただ、封筒に印刷するための修正は容易ですし、その他、少しの改造で、各種のスライドを瞬時に作ることができる可能性を秘めています。
コメント