【问题标题】:Unable to copy data from Excel to PPT using Macro无法使用宏将数据从 Excel 复制到 PPT
【发布时间】:2014-02-18 23:23:38
【问题描述】:

我有一个宏,它基本上应该从 excel 电子表格中复制范围,然后将它们粘贴到 powerpoint 文件中。所以每张幻灯片一张 Excel 表。

到目前为止,这是我的宏:

    Option Explicit

    Sub ExportToPPT()
     Dim PPAPP As PowerPoint.Application
    Dim PPRES As PowerPoint.Presentation
    Dim PPSlide As PowerPoint.Slide
    Dim ppSRng As PowerPoint.ShapeRange

    Dim XLAPP As Excel.Application
    Dim XLwbk As Excel.Workbook
    Dim xlWst As Excel.Worksheet
    Dim XLRng As Excel.Range

    Dim ppPathFile As String
    Dim ppNewPathFile

    Dim chartNum As Integer
    Dim maxCharts As Integer

    Debug.Print vbCrLf & "    ---- EXPORT EXCEL RANGES POWERPOINT ----"
    Debug.Print Now() & " - Exporting ranges to .ppt"

    'CHANGE WHEN ADDING CHARTS - MUST ALSO ADD SLIDE to .PPT and change loop
    Dim chartRng(1 To 9) As Excel.Range
    Dim SlideNum As Integer
    Dim SlideOffset As Integer

    Set XLwbk = Excel.ActiveWorkbook
    Set xlWst = XLwbk.Sheets("Test1")

        'This accounts for the title slide and any others before the automatedpaste
        SlideOffset = 1
        Set chartRng(1) = XLwbk.Sheets("Test1").Range("A1:B15")
        Set chartRng(2) = XLwbk.Sheets("Test2").Range("A1:E33")
        Set chartRng(3) = XLwbk.Sheets("Test3").Range("A1:E33")
        Set chartRng(4) = XLwbk.Sheets("Test4").Range("A1:E4")
        Set chartRng(5) = XLwbk.Sheets("Test5").Range("A1:J14")
        Set chartRng(6) = XLwbk.Sheets("Test6").Range("A1:I33")
        Set chartRng(7) = XLwbk.Sheets("Test7").Range("A1:I11")
        Set chartRng(8) = XLwbk.Sheets("Test8").Range("A1:I8")


    ' Create instance of PowerPoint
    Set PPAPP = CreateObject("Powerpoint.Application")
        PPAPP.Visible = True

        ' Open the presentation (Same folder as the Excel file)
        ppPathFile = ActiveWorkbook.Path + "TestPPT.pptx"
        Debug.Print ppPathFile
        Set PPRES = PPAPP.Presentations.Open(ppPathFile)

        PPAPP.ActiveWindow.ViewType = ppViewSlide


    chartNum = 1

    'Loop through all chart ranges
    'CHANGE WHEN ADDING CHARTS
    For chartNum = 1 To 9
        SlideNum = chartNum + SlideOffset
        Debug.Print "Chart number " & chartNum & " to slide number " & SlideNum

        ' Copy the range as a picture
         chartRng(chartNum).CopyPicture Appearance:=xlScreen, Format:=xlPicture


        'PowerPoint operations
           Set PPSlide = PPAPP.ActivePresentation.AddSlide(1, _ **//New code**
PPAPP.ActivePresentation.SlideMaster.CustomLayouts.Item(2))
            Debug.Print PPSlide.Name
            PPSlide.Select

            PPAPP.ActiveWindow.ViewType = ppViewSlide
            'ppapp.ActivePresentation.Slides.
            ' Paste the range
            'PPAPP.ActiveWindow.View.Slide (SlideNum)
            PPAPP.ActiveWindow.View.Paste

            'PPSlide.Shapes.Paste
            'PPSlide.Shapes(0).Select
            'PPSlide.Shapes.Paste.Select

                ' Align the pasted range
                Set ppSRng = PPAPP.ActiveWindow.Selection.ShapeRange
                With ppSRng
                    .LockAspectRatio = msoTrue
                If (.Width / .Height) > 1.65 Then
                        .Width = 650
                    Else
                        .Height = 400
                    End If
                End With


                With ppSRng
                    '.Width = 650
                    .Align msoAlignCenters, True
                    .Align msoAlignMiddles, True
                    .IncrementTop 1.5
                End With

    Next chartNum

    PPAPP.ActivePresentation.Slides(1).Select
    PPAPP.ActiveWindow.ViewType = ppViewNormal
    PPAPP.Activate

    ppNewPathFile = ActiveWorkbook.Path & "\Test\TestPPT.pptx" & Format(Now(), "yyyymmdd_hhmmss")
    PPAPP.ActivePresentation.SaveAs ppNewPathFile, ppSaveAsDefault

    Debug.Print Now() & " - Finished"

    End Sub

当我运行宏时,它会打开 PowerPoint,但会停止并出现以下错误:

当我调试时它停在这一行:

Set PPSlide = PPAPP.ActivePresentation.Slides(SlideNum)

任何关于如何解决这个问题的帮助都会很棒。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    错误指向您在代码中引入的计数问题。显然,在第一次迭代期间,它尝试选择单张幻灯片演示的第二张幻灯片(第二张幻灯片不存在)并引发错误。

    我认为这是因为您的 SlideOffset 变量而发生的。考虑在运行Set PPSlide = PPAPP.ActivePresentation.Slides(SlideNum) 之前先添加一张幻灯片。像这样的:

    Set pptLayout = PPAPP.ActivePresentation.Slides(1).CustomLayout 
    Set pptSlide = PPAPP.ActivePresentation.Slides.AddSlide(2, pptLayout)
    

    【讨论】:

    • 需要先声明CustomLayout变量吗?尝试为 PowerPoint 查找该属性,但它不可用。
    • 代码取自这里msdn.microsoft.com/en-us/library/office/ff746586.aspx。它确实首先声明了 CustomLayout 变量,但这通常只在声明 Option Explicit On 时才需要 - 你这样做了,所以你需要修改它以包含 Dim pptLayout as CustomLayout
    【解决方案2】:

    试试这个

    Set PPSlide = PPAPP.ActivePresentation.AddSlide(1,  _
    PPAPP.ActivePresentation.SlideMaster.CustomLayouts.Item(2))
    

    【讨论】:

    • 我在该行收到编译错误,说 Argument not optional。有什么想法吗?
    • 现在我得到了在“AddSlide”上找不到方法或数据成员的错误,我编辑了上面的代码以显示更改。
    • 打开一个空的power point文件,把这段代码复制进去:Call Presentations.Item(1).Slides.AddSlide(1, Presentations.Item(1).SlideMaster.CustomLayouts.Item(1) )
    • 好好,现在只需将其放入您的代码中即可。如果您仍然遇到问题,您可以通过电子邮件将文件发送给我,我会查看它们
    • 能够编写一些有效的新代码,但如果可以的话,我需要一些额外的格式化帮助,我给你发了一封电子邮件。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多