Office関連

[Excel VBA]PowerPointに表を貼り付けようとするとオートメーションエラーが発生

Excel Q&Aサロン(VBA)にExcelの表をPowerPointのスライドに貼り付けようとするとエラーが発生する、との質問がありました。

下記コードをPowerPoint 2010環境で実行して動作を確認してみると、たしかに一部の形式でオートメーション エラー(-2147188160 (80048240))が発生しました。

Public Sub Sample1()
  Dim prs As Object
  Dim lay As Object
  
  Const ppPasteDefault = 0
  Const ppPasteBitmap = 1
  Const ppPasteEnhancedMetafile = 2
  Const ppPasteMetafilePicture = 3
  Const ppPasteGIF = 4
  Const ppPasteJPG = 5
  Const ppPastePNG = 6
  Const ppPasteText = 7
  Const ppPasteHTML = 8
  Const ppPasteRTF = 9
  Const ppPasteOLEObject = 10
  Const ppPasteShape = 11
  
  ActiveSheet.Range("B2:D7").Copy
  With CreateObject("PowerPoint.Application")
    .Visible = True
    Set prs = .Presentations.Add
    Set lay = GetCustomLayout(prs, "白紙")
    If Not lay Is Nothing Then
      With prs.Slides.AddSlide(1, lay).Shapes
        .PasteSpecial ppPasteDefault 'オートメーション エラー(-2147188160 (80048240))
        '.PasteSpecial ppPasteBitmap 'OK
        '.PasteSpecial ppPasteEnhancedMetafile 'OK
        '.PasteSpecial ppPasteMetafilePicture 'OK
        '.PasteSpecial ppPasteGIF 'オートメーション エラー(-2147188160 (80048240))
        '.PasteSpecial ppPasteJPG 'オートメーション エラー(-2147188160 (80048240))
        '.PasteSpecial ppPastePNG 'オートメーション エラー(-2147188160 (80048240))
        '.PasteSpecial ppPasteText 'OK
        '.PasteSpecial ppPasteHTML 'オートメーション エラー(-2147188160 (80048240))
        '.PasteSpecial ppPasteRTF 'OK
        '.PasteSpecial ppPasteOLEObject 'OK
        '.PasteSpecial ppPasteShape 'オートメーション エラー(-2147188160 (80048240))
      End With
    End If
  End With
End Sub

Private Function GetCustomLayout(ByVal TargetPresentation As Object, _
                                 ByVal LayoutName As String) As Object
  Dim ret As Object
  Dim c As Object
  
  For Each c In TargetPresentation.SlideMaster.CustomLayouts
    If c.Name = LayoutName Then
      Set ret = c
      Exit For
    End If
  Next
  Set GetCustomLayout = ret
End Function

PowerPoint_PasteSpecial_Error_01

引っ掛かるのは一部のDataTypeで、さらに手作業で貼り付け作業を行うとエラーが発生しないので、不可解な動作に思えます。

ただ、手作業で問題が無いのであれば、下記コードのように直接コマンドを実行(ExecuteMso)することで、エラーを回避することができます。

Public Sub Sample2()
  Dim prs As Object
  Dim sld As Object
  Dim lay As Object
  Dim r As Object, c As Object
  
  ActiveSheet.Range("B2:D7").Copy
  With CreateObject("PowerPoint.Application")
    .Visible = True
    Set prs = .Presentations.Add
    Set lay = GetCustomLayout(prs, "白紙")
    If Not lay Is Nothing Then
      Set sld = prs.Slides.AddSlide(1, lay)
      .CommandBars.ExecuteMso "PasteSourceFormatting"
      
      With sld
        '貼り付け待ち
        While .Shapes.Count < 1
          DoEvents
        Wend
        '----- 以下装飾 -----
        With .Shapes.Range(.Shapes.Count)
          .Width = 640
          .Height = 480
          .Align msoAlignCenters, True '左右中央揃え
          .Align msoAlignMiddles, True '上下中央揃え
          If .HasTable = True Then
            '各セルのフォントサイズ変更
            For Each r In .Table.Rows
              For Each c In r.Cells
                c.Shape.TextFrame2.TextRange.Font.Size = 24
              Next
            Next
          End If
        End With
        '--------------------
      End With
    End If
  End With
End Sub

Private Function GetCustomLayout(ByVal TargetPresentation As Object, _
                                 ByVal LayoutName As String) As Object
  Dim ret As Object
  Dim c As Object
  
  For Each c In TargetPresentation.SlideMaster.CustomLayouts
    If c.Name = LayoutName Then
      Set ret = c
      Exit For
    End If
  Next
  Set GetCustomLayout = ret
End Function

上記ExecuteMsoメソッドの引数であるコントロールID(PasteSourceFormatting(元の書式を保持)、PasteAsEmbedded(埋め込み)、PasteExcelTableDestinationTableStyle(貼り付け先のスタイルを使用)等)は下記リンク先からダウンロードできる、コントロールIDリストに記載されているので、必要に応じて参照してください。

関連記事

  1. Office関連

    VBAの力量をはかる3つの質問

    先日、Twitterではけた氏の面白いツイートがありました。3…

  2. Office関連

    [Office 2013]オンライン テンプレートを無効にする。

    前回の記事ではOffice 2013でSkyDriveを無効にする方法…

  3. Office関連

    Excel Services JavaScript APIを試してみました(2)

    前回の記事で、JavaScriptコードを貼り付けてExcelワークブ…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP