Solved

How do I copy a slide layout in PPT 2007 in VBA

Posted on 2009-07-16
4
1,499 Views
Last Modified: 2012-05-07
I am trying to copy over a slide from one presentation to another. Most of the code works but I the text boxes are skewing slightly off and the background is not formatting correctly either (picture is sliding off the right hand side of the page).

Please let me know how I can fix this.

Thanks,
Dekka...
Sub PullExcelData()

    

    mbErrorSwitch = False

    Set objWorksheet = objWorkbook.Worksheets("QueryMap")

    PresName = objWorksheet.Range("nrPresName").Value

    strPresPath = WKBKPATH & PresName

    oPPTObjName = objWorksheet.Range("nrObjName").Value

    

    Application.DisplayAlerts = False

    

    'Open the presentation

    Presentations.Open (strPresPath)

    'Set oPPTApp = CreateObject("Powerpoint.Application")

    Set objPresentation = ActivePresentation

    Set objSlide = objPresentation.Slides(1)

    

'    Set objexcel = CreateObject("Excel.Application")

'    objexcel.Visible = False

    

'    Set objWorkbook = objexcel.Workbooks.Open(ActivePresentation.Path & "\Connection Script1.2.xlsm")

    Set objWorksheet = objWorkbook.Worksheets("Main")

    Set objRange = objWorksheet.Range("nrMainCopyRange")

    

    'Instantiate the workbook object from the OLE object

    Set objExcelDestWb = objSlide.Shapes(oPPTObjName).OLEFormat.Object

    

    'Define what worksheet to paste into

    Set objExcelDestSheet = objExcelDestWb.Worksheets(1)

    

    'Optionally clear destination sheet, depends what you are updating..

    objExcelDestSheet.Cells.ClearContents

    objWorksheet.Activate

    objRange.Copy

    

    'PASTE INTO EXCEL TABLE at cell A1

    objExcelDestSheet.Paste objExcelDestSheet.Range("A1")

        

   ' AutoFitColumns

    Dim mvgRng As Range

    With objExcelDestSheet

        .Columns("C:Z").AutoFit

    End With

    

    objExcelDestSheet.Range("A1").EntireColumn.ColumnWidth = 50

    Set mvgRng = objExcelDestSheet.Range("B1:Z1")

    

    For Each c In mvgRng.Cells

        

        If c.EntireColumn.ColumnWidth > 30 Then

            c.EntireColumn.ColumnWidth = 30

        Else: End If

    Next c
 

    objExcel.CutCopyMode = False

    Application.DisplayAlerts = True

        

    On Error Resume Next

    Set oPPTShape = objPresentation.Slides(1).Shapes("txtAsOfDate")

        Set objWorksheet = objWorkbook.Worksheets("SysConfig")

        oPPTShape.TextFrame.TextRange.Text = "As of " & objWorksheet.Range("nrCharDateDisplay").Value

    

    Set oPPTShape = objPresentation.Slides(1).Shapes("txtFootnote")

        Set objWorksheet = objWorkbook.Worksheets("Other")

        oPPTShape.TextFrame.TextRange.Text = objWorksheet.Range("nrFootnote").Value

    

'    oPPTApp.Visible = True

'    SlideCopy2
 

            Dim s As Slide

            Dim vt As Long

            

            On Error GoTo slideError

            

            Presentations.Add

            Set objPresentation2 = ActivePresentation
 

            vt = objPresentation2.Windows(1).ViewType

           objPresentation2.Windows(1).ViewType = ppViewOutline

            For Each s In objPresentation.Slides

                s.Copy

                Set cl = s.CustomLayout

                objPresentation2.Slides.Paste

                objPresentation2.Slides(objPresentation2.Slides.Count).CustomLayout = cl

            Next s

            objPresentation2.Windows(1).ViewType = vt

        

    SlideShowWindows(Index:=1).View.Exit

    

        Exit Sub

        

slideError:

     

End Sub

Open in new window

0
Comment
Question by:DekkaG
  • 2
4 Comments
 
LVL 2

Expert Comment

by:SaWey
Comment Utility
What you can do is create a macro which does what you want and then look at it's source code to see how you can do it in VBA.
0
 
LVL 7

Accepted Solution

by:
hippohood earned 500 total points
Comment Utility
In line 83, if I understand properly, you are re-applying the slide layout AFTER the content is inserted.
Make sure that you apply same design template in new and original presentations. In case if your original slide layout has been slightly modified by user, which often happens when user is trying to fit text in, this MIGHT lead to recovering original template layout, not the current layout. Also, if textboxes were used instead of text frame, your layout would be screwed up either.
If nothing above is true or is too complicated to resolve you may just "manually" setup the shape factors and position for the objects in the new slide.
The code will look as below (I am adding extra lines only to 79-84 from your orignial sniplet)

            For Each s In objPresentation.Slides

                s.Copy

                Set cl = s.CustomLayout

                objPresentation2.Slides.Paste

                objPresentation2.Slides(objPresentation2.Slides.Count).CustomLayout = cl

' inserted here

    Set s2 = objPresentation2.Slides(objPresentation2.Slides.Count)

    For i = 1 To s.Shapes.Count

        s2.Shapes(i).Left = s.Shapes(i).Left

        s2.Shapes(i).Top = s.Shapes(i).Top

        s2.Shapes(i).Width = s.Shapes(i).Width

        s2.Shapes(i).Height = s.Shapes(i).Height

        '... other properties, like text frame margin...

    Next aShape
 
 

            Next s

            objPresentation2.Windows(1).ViewType = vt

Open in new window

0
 

Author Closing Comment

by:DekkaG
Comment Utility
Sorry it took me so long to get back to you. Personal issues came up that had me away from work.

Thanks for the help.
0
 
LVL 7

Expert Comment

by:hippohood
Comment Utility
Hope everything is well with you now.
Thanks, for the points.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Enums (shorthand for ‘enumerations’) are not often used by programmers but they can be quite valuable when they are.  What are they? An Enum is just a type of variable like a string or an Integer, but in this case one that you create that contains…
Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
The viewer will learn how to edit text. This includes Font, Spacing, Resizing, Color, and other special text options.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now