「Excelのデータ1件ごとにPowerPointのスライドにするにはどういうマクロにすればいいのでしょうか?」
といった趣旨のご質問をいただきました。
データがExcel上にあるため、Excelマクロで作ろうという発想になるのは自然なことです。
ですが、このようなマクロを作るためには、Excel VBAの知識だけでは足りません。PowerPointのオブジェクト構造もしっかりと理解できている必要があります。
レコードごとにパワーポイントのスライドにするサンプルマクロ
Excel上で、フィールドが3列、1行目からデータが入力されているデータベースが作られているときに、Excelの1行分のデータ(1レコード)を、PowerPointのスライドごとに、1行3列の表の形にしてデータを流し込んでいくというマクロをご紹介します。
Dim ppt_app As Object 'PowerPoint
Dim ppt_prs As Object 'PowerPoint Presentation
Dim c As Long 'Column Number
Dim r As Long 'Row Number
Dim r_end As Long 'End Row Number
Dim msg As String
r_end = Range("A1").End(xlDown).Row
If r_end >= 300 Then
msg = "データが、" & Format(r_end, "#,##0") & "件あるため、処理に相当な時間がかかる可能性があります。実行しますか?"
If MsgBox(msg, vbYesNo) = vbNo Then Exit Sub
End If
Set ppt_app = CreateObject("PowerPoint.Application")
With ppt_app
.Visible = True
Set ppt_prs = .Presentations.Add
End With
For r = 1 To r_end
With ppt_prs.Slides
.Add _
Index:=r, _
Layout:=4 'ppLayoutTable
With .Item(r)
.Shapes.AddTable _
NumRows:=1, _
NumColumns:=3
With .Shapes(2).Table
For c = 1 To 3
.Cell(1, c).Shape.TextFrame.TextRange = _
ActiveSheet.Cells(r, c).Text
Next c
End With
End With
End With
Next r
Set ppt_app = Nothing
End Sub
上記のExcelマクロを実行すると、PowerPointが起動して、アクティブシート上のデータがPowerPointのスライドの表に流し込まれます。
サンプルマクロの解説
A列の最終行番号を変数に格納して、
r_end = Range("A1").End(xlDown).Row
データが300件以上のときには、
If r_end >= 300 Then
確認メッセージを表示して、
msg = "データが、" & Format(r_end, "#,##0") & "件あるため、処理に相当な時間がかかる可能性があります。実行しますか?"
[いいえ]ボタンが押されたときは処理を終了します。
If MsgBox(msg, vbYesNo) = vbNo Then Exit Sub
とりあえず300件でチェックするようにしていますが、このマクロを動かすパソコンのスペックや実際のデータ量でこの値は調整してください。
上記のメッセージボックスで[はい]ボタンが押されたときは、PowerPointをCreateObjectして、
Set ppt_app = CreateObject("PowerPoint.Application")
PowerPointを表示して、
With ppt_app .Visible = True
新しいプレゼンテーションファイルを作ります。
Set ppt_prs = .Presentations.Add
実行スピードを上げるためには、表示を最後にするほうが勿論いいのですが、動きが見えるほうが理解しやすいでしょうから、ここでは最初に表示しています。
Excelのアクティブシートの1行目から最終行までループ処理を開始します。
For r = 1 To r_end
今回は1行目からデータが入っているという仕様なのでループを「1」からはじめていますが、1行目にフィールド見出しがあって2行目からデータがはじまっているのなら、ループは「2」から開始してください。
ループの中で、PowerPointのプレゼンテーションファイルの最後に、表形式のスライドを追加します。
With ppt_prs.Slides .Add _ Index:=r, _ Layout:=4
参照設定をしていない形のマクロにしているので、
Layout:=4
と、スライドの種類を数値で指定していますが、参照設定していればPowerPointの定数・ppLayoutTableで指定することができます。
追加したスライドに、
With .Item(r)
1行3列の表を追加します。
.Shapes.AddTable _ NumRows:=1, _ NumColumns:=3
追加した表にExcelからデータを流し込みます。
With .Shapes(2).Table For c = 1 To 3 .Cell(1, c).Shape.TextFrame.TextRange = _ ActiveSheet.Cells(r, c).Text Next c End With
このループは、今回は3列のフィr-ルドがあるという仕様なので、「1」から「3」までループを回しています。
Excel VBAはわかるけれど、PowerPoint VBAのことをご存知ない方だと、
.Cell(1, c).Shape.TextFrame.TextRange = _
の「Cell(1, c)」を、「Cells(1, c)」ではないかと考えてしまうかもしれませんが、「Cell」でOKです。
オブジェクトブラウザーで確認するとわかるとおり、PowerPoint VBAで表を扱うときは、TableオブジェクトのCellメソッドで個々のセルをあらわすCellオブジェクトを取得することができるのです。
それにつづく、
ActiveSheet.Cells(r, c).Text
の部分は、Excel側の話なので、こちらはExcel VBAをご存知の方ならお馴染みの、Cellsプロパティです。
Home » エクセルマクロ・Excel VBAの使い方 » Office連携 » データ1件ごとにパワポのスライドにするExcelマクロ