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

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.

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.Paste objExcelDestSheet.Range("A1")
   ' AutoFitColumns
    Dim mvgRng As Range
    With objExcelDestSheet
    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
            Set objPresentation2 = ActivePresentation
            vt = objPresentation2.Windows(1).ViewType
           objPresentation2.Windows(1).ViewType = ppViewOutline
            For Each s In objPresentation.Slides
                Set cl = s.CustomLayout
                objPresentation2.Slides(objPresentation2.Slides.Count).CustomLayout = cl
            Next s
            objPresentation2.Windows(1).ViewType = vt
        Exit Sub
End Sub

Open in new window

Who is Participating?
hippohoodConnect With a Mentor Commented:
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
                Set cl = s.CustomLayout
                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

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.
DekkaGAuthor Commented:
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.
Hope everything is well with you now.
Thanks, for the points.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.