VBA:使用“从Excel粘贴到PowerPoint”;形状(未知成员):请求无效;错误
这是我的代码的一部分,它将数据从Excel粘贴到PowerPoint。通常它可以工作,但每隔一段时间(可能在10或20次运行之后,每次运行大约15个相同类型的VBA:使用“从Excel粘贴到PowerPoint”;形状(未知成员):请求无效;错误,excel,vba,powerpoint,Excel,Vba,Powerpoint,这是我的代码的一部分,它将数据从Excel粘贴到PowerPoint。通常它可以工作,但每隔一段时间(可能在10或20次运行之后,每次运行大约15个相同类型的PasteSpecials),我会收到一个错误:“Shapes(未知成员):无效请求。指定的数据类型不可用。”调试器指向行mySlide.Shapes.PasteSpecial数据类型:=2。有人能找出原因吗 如果你问我为什么使用这种数据类型,我只能说因为它有效。我尝试了一下,这一个似乎准确地将我在Excel中看到的内容复制到了PowerP
PasteSpecials
),我会收到一个错误:“Shapes(未知成员):无效请求。指定的数据类型不可用。”调试器指向行mySlide.Shapes.PasteSpecial数据类型:=2
。有人能找出原因吗
如果你问我为什么使用这种数据类型,我只能说因为它有效。我尝试了一下,这一个似乎准确地将我在Excel中看到的内容复制到了PowerPoint(其他人“忘记”了边框等等)
发生错误时,能否检查剪贴板是否为空?当调用PasteSpecial方法时,如果剪贴板上没有数据,则会出现错误。另请参阅和@reportgunner我复制了一些代码以确定剪贴板是否为空,我们将查看这是否是问题所在。第二条评论中的链接应该非常有用;我要么简单地添加一个wait命令,要么尝试
Select
和Selection.Copy
方法(尽管我不明白为什么后者会有帮助)。无论如何,谢谢你<代码>DoEvents将控制权传递给操作系统。控件在操作系统处理完其队列中的事件并发送了SendKeys队列中的所有密钥后返回。几乎在等待副本完成。@reportgunner就在我写这篇文章的时候,错误终于再次发生了。在我的整个sub中进行了大约50次循环(我猜粘贴前只是检查一下,这给了Office更多的时间,并减少了错误发生的次数),但似乎剪贴板是空的确实是问题所在。当错误发生时,你能检查剪贴板是否为空吗?当调用PasteSpecial方法时,如果剪贴板上没有数据,则会出现错误。另请参阅和@reportgunner我复制了一些代码以确定剪贴板是否为空,我们将查看这是否是问题所在。第二条评论中的链接应该非常有用;我要么简单地添加一个wait命令,要么尝试Select
和Selection.Copy
方法(尽管我不明白为什么后者会有帮助)。无论如何,谢谢你<代码>DoEvents将控制权传递给操作系统。控件在操作系统处理完其队列中的事件并发送了SendKeys队列中的所有密钥后返回。几乎在等待副本完成。@reportgunner就在我写这篇文章的时候,错误终于再次发生了。在我的整个sub中进行了大约50次循环(我猜粘贴之前只是检查一下,这给了Office更多的时间,也减少了错误的发生),但剪贴板是空的似乎确实是问题所在。
Sub MReport()
Dim rng As Range, rngAn As Range
Dim myShape As PowerPoint.Shape
Dim DestinationPPT As String
Dim lRow As Long, lCol As Long
Dim wbM As Workbook
Dim wsEm As Worksheet
Dim CSGSheet As Variant, CSGSheets As Variant
Dim MonthNum As String, YearNum As String
Set PowerPointApp = New PowerPoint.Application
DestinationPPT = "C:\VBA\ReportTemplate.pptm"
Set myPresentation = PowerPointApp.Presentations.Open(DestinationPPT)
YearNum = "2019"
MonthNum = "02"
Set wbM = Workbooks.Open("C:\VBA\" & YearNum & "\" & Right(YearNum, 2) & "_" & MonthNum & "\NumbersM_" & YearNum & "_" & MonthNum & ".xlsm", UpdateLinks:=False)
CSGSheets = Array("CSG_BM", "CSG_AR", "CSG_ISF")
For Each CSGSheet In CSGSheets
lRow = wbM.Sheets(CSGSheet).Cells(Rows.Count, "B").End(xlUp).End(xlUp).End(xlUp).Row + 1
lCol = wbM.Sheets(CSGSheet).Cells(lRow - 1, "B").End(xlToRight).Column + 1
Set rng = wbM.Sheets(CSGSheet).Range(wbM.Sheets(CSGSheet).Cells(2, 2), wbM.Sheets(CSGSheet).Cells(lRow, lCol))
rng.Copy
Set mySlide = myPresentation.Slides.Add(myPresentation.Slides.Count + 1, 12)
PowerPointApp.ActiveWindow.ViewType = ppViewNormal
mySlide.Shapes.PasteSpecial DataType:=2 '2 = ppPasteEnhancedMetafile
Set myShape = mySlide.Shapes(mySlide.Shapes.Count)
With myShape
.Height = 410
.Top = 70
.Left = 5
End With
Next
wbM.Close SaveChanges:=False
End Sub