简体   繁体   English

通过VBA从Excel数据,图表,注释生成PowerPoint自动

[英]Generate a PowerPoint Automated via VBA from Excel Data, Charts, Comments

What I am trying to achieve is to make an auto PowerPointPres using data, charts, comments in Excel via VBA. 我想要实现的是通过VBA在Excel中使用数据,图表,注释创建自动PowerPointPres。

There are 2 things I fail to do: 我有两件事不能做:

  1. I need to put 4 Charts on one page in PPP instead 1 chart per page 我需要在PPP的一页上放置4个图表,而不是每页1个图表
  2. I need to keep the source formating and not paste the charts as pictures. 我需要保持源格式,而不要将图表粘贴为图片。

Could anybody help with some corrections please? 有人可以帮忙一些更正吗?

Really appreciate it! 真的很感激!

    Sub CreatePowerPoint()

 'Add a reference to the Microsoft PowerPoint Library by:

    '1. Go to Tools in the VBA menu    
    '2. Click on Reference    
    '3. Scroll down to Microsoft PowerPoint X.0 Object Library, check the box, and press Okay

    'First we declare the variables we will be using

        Dim newPowerPoint As PowerPoint.Application
        Dim activeSlide As PowerPoint.Slide
        Dim cht As Excel.ChartObject

     'Look for existing instance
        On Error Resume Next
        Set newPowerPoint = GetObject(, "PowerPoint.Application")
        On Error GoTo 0

    'Let's create a new PowerPoint
        If newPowerPoint Is Nothing Then
            Set newPowerPoint = New PowerPoint.Application
        End If
    'Make a presentation in PowerPoint
        If newPowerPoint.Presentations.Count = 0 Then
            newPowerPoint.Presentations.Add
        End If

    'Show the PowerPoint
        newPowerPoint.Visible = True

    'Loop through each chart in the Excel worksheet and paste them into the PowerPoint
        For Each cht In ActiveSheet.ChartObjects

        'Add a new slide where we will paste the chart
            newPowerPoint.ActivePresentation.Slides.Add newPowerPoint.ActivePresentation.Slides.Count + 1, ppLayoutText
            newPowerPoint.ActiveWindow.View.GotoSlide newPowerPoint.ActivePresentation.Slides.Count
            Set activeSlide = newPowerPoint.ActivePresentation.Slides(newPowerPoint.ActivePresentation.Slides.Count)

        'Copy the chart and paste it into the PowerPoint as a Metafile Picture
            cht.Select
            ActiveChart.ChartArea.Copy
            activeSlide.Shapes.PasteSpecial(DataType:=ppPasteMetafilePicture).Select

        'Set the title of the slide the same as the title of the chart
            activeSlide.Shapes(1).TextFrame.TextRange.Text = cht.Chart.ChartTitle.Text

        'Adjust the positioning of the Chart on Powerpoint Slide
            newPowerPoint.ActiveWindow.Selection.ShapeRange.Left = 15
            newPowerPoint.ActiveWindow.Selection.ShapeRange.Top = 125

            activeSlide.Shapes(2).Width = 200
            activeSlide.Shapes(2).Left = 505

        'If the chart is the "US" consumption chart, then enter the appropriate comments
            If InStr(activeSlide.Shapes(1).TextFrame.TextRange.Text, "US") Then
                activeSlide.Shapes(2).TextFrame.TextRange.Text = Range("J7").Value & vbNewLine
                activeSlide.Shapes(2).TextFrame.TextRange.InsertAfter (Range("J8").Value & vbNewLine)
        'Else if the chart is the "Renewable" consumption chart, then enter the appropriate comments
            ElseIf InStr(activeSlide.Shapes(1).TextFrame.TextRange.Text, "Renewable") Then
                activeSlide.Shapes(2).TextFrame.TextRange.Text = Range("J27").Value & vbNewLine
                activeSlide.Shapes(2).TextFrame.TextRange.InsertAfter (Range("J28").Value & vbNewLine)
                activeSlide.Shapes(2).TextFrame.TextRange.InsertAfter (Range("J29").Value & vbNewLine)
            End If

        'Now let's change the font size of the callouts box
            activeSlide.Shapes(2).TextFrame.TextRange.Font.Size = 16

        Next

    AppActivate ("Microsoft PowerPoint")
    Set activeSlide = Nothing
    Set newPowerPoint = Nothing

End Sub

I guess you can achieve that by moving the slide creation part out of the loop and changing the first part of it to look smth like this: 我想您可以通过将幻灯片创建部分移出循环并将其第一部分更改为如下形式来实现:

    'Add a new slide where we will paste the chart
    newPowerPoint.ActivePresentation.Slides.Add newPowerPoint.ActivePresentation.Slides.Count + 1, ppLayoutText
    newPowerPoint.ActiveWindow.View.GotoSlide newPowerPoint.ActivePresentation.Slides.Count
    Set activeSlide = newPowerPoint.ActivePresentation.Slides(newPowerPoint.ActivePresentation.Slides.Count)

'Loop through each chart in the Excel worksheet and paste them into the PowerPoint
    For Each cht In ActiveSheet.ChartObjects

        Dim i As Integer
        i = i + 1

    'Copy the chart and paste it
        cht.Select
        ActiveChart.ChartArea.Copy
        activeSlide.Shapes.PasteSpecial(DataType:=ppPasteDefault).Select

    'Set the title of the slide the same as the title of the chart
    If cht.Chart.HasTitle = True Then
        activeSlide.Shapes(1).TextFrame.TextRange.Text = cht.Chart.ChartTitle.Text
    End If

    'Adjust the positioning of the Chart on Powerpoint Slide
    If i = 1 Then
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Left = 5
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Top = 100

        ElseIf i = 2 Then
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Left = 350
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Top = 100

        ElseIf i = 3 Then
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Left = 5
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Top = 325

        Else
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Left = 350
        newPowerPoint.ActiveWindow.Selection.ShapeRange.Top = 325
    End If

Then, you'll probably have to do some adjustments. 然后,您可能必须进行一些调整。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM