Home » エクセルマクロ・Excel VBAの使い方 » Office連携 » データ1件ごとにパワポのスライドにするExcelマクロ

データ1件ごとにパワポのスライドにするExcelマクロ

対象:Excel2007, Excel2010, Excel2013

「Excelのデータ1件ごとにPowerPointのスライドにするにはどういうマクロにすればいいのでしょうか?」
といった趣旨のご質問をいただきました。

データがExcel上にあるため、Excelマクロで作ろうという発想になるのは自然なことです。

ですが、このようなマクロを作るためには、Excel VBAの知識だけでは足りません。PowerPointのオブジェクト構造もしっかりと理解できている必要があります。

[スポンサードリンク]

レコードごとにパワーポイントのスライドにするサンプルマクロ

Excel上で、フィールドが3列、1行目からデータが入力されているデータベースが作られているときに、Excelの1行分のデータ(1レコード)を、PowerPointのスライドごとに、1行3列の表の形にしてデータを流し込んでいくというマクロをご紹介します。

Sub レコードごとにパワポのスライドにする()
 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_prs = Nothing
 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オブジェクトを取得することができるのです。

データ1件ごとにパワポのスライドにするExcelマクロ

それにつづく、

      ActiveSheet.Cells(r, c).Text

の部分は、Excel側の話なので、こちらはExcel VBAをご存知の方ならお馴染みの、Cellsプロパティです。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Office連携 » データ1件ごとにパワポのスライドにするExcelマクロ

「Office連携」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.