Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA:使用“从Excel粘贴到PowerPoint”;形状(未知成员):请求无效;错误_Excel_Vba_Powerpoint - Fatal编程技术网

VBA:使用“从Excel粘贴到PowerPoint”;形状(未知成员):请求无效;错误

VBA:使用“从Excel粘贴到PowerPoint”;形状(未知成员):请求无效;错误,excel,vba,powerpoint,Excel,Vba,Powerpoint,这是我的代码的一部分,它将数据从Excel粘贴到PowerPoint。通常它可以工作,但每隔一段时间(可能在10或20次运行之后,每次运行大约15个相同类型的PasteSpecials),我会收到一个错误:“Shapes(未知成员):无效请求。指定的数据类型不可用。”调试器指向行mySlide.Shapes.PasteSpecial数据类型:=2。有人能找出原因吗 如果你问我为什么使用这种数据类型,我只能说因为它有效。我尝试了一下,这一个似乎准确地将我在Excel中看到的内容复制到了PowerP

这是我的代码的一部分,它将数据从Excel粘贴到PowerPoint。通常它可以工作,但每隔一段时间(可能在10或20次运行之后,每次运行大约15个相同类型的
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