【问题标题】:Paste Excel Chart into Powerpoint using VBA使用 VBA 将 Excel 图表粘贴到 Powerpoint 中
【发布时间】:2011-11-21 11:50:55
【问题描述】:

我正在尝试创建一个 Excel 宏,用于复制 Excel 工作表上显示的图表,并将它们(特殊粘贴)粘贴到 PowerPoint 中。我遇到的问题是如何将每个图表粘贴到不同的幻灯片上?我根本不知道语法..

这是我目前所拥有的(它有效,但它只粘贴到第一张纸上):

Sub graphics3()

Sheets("Chart1").Select
ActiveSheet.ChartObjects("Chart1").Activate
ActiveChart.ChartArea.Copy
Sheets("Graphs").Select
range("A1").Select
ActiveSheet.Paste
     With ActiveChart.Parent
     .Height = 425 ' resize
     .Width = 645  ' resize
     .Top = 1    ' reposition
     .Left = 1   ' reposition
 End With

Dim PPT As Object
Set PPT = CreateObject("PowerPoint.Application")
PPT.Visible = True
PPT.Presentations.Open Filename:="locationwherepptxis"

Set PPApp = GetObject("Powerpoint.Application")
Set PPPres = PPApp.activepresentation
Set PPSlide = PPPres.slides _
    (PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)

' Copy chart as a picture
ActiveChart.CopyPicture Appearance:=xlScreen, Size:=xlScreen, _
    Format:=xlPicture

' Paste chart
PPSlide.Shapes.Paste.Select

' Align pasted chart
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True

【问题讨论】:

    标签: excel vba powerpoint paste


    【解决方案1】:

    具有从 Excel 到 PPT 绘制 6 个图表功能的代码

    Option Base 1
    Public ppApp As PowerPoint.Application
    
    Sub CopyChart()
    
    Dim wb As Workbook, ws As Worksheet
    Dim oPPTPres As PowerPoint.Presentation
    Dim myPPT As String
    myPPT = "C:\LearnPPT\MyPresentation2.pptx"
    
    Set ppApp = CreateObject("PowerPoint.Application")
    'Set oPPTPres = ppApp.Presentations("MyPresentation2.pptx")
    Set oPPTPres = ppApp.Presentations.Open(Filename:=myPPT)
    ppApp.Visible = True
    Set wb = ThisWorkbook
    Set ws = wb.Sheets(1)
    
    i = 1
    
    For Each shp In ws.Shapes
    
        strShapename = "C" & i
        ws.Shapes(shp.Name).Name = strShapename
        'shpArray.Add (shp)
        i = i + 1
    
    Next shp
    
    Call Plot6Chart(oPPTPres, 2, ws.Shapes(1), ws.Shapes(2), ws.Shapes(3), ws.Shapes(4), ws.Shapes(5), ws.Shapes(6))
    
    End Sub
    Function Plot6Chart(pPres As Presentation, SlideNo As Long, ParamArray cCharts())
    
    Dim oSh As Shape
    Dim pSlide As Slide
    Dim lLeft As Long, lTop As Long
    
    Application.CutCopyMode = False
    Set pSlide = pPres.Slides(SlideNo)
    
    For i = 0 To UBound(cCharts)
    
        cCharts(i).Copy
        ppApp.ActiveWindow.View.GotoSlide SlideNo
        pSlide.Shapes.Paste
        Application.CutCopyMode = False
    
    
        If i = 0 Then ' 1st Chart
            lTop = 0
            lLeft = 0
        ElseIf i = 1 Then ' 2ndChart
            lLeft = lLeft + 240
        ElseIf i = 2 Then ' 3rd Chart
            lLeft = lLeft + 240
        ElseIf i = 3 Then ' 4th Chart
            lTop = lTop + 270
            lLeft = 0
        ElseIf i = 4 Then ' 5th Chart
            lLeft = lLeft + 240
        ElseIf i = 5 Then ' 6th Chart
            lLeft = lLeft + 240
        End If
    
        pSlide.Shapes(cCharts(i).Name).Left = lLeft
        pSlide.Shapes(cCharts(i).Name).Top = lTop
    
    Next i
    
    Set oSh = Nothing
    Set pSlide = Nothing
    Set oPPTPres = Nothing
    Set ppApp = Nothing
    Set pPres = Nothing
    
    End Function
    

    【讨论】:

      【解决方案2】:

      鉴于我没有可使用的文件位置,因此我在其下方附加了一个例程

      1. 创建了一个新的 PowerPoint 实例(后期绑定,因此需要为 ppViewSlide 等定义常量)
      2. 循环遍历名为 Chart1 的工作表中的每个图表(根据您的示例)
      3. 添加新幻灯片
      4. 粘贴每个图表,然后重复

      您是否需要在导出大小之前对每张图表图片进行格式化,或者您可以更改您的默认图表大小?

      Const ppLayoutBlank = 2
      Const ppViewSlide = 1
      
      Sub ExportChartstoPowerPoint()
          Dim PPApp As Object
          Dim chr
          Set PPApp = CreateObject("PowerPoint.Application")
          PPApp.Presentations.Add
          PPApp.ActiveWindow.ViewType = ppViewSlide
          For Each chr In Sheets("Chart1").ChartObjects
              PPApp.ActivePresentation.Slides.Add PPApp.ActivePresentation.Slides.Count + 1, ppLayoutBlank
              PPApp.ActiveWindow.View.GotoSlide PPApp.ActivePresentation.Slides.Count
              chr.Select
              ActiveChart.CopyPicture Appearance:=xlScreen, Size:=xlScreen, Format:=xlPicture
              PPApp.ActiveWindow.View.Paste
              PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
              PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True
          Next chr
          PPApp.Visible = True
      End Sub
      

      【讨论】:

      • 谢谢让-弗朗索瓦。这是一个公平的问题——简短的回答是个人喜好。通常,如果自动化对象的多个版本是可能的,我会延迟绑定,并且我发现问答论坛中的用户可能会在参考设置方面遇到困难。虽然我在我的 Duplicate Master 插件中使用了 early binging,因为它只绑定到文件脚本库,它减少了 20-30% 的运行时间,并且作为插件的一部分,它会自动为用户安装。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2019-09-05
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多