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

引っ掛かるのは一部の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リストに記載されているので、必要に応じて参照してください。



















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