Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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
Excel 偶尔会遇到运行时错误1004_Excel_Vba_Powerpoint - Fatal编程技术网

Excel 偶尔会遇到运行时错误1004

Excel 偶尔会遇到运行时错误1004,excel,vba,powerpoint,Excel,Vba,Powerpoint,我创建了一个宏,将当前excel工作簿中的单元格复制到powerpoint演示文稿中。宏可以工作,但偶尔我会得到一个 运行时错误1004:Range类的CopyPicture方法失败 在线: ActiveWorkbook.Sheetsi.RangeA1:O&lastRow.CopyPicture格式:=xlPicture 我也会偶尔得到一些帮助 运行时错误-2147188160 80048240:形状未知成员:请求无效。剪贴板为空或包含无法粘贴到此处的数据 在线: aSlide.Shapes.P

我创建了一个宏,将当前excel工作簿中的单元格复制到powerpoint演示文稿中。宏可以工作,但偶尔我会得到一个

运行时错误1004:Range类的CopyPicture方法失败

在线:

ActiveWorkbook.Sheetsi.RangeA1:O&lastRow.CopyPicture格式:=xlPicture

我也会偶尔得到一些帮助

运行时错误-2147188160 80048240:形状未知成员:请求无效。剪贴板为空或包含无法粘贴到此处的数据

在线:

aSlide.Shapes.Paste.Select

奇怪的是错误发生在不同的地方。例如,有时第5张幻灯片上会出现错误,如果我再次运行它,它会很好地处理第5张幻灯片,但在第10张幻灯片上再次遇到错误

我尝试使用错误处理,但我尝试的一切最终都冻结了程序

Sub CreateSlides()

    Dim PPApp As PowerPoint.Application
    Dim PPFile As PowerPoint.Presentation
    Dim lastRow As Integer
    Dim aSlide As Slide
    Dim path As String

    path = "C:Users\Me\Documents\WorksheetSlides.pptx"

    Set PPApp = CreateObject("PowerPoint.Application")
    Set PPFile = PPApp.Presentations.Open(path)

    For Each aSlide In PPFile.Slides
        i = aSlide.SlideNumber + 1

        aSlide.Select

        If i > ActiveWorkbook.Sheets.Count Then Exit For

        lastRow = ActiveWorkbook.Sheets(i).Cells(Rows.Count, 1).End(xlUp).Row

        ActiveWorkbook.Sheets(i).Range("A1:O" & lastRow).CopyPicture Format:=xlPicture
        aSlide.Shapes.Paste.Select
    Next

End Sub

从Excel粘贴到PowerPoint时,这是一个臭名昭著的问题-解决方案是在复制/粘贴之间添加一个短暂的间隔,让剪贴板有喘息的时间。下面是一个示例,我们等待2秒,这应该足够长:

Sub CreateSlides()

    Dim PPApp As PowerPoint.Application
    Dim PPFile As PowerPoint.Presentation
    Dim lastRow As Integer
    Dim aSlide As Slide
    Dim path As String

    path = "C:Users\Me\Documents\WorksheetSlides.pptx"

    Set PPApp = CreateObject("PowerPoint.Application")
    Set PPFile = PPApp.Presentations.Open(path)

    For Each aSlide In PPFile.Slides
        i = aSlide.SlideNumber + 1

        aSlide.Select

        If i > ActiveWorkbook.Sheets.Count Then Exit For

        lastRow = ActiveWorkbook.Sheets(i).Cells(Rows.Count, 1).End(xlUp).Row

        ActiveWorkbook.Sheets(i).Range("A1:O" & lastRow).CopyPicture Format:=xlPicture

        Wait

        aSlide.Shapes.Paste.Select
    Next

End Sub
Sub Wait()

    Application.Wait Now + TimeValue("0:00:02")

End Sub

首先,aSlide.Shapes.Paste和.Select不应该像这样链接。若您在Office剪贴板上遇到计时问题,则需要在这两次调用之间进行处理。也就是说,在复制之后和粘贴之前,您可能需要几毫秒的延迟。在ActiveWorkbook.Sheetsi.RangeA1:O&lastRow.CopyPicture Format:=XLPictureHardCodeing 2秒是个坏主意。无法保证内容会在2秒钟内放入剪贴板:如果应用程序正忙于做其他事情,该怎么办?最好添加DoEvents并让应用程序决定它需要的时间:@SiddharthRout这是真的-我的答案在这里完全是主观的。我只回答了对我来说最有效的问题,也尝试过使用DoEvents,而且我已经从Excel生成了一段时间了。@SiddharthRout第二个例子中的计时器是什么?