ExcelVBAからPowerPointへデータ貼付時のPasteSpecialデータタイプについて

ExcelVBAからPowerPointへデータ貼付時のPasteSpecialデータタイプについて

Excel上でコピーしたデータをPowerPointへ貼り付けるVBAというのを以前書いたのですが、その貼り付ける際の形式を選ぶ、データタイプについて調べてみました。


貼り付ける形式を選びたい

こちらの記事へ質問をいただきまして、

パワポの貼り付けオプションにある「元の書式を保持」した形でペーストしたい

とのことでした。前述した記事では、

エクセルのコピー対象.CopyPicture xlScreen, xlPicture '画像としてコピー
パワポの指定スライド.Shapes.Paste '貼付

のように、コピーの時点で形式を指定していたため、貼付けでは特に何もしていなかったのですが、

エクセルのコピー対象.Copy 'コピー
パワポの指定スライド.Shapes.PasteSpecial DataType:=0 'データタイプを指定して貼付

このように書けば、普通にコピーした後、DataTypeの数字を変えて貼付けることで形式を選べるようです。(ゼロはデフォルト)

DataTypeで選べる形式

参考URLによると、

  • 0 … ppPasteDefault – デフォルトの形式
  • 1 … ppPasteBitmap – BMP画像
  • 2 … ppPasteEnhancedMetafile – 拡張メタファイル
  • 3 … ppPasteMetafilePicture – メタファイル
  • 4 … ppPasteGIF – GIF画像
  • 5 … ppPasteJPG – JPG画像
  • 6 … ppPastePNG – PNG画像
  • 7 … ppPasteText – テキスト
  • 8 … ppPasteHTML – HTML
  • 9 … ppPasteRTF – RTF(リッチテキストファイル)
  • 10 … ppPasteOLEOb​​ject – OLEオブジェクト
  • 11 … ppPasteShape – 図形として

各番号を指定することでこのように使えるようですが、クリップボードにコピーされた内容によってデフォルトの型が異なり、サポート外の形式(元が画像なのにテキストでペーストしようとするなど)の場合、エラーになるらしいです。

私が試した感じでは、ExcelでグラフをコピーしてPowerPointへ上記のコードで貼付けを行ったら7,8,9がエラーに、セルのみだと4,5,6,11がエラーになりました。(Office2013にて)

コピー元の内容によってその結果が異なるようですので、どの形式が希望に合うかテストしてから使うのが良さそうですね。

で、どれが「元の書式を保持」なの?

140130-1

これが…結局わからなかったんです、ごめんなさい…。

どうも、PowerPoint上で手動で行う貼付けのオプションでは、上記のDataTypeよりも多くの機能がありそうな感じなのですが…、頑張って探してみたんですがVBAで指定出来る貼付けの形式が、わたしの力ではこれ以上見つかりませんでした…。どなたかご存知の方は是非教えてください…!

マクロの記録使えばいいじゃーんって思ってたんですが…なくなっちゃったんですね…_(:3 」∠)_

と、いうわけで、とりあえず上記の種類ならば形式を選ぶことが出来そうです。わたしも勉強になりました!

追記

コメント欄にて解決策を教えていただきました!ここよりもうちょっと下にありますので、情報お探しの方は是非どうぞー!

公開日:2014/01/30
更新日:2014/02/06

4件のコメント

  1. たかぴー より:

    私も”元の形式でコピー”する方法を探していて、外国でも話題になっていました。
    結果として、Excel側からのコマンドでは無理でPowerPoint側の貼り付けを使うことでうまくいきました。

    PPTApp.CommandBars.ExecuteMso "PasteExcelChartSourceFormatting"
    

    ※詳細はウェブサイト参照。
    ただし、PowerPoint側で実行され、直ちに貼り付けたシェイプを編集しようとするとうまくいきません。
    私は3秒間のタイマーを貼り付け後に入れることによってこの問題を回避しました。

      '指定範囲をクリップボードにコピー
      ActiveChart.ChartArea.Copy
      Set ppSld = ppPst.Slides.FindBySlideID(ppPst.Windows(1).Selection.SlideRange.SlideID)
      '貼り付け
      ppApp.CommandBars.ExecuteMso "PasteExcelChartSourceFormatting"
      'wait
      waitTime = Now + TimeValue("0:00:03")
      Application.Wait waitTime
      'PowerPointグラフ位置・サイズを最大になるように補正
      With ppSld.Shapes(ppSld.Shapes.Count)
        .LockAspectRatio = msoFalse
        .Top = 70
        .Left = 0
        .Width = .Width * 0.95
        .Height = .Height * 0.95
        .ZOrder msoSendToBack
      End With
    

    ※コピペの部分のみ抜粋

    • *you より:

      たかぴーさん、コメント&情報ありがとうございます!
      PowerPoint側のコマンドを使えばよかったのですね…!更に3秒待つなど回避策まで、とっても有り難いです!勉強になりました(*´∀`*)

  2. たかぴー より:

    こんにちは。
    タイマーだとEXCEL側データが大きいと間に合わない場合がありました。
    そこで、スライド数が増えるまで待つように変更したところうまくいきました。

    '貼り付け前のシート数取得
    shc = ppSld.Shapes.Count
    
    '貼り付け
    ppApp.CommandBars.ExecuteMso "PasteExcelChartSourceFormatting"
    
    '貼り付け前の枚数が変わるまでwait
    Do While shc = ppSld.Shapes.Count
      DoEvents
    Loop
    

    これで快適にスライドの量産処理が出来るようになりましたw

    • *you より:

      うおおおおおお(*゚Д゚*) たかぴーさん更なる情報ありがとうございます!!素晴らしいですー!((└(:3」┌)┘))


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

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

YouTubeでQ&Aコンテンツを企画しています

運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。