2012
10
04

[VBA]PowerPointの指定したスライドへExcelグラフを最背面で貼り付ける

パワポへの貼り付けについての記事、かなり沢山の方にご覧頂いているようで、大変嬉しいです。前に書いたものの派生と言いますか、ちょっと違うアプローチの仕方でのコピペコードのご紹介です。


前に書いた記事

こちらの記事へ質問を頂きまして、それについて(全部は無理でしたが)なんとかなりそうだったので、記事にしてみました。

追記:更にグラフや表を好きな場所へ好きな大きさでコピペできるのも書きました。

目的

121004-1

既存のpptの指定シートに、Excelの指定グラフをそれぞれ貼り付けるという感じです。

121004-2

差し替えるということは、新しく貼り付けたグラフを最背面へ移動させて、古いグラフを削除したいということですね。

テキストボックスや図形などが重なったレイアウトのものは面倒なので、Excel上で全部体裁を整えたうえで、pptにはまるっとコピペするだけ簡単!っていうのが前述した記事の概要なんですが、やはりグラフ以外の要素はpptでいじれるようになっていて欲しい(そうせざるを得ない)という方も結構多いんだと思います。

結論から申し上げますと、「古いグラフを削除する」という項目だけは実装できませんでした。。既存のpptファイルの中の、消したいグラフのシェイプ番号が特定できないというのが理由です。

スライドによって番号が違ってきてしまうし、間違って他のシェイプ(テキストボックスとか図形とか)を消してしまっても問題なので、ここだけは手動で消して頂くしかないかなぁというのが、今の私の結論です。どなたか良い方法ありましたら教えてください!

[2014/8/20追記] 削除方法ひらめきました!これ書いてから2年近く経ってしまっていますが、せっかくなので記事の末尾に追記しておきますー!

コード

※もっと省コードのやり方を教えて頂けました!解説はこのままにしておきますが、ご使用は追記のコードがお勧めです。

起動などに関してはこちらの記事をご参照ください。

ハイライトしてある部分を変更してお使いください。起動の際には、貼り付け先のPowerPointファイルを開いた状態にしておいてください。

利用時の設定

コピー元、貼り付け先を指定する

121004-3

例えば、PecNmb=3としたら3回コピペ処理を繰り返すわけですが、

  1. 1回目のループは、シート名1グラフ名1を、スライド番号1へコピペする
  2. 2回目のループは、シート名2グラフ名2を、スライド番号2へコピペする
  3. 3回目のループは、シート名3グラフ名3を、スライド番号3へコピペする

という処理を行います。コピー元のExcelシートが一つで、その中に複数グラフがある場合はシート名は3つとも同じ名前になります。省略することはできませんので、回数分書いてください。

また、シートが違うとグラフ番号がリセットされるため、sheet1のグラフ1sheet2のグラフ1という場合も有り得ます。この場合、違うグラフであっても指定するグラフ名には同じ文字列が続くことになります。

スライド番号は、表紙を含めた数値になります。

グラフ名の調べ方

121004-4

白い矢印にしてから、

121004-5

グラフを選択すると、左上に出てくるのがグラフ名です。

121004-6

「グラフ_1」のように半角スペースが入っていたりしますので、コピペすると確実です。正しい名前を入力しないとエラーになります。

貼り付け位置、大きさを指定する

121004-7

図のように設定できますので、お好みの数値を入れてください。グラフの縦横比は固定になっているので横幅だけ設定すれば縦幅は自動ですが、比率を無視して大きさを決めたい場合は42行目から設定してください。

コードの解説

できるだけ汎用的になれば良いなぁと思って配列を使って冒頭で指定してもらって、あとはコピペをループさせる仕組みになっています。

ちょっと悩んだのが、pptに貼り付けした時点でグラフがアクティブ状態にならなかったところ。アクティブになってればそのまま位置・大きさ補正に繋げられたのですが、困ってしまいました。

どうにか考えて、貼り付けたグラフはそのスライドでの最終シェイプ番号になっているだろうと検討をつけ、存在しないであろうシェイプの数値を指定(32行目)してわざとエラーを起こし、存在するシェイプ番号になるまでマイナスしていくというちょっと強引なことをしています。

ひとつのスライドに既存のシェイプ(テキストボックスとか図形など)が100個以上ある場合は(そんなにないと思うんですがw)、それより大きい数にしてみてください。あんまり大きな数にすると重くなっちゃいますが…。

更にそこで、最終のシェイプ番号が分かれば、-1すればその前に作成されたシェイプになるんじゃね?それをdeleteすれば古いグラフ消せるんじゃね?とも思ったんですが、その番号が必ず消したいグラフの番号とは限らないわけで…やはり断念しました_(┐「ε:)_

と、いう感じで勉強も兼ねて書かせて頂きました。ニッツさん、いかがでしたでしょうか。古いグラフの特定の仕方ものんびり探していければと思っています。

2013/1/13追記:省コードver

コメント欄より、最終シェイプ番号を取得する方法を教えて頂けましたー!これなら、わざとエラーを起こしてループさせるなんて強引な方法を取らずに済みますね。こんなに短くなっちゃいます!

yamaさん、本当にありがとうございました!

2014/8/20追記:古いグラフを削除するver

もしも「このVBAを今後も使用」し、「差し替え対象がこのVBAで貼付けたモノ」だった場合、貼付けた時点で名前を定義してしまえば、その名前のシェイプを指定して削除してやれば良いのでは?と考えました。

定義した名前のシェイプが存在しない場合(初回であったり、手動で削除されていたり)もあるので、スライド内のシェイプ名を全部確かめて、存在したら削除する、という方法にしています。

今回のコードはコピーする部分を.CopyPictureではなく.Copyにしてみたので、グラフなどはそのまま貼付けられる仕様です。(モノによっては重くなるので画像として貼り付けたい方は先述のコードをご参照ください。)

ハイライト部分が、targetという名前のシェイプを削除したり定義したりしている部分です。同名では定義できないので、先に消しておかないといけません。

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2012/10/04
更新日:2014/08/20


16件のコメント

  • ニッツ
    2012年10月18日 11:24 AM

    youさん、こんなにキレイに分かりやすく説明してもらってどうもありがとうございます!大変感動しました。
    確かに古いグラフだけを消すという特定が難しいですよね・・・。無理なお願いをしてしまい悩ませてすみませんでした。
    でも、その他の作業はやりたかった事にほぼ近いものが出来そうですので、上手くアレンジして使わせて頂きます。
    他にも日々楽にしたいなぁ、という作業が多々ありますが、また機会があれば質問させて頂きたいと思います!
    ホントにありがとうございました!

    • you
      2012年10月19日 1:30 AM

      ニッツさん、フィードバックありがとうございます。
      ご要望に沿ったことができたか不安だったんですが、多少なりともお役に立てたようで何よりです。私も今回のことでいろいろ勉強になりました。
      VBAでの効率化、ハマるととっても面白くなってきますよね。是非がんばってください!

  • yama
    2013年1月30日 10:57 AM

    非常にわかりやすいコードで参考になりました。パワポに貼り付ける仕事は多いので重宝します。

    最終のシェープ番号をとるところですが、スライドにグラフを貼り付けた直後に「スライド内に何個シェープがあるか」を数えるととれるようです。このコードでいうと、
    With ppSld.Shapes(i)

    With ppSld.Shapes(ppSld.Shapes.Count)
    とすればできると思います。

    • *you
      2013年1月30日 1:10 PM

      yamaさん、コメントありがとうございます。
      ppSld.Shapes.Count…!なるほどそんな方法が…!
      早速記事に追記させて頂きました、本当にありがとうございました!

  • のんびり
    2013年6月4日 11:40 AM

    Excelの(グラフではなく)セルの表をそのままPPTの既存スライドに埋め込んでいくにはどうしたらいいのでしょうか? 知っていたら教えてください。よろしくお願いいたします。

    • *you
      2013年6月4日 12:57 PM

      のんびり さん、コメントありがとうございます。
      追記のほうのコードを以下のように差し替えてみてください。

      シート名1の範囲1を、スライド番号1へコピペ(2,3…と続く)というコードになります。範囲は"A1:G10"のように指定してください。

  • のんびり
    2013年6月4日 4:02 PM

    早急な回答ありがとうございます。いわれてたとおりにいれてみたのですが、型が一致しませんと出てしまいます。何が原因かわかりますか?

    • *you
      2013年6月4日 5:02 PM

      すみません、さすがにそれだけではなんとも…。

      先ほど本文にそのまま書いたらダブルクォーテーション等が全角などに整形されてしまっていたようなので、書き直しました。もう一度追記のほうのコードコピーから試してみて頂けますか。

      まるごとコピーの際は、コードへマウスを乗せたときに右上に出てくるアイコンの左から2番目の「クリップボードのコピー」で、差し替えのときは1番左のアイコンで「ソースを表示」してから該当部分だけコピーして頂けると間違いがないかと思います。

      現在ではそのまま選択してコピーできる仕様になっています。

  • のんびり
    2013年6月4日 5:30 PM

    丁寧な回答ありがとうございました。
    もう一度組みなおしたところ成功しました!(^^)!
    どこか文字が間違っていたみたいです(汗)
    VBAをちゃんと勉強してみたくなりました★本当にありがとうございます。

    • *you
      2013年6月4日 9:07 PM

      わぁ、よかったです!(*´∀`*)
      一文字でも違ってたりするとうまく走らなかったりするので、慣れるまではちょっと難しいですよね。
      でも興味を持って頂けて嬉しいですー!

  • のんびり
    2013年6月5日 10:01 AM

    昨日はとても助かりました。
    PPとExcelの連携をよく使用するのですが、その連携が詳しく書かれている本をご存じですか? もし、知っていれば教えてください。 Excelだけのものばかりでなかなか連携がのっている本がみつかりません。。。よろしくお願いいたします。

    • *you
      2013年6月5日 4:30 PM

      連携に関する書籍となるとちょっと難しいですね。そもそもPowerPointVBAの書籍自体も少ない印象なので…。私はPowerPointVBAは全然触ったことがありませんが、

      こちらのサイトや、PowerPointのマクロの記録機能を使ってコードを拾って、それを検証してみるしかないのかなぁと、個人的には思います。

  • kerotan
    2013年11月15日 10:32 PM

    ExcelVBAで作成した100個以上のシート埋め込みグラフをPowerPointへ貼り付ける手作業は苦痛の何物でもありませんでした。ご紹介頂いたコード本当にありがたいです。公開ありがとうございました。

    • *you
      2013年11月18日 8:53 AM

      kerotanさん、コメントありがとうございます!
      手作業のコピペ作業ほんとに辛いですよね(私も新人の頃やってました)…!お役に立てて光栄ですー(*´∀`*)

  • pepe
    2014年4月22日 3:17 PM

    このマクロのおかげでいろいろと捗りそうです。
    ありがとうございます。

    画像としてコピペするのでは無く、表としてそのままコピーさせるにはコードをどう変更すればよいか、ご存じでしたらご教授のほどお願いいたします。

    CopyやらSpecialPasteやら試してみたのですが、エラーを吐いてうまくいかず・・・orz

    • *you
      2014年4月23日 9:07 AM

      pepeさんコメントありがとうございます。お役に立てて光栄です!

      過去に書いた、こちらの記事が参考になるかもしれません。Office2013で検証しています。

      Officeのバージョンによって動作が違う可能性もあるのでご期待に添えられるかは分かりませんが、ご参考になれば。

      追記:すみません、面倒なことをせずとも.CopyPicture xlScreen, xlPicture.Copyにするだけで良かったです!

コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top