Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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_Paste - Fatal编程技术网

使用VBA将Excel图表粘贴到Powerpoint中

使用VBA将Excel图表粘贴到Powerpoint中,excel,vba,powerpoint,paste,Excel,Vba,Powerpoint,Paste,我正在尝试创建一个excel宏,用于复制excel工作表上显示的图表,并将它们粘贴到PowerPoint中(特殊粘贴)。我遇到的问题是如何将每张图表粘贴到不同的幻灯片上?我根本不懂语法 这是我到目前为止所做的(它可以工作,但只粘贴到第一张纸上): 鉴于我没有你的文件位置工作,我附上了下面的例行程序 创建了PowerPoint的新实例(后期绑定,因此需要为ppViewSlide等定义常量) 在名为Chart1的工作表中循环浏览每个图表(如您的示例所示) 添加新幻灯片 粘贴每个图表,然后重复 在导出

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

这是我到目前为止所做的(它可以工作,但只粘贴到第一张纸上):


鉴于我没有你的文件位置工作,我附上了下面的例行程序

  • 创建了PowerPoint的新实例(后期绑定,因此需要为ppViewSlide等定义常量)
  • 在名为Chart1的工作表中循环浏览每个图表(如您的示例所示)
  • 添加新幻灯片
  • 粘贴每个图表,然后重复
  • 在导出图表大小之前是否需要格式化每个图表图片,或者是否可以更改默认的图表大小

    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
    

    用于将6个图表从Excel打印到PPT的代码

    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
    

    Thx让·弗朗索瓦。这是一个公平的问题——简短的回答是个人偏好。通常,如果自动对象的多个版本是可能的,我会延迟绑定,正如我在Q&A论坛中发现的,用户可能会在引用设置方面遇到困难。虽然我在我的复制主加载项中使用了早期Bing,因为它只绑定到文件脚本库,但它节省了20-30%的运行时间,并且作为加载项的一部分,它会自动为用户安装。
    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