みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでPowerPointを操作する方法についてお伝えしています。
前回は以下の記事で、エクセルVBAでエクセル上のグラフをPowerPointに貼り付ける方法をお伝えしました。
そして、前々回ではエクセルVBAでグラフのデータを次々と変更するプログラムを紹介しましたね。
そしてそして、こちらの記事。
PowerPointのスライドを複製していくプログラムを紹介しました。
さて、この三つを組み合わせるとどういうことができるか…?
そうです、グラフのデータ範囲を変更しながら次々にPowerPointに貼り付けていくことができるんですね。
では、早速試してみましょう!
お題の確認とおさらい
お題となるエクセルのグラフは以前と同様こちらを使います。シート名は「Sheet2」、グラフは「Chart 1」という名前のChartObjectです。
PowerPointのほうですが、こちらのひな形を使います。ファイル名は「ひな形.pptx」です。
エクセル上のグラフ範囲を変更していくプログラムをベースに
まず、エクセル上のグラフを範囲を変更していくプログラムですが以下の通りです。
Sub グラフのデータ範囲の変更()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet2")
Dim cht As chart
Set cht = ws.ChartObjects("Chart 1").chart
'★ここにPowerPoint関連のオブジェクトの準備
Dim i As Long
i = 3
Do While ws.Cells(i, 1).Value <> ""
With cht
.SetSourceData Union(ws.Range("C1:U2"), ws.Range("C1:U1").Offset(i - 1, 0)) 'グラフの対象範囲を変更
.Refresh 'グラフの表示を更新
End With
'★ここに①PowerPointスライドを複製
'★ここに②複製したスライドにグラフをコピー&ペースト
i = i + 1
Loop
End Sub
Do Whileループで対象となる行を走査しながら、SetSourceDataメソッドで対象となるグラフ範囲を変更、Refreshメソッドでグラフの表示を更新しています。
ベースはこのプログラムを使っていきます。
プログラム内の「★」の箇所にコメントで入れている通り
- ①PowerPointスライドを複製
- ②複製したスライドにグラフをコピー&ペースト
する処理を入れつつ、それらで使用するPowerPoint関連のオブジェクトや変数の準備を冒頭に挿入すればOKですね。
PowerPointスライドを複製する処理
①PowerPointスライドを複製する処理はこちら。
countSld = ppPrs.Slides.count
ppPrs.Slides(1).Duplicate.MoveTo(countSld + 1) '1ページ目を複製して最終ページへ移動
新しいメソッドがありますので解説をします。
MoveToメソッドでスライドを末尾に移動
MoveToメソッドは指定の番号にスライドを移動します。
countSldにはcountプロパティで複製をする前の末尾のスライド番号ということになりますから、今回の例では複製したスライドをすぐに末尾に移動するという処理になります。
なぜ末尾に移動しているかわかりますか?
Duplicateメソッドは、デフォルトでは複製元のスライドのすぐ後に複製をします。複製元はスライド1ですから、常にスライド2の位置に複製が挿入されるという形になります。
すると、後から作られるグラフのほうが若いスライド番号に貼られるということになります。具体的には北海道のスライドが一番末尾に来て、沖縄のスライドが2枚目に来ちゃうということです。
こいつは気持ち悪い…!
ということで、MoveToメソッドで新たに作成したスライドを常に末尾に移動して、その末尾のスライドにグラフをペーストをするという処理にしているということです。
複製したスライドにグラフをコピー&ペーストする処理
②複製したスライドにグラフをコピー&ペーストはこちらです。
ws.ChartObjects("Chart 1").chart.CopyPicture xlScreen, xlPicture 'グラフを画像としてコピー
ppPrs.Slides(countSld + 1).Shapes.Paste 'グラフ画像をペースト
ppPrs.Slides(countSld + 1).Shapes(3).TextFrame.TextRange.Text = ws.Cells(i, 2).Value 'スライドタイトルに都道府県名
グラフのコピー&ペーストは前回お伝えした通りですね。
3行目ですが、わかりやすさのためにスライドのタイトルに都道府県名を入れています。
グラフ範囲を変更しながらPowerPointに貼り付けていくプログラム
以上を踏まえて、プログラムとしてまとめますと、こちらのようになります。
Sub グラフ範囲を変更しながらPowerPointに貼り付ける()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet2")
Dim cht As chart
Set cht = ws.ChartObjects("Chart 1").chart
Dim ppApp As New PowerPoint.Application
ppApp.Visible = True
Dim ppPrs As PowerPoint.Presentation
Set ppPrs = ppApp.Presentations.Open(ThisWorkbook.Path & "\ひな形.pptx")
Dim countSld As Long 'スライド数を格納
Dim i As Long
i = 3
Do While ws.Cells(i, 1).Value <> ""
With cht
.SetSourceData Union(ws.Range("C1:U2"), ws.Range("C3:U3").Offset(i - 3, 0))
.Refresh
End With
countSld = ppPrs.Slides.count
ppPrs.Slides(1).Duplicate.MoveTo (countSld + 1) '1ページ目を複製して最終ページへ移動
ws.ChartObjects("Chart 1").chart.CopyPicture xlScreen, xlPicture 'グラフを画像としてコピー
ppPrs.Slides(countSld + 1).Shapes.Paste 'グラフ画像をペースト
ppPrs.Slides(countSld + 1).Shapes(3).TextFrame.TextRange.Text = ws.Cells(i, 2).Value 'スライドタイトルに都道府県名
i = i + 1
Loop
'ppApp.Quit
'Set ppApp = Nothing
End Sub
実行結果
こちらのプログラムを実行している様子がこちらです。
最後まで実行していませんが、スライドが追加されながら、それぞれの都道府県のグラフがペーストされているのがわかると思います。
まとめ
以上、エクセルVBAでグラフのデータ範囲を変更しながらPowerPointに連続して貼り付ける方法について紹介しました。
もう、これができちゃうと、コピペでスライド作るのがバカバカしくなっちゃいます…ね。
さて、次回ですがグラフのデータ範囲だけでなく、グラフタイトルも変更しながら貼り付けていきたいと思います。
どうぞお楽しみに!
連載目次:エクセルVBAでグラフとPowerPointを操作する
エクセルで様々な集計や分析をした結果の表やグラフを、最終的にPowerPointに貼り付け…という作業は結構多いですよね。1つ2つなら良いですが、大量にあった場合は大変です。そんな時にはVBAで自動化をしてしまいましょう!- エクセルVBAでPowerPointを操作するための準備と最も簡単なプログラム
- エクセルVBAでPowerPointのプレゼンテーションを開く方法・スライドを取得する方法
- エクセルVBAでPowerPointスライド上のシェイプ一覧を取得する
- エクセルVBAでPowerPointの特定のシェイプのインデックス番号を調べる方法
- エクセルVBAでPowerPointのテキストボックスに文字を入力する
- エクセルVBAでPowerPointでタイトルを変更しながらスライドを大量に生成する
- 初心者でも分かる!エクセルVBAでグラフを操作し取り扱うための超基本の第一歩
- エクセルVBAでグラフの元となるデータ範囲を次々と変更するプログラム
- 簡単!エクセルVBAでシート上のグラフをコピーしてPowerPointにペーストする
- エクセルVBAでグラフのデータ範囲を変更しながらPowerPointに連続して貼り付ける
- エクセルVBAでグラフタイトルを変更する方法とChartTitleについて
- エクセルVBAでグラフの軸の最大値・最小値や軸タイトルを設定する方法