Search code examples
excelvbaruntime-errorpowerpointpowerpoint-2007

Excel VBA Run-time error 2147188160 (80048240) Automation Error


I am trying to create a ppt with text entries from excel placed in couple of columns.

Have googled a lot but not able to make any headway on Run-time error 2147188160 (80048240) Automation Error.

Found this link on micrsoft site http://support.microsoft.com/kb/155073 which says this is a bug in Office 2007. Any one can suggest any workarounds.

My code is as follows:

    Sub CreateSlides()
    Dim aData As String
    Dim newPPT As PowerPoint.Application
    Dim Actslide As PowerPoint.Slide
    Dim Actshape As PowerPoint.Shape

    Dim lngSlideHeight      As Long
    Dim lngSlideWidth       As Long

    Dim i, x, rowcount, slinum, slicount As Integer

    Dim Size As Integer

Set newPPT = New PowerPoint.Application
newPPT.Presentations.Add
newPPT.ActivePresentation.Slides.Add newPPT.ActivePresentation.Slides.Count + 1, ppLayoutBlank
newPPT.Visible = msoTrue

lngSlideHeight = newPPT.ActivePresentation.PageSetup.SlideHeight
lngSlideWidth = newPPT.ActivePresentation.PageSetup.SlideWidth

ActiveSheet.Cells(1, 1).Select
rowcount = ActiveSheet.UsedRange.Rows.Count

slinum = 1
x = 1

'create slides
For slinum = 1 To 2 * rowcount + 10
    Set Actslide = newPPT.ActivePresentation.Slides(slinum)
    newPPT.ActivePresentation.Slides.Add newPPT.ActivePresentation.Slides.Count + 1, ppLayoutBlank
Next slinum

'copy words
slinum = 1
x = 1
For x = 1 To rowcount

    ActiveSheet.Cells(x, 1).Select
    Selection.Copy
    newPPT.Visible = True

    newPPT.ActiveWindow.View.GotoSlide (slinum)
    newPPT.ActiveWindow.Panes(2).Activate
    Set Actslide = newPPT.ActivePresentation.Slides(slinum)
     newPPT.ActiveWindow.View.PasteSpecial DataType:=ppPasteDefault

    newPPT.ActiveWindow.Selection.ShapeRange.Top = (lngSlideHeight - newPPT.ActiveWindow.Selection.ShapeRange.Height) / 2
    newPPT.ActiveWindow.Selection.ShapeRange.Height = 400
    newPPT.ActiveWindow.Selection.ShapeRange.Left = 1
    newPPT.ActiveWindow.Selection.ShapeRange.Width = lngSlideWidth - 1
    newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
    newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Font.Size = 48

        If slinum Mod 9 = 0 Then
            slinum = slinum + 9
        End If

    slinum = slinum + 1
Next x

slicount = 2 * rowcount + 10
slinum = 10
x = 1
i = 1
For x = 1 To rowcount

    ActiveSheet.Cells(x, 2).Select
    Selection.Copy
    If i = 1 Then
        newPPT.Visible = True
        newPPT.ActiveWindow.Panes(2).Activate
        newPPT.ActiveWindow.View.GotoSlide (slinum + 2)
        Else
            If i = 2 Then
            newPPT.Visible = True
            newPPT.ActiveWindow.Panes(2).Activate
            newPPT.ActiveWindow.View.GotoSlide (slinum)
            Else
                If i = 3 Then
                newPPT.Visible = True
                newPPT.ActiveWindow.Panes(2).Activate
                newPPT.ActiveWindow.View.GotoSlide (slinum - 2)
                End If
            End If
    End If
    i = i + 1

    If i = 4 Then
        i = 1
    End If

    newPPT.ActiveWindow.View.PasteSpecial DataType:=ppPasteDefault
    newPPT.ActiveWindow.Selection.ShapeRange.Top = (lngSlideHeight - newPPT.ActiveWindow.Selection.ShapeRange.Height) / 2
    newPPT.ActiveWindow.Selection.ShapeRange.Height = 400
    newPPT.ActiveWindow.Selection.ShapeRange.Left = 1
    newPPT.ActiveWindow.Selection.ShapeRange.Width = lngSlideWidth - 1
    newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
    newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Font.Size = 28

        If slinum Mod 9 = 0 Then
            slinum = slinum + 9
        End If

        If slinum > slicount Then
            Exit For
        End If

    slinum = slinum + 1
Next x


End Sub

Solution

  • This is more a set of comments than an answer, but the comment fields don't allow for any reasonable formatting. See comments in-line:

       Sub CreateSlides()
        Dim aData As String
        Dim newPPT As PowerPoint.Application
        Dim Actslide As PowerPoint.Slide
        Dim Actshape As PowerPoint.Shape
    
    ' SlideHeight and Width are Singles, not Longs
        Dim lngSlideHeight      As Long
        Dim lngSlideWidth       As Long
    
    ' Here, you've DIMmed all of the variables as variants, not integers:
        Dim i, x, rowcount, slinum, slicount As Integer
    ' You really want:
    '   Dim i as Long, x as Long ....etc.
    '   Note that most if not all of these should be longs, not integers
    '   Generally, VBA will convert for you as needed, but once in a while it'll
    '   turn round and bite you.  Better to use the correct data types in the first place.
    
        Dim Size As Integer
    
    Set newPPT = New PowerPoint.Application
    ' I'd move this here rather than below:
    newPPT.Visible = msoTrue
    
    newPPT.Presentations.Add
    newPPT.ActivePresentation.Slides.Add newPPT.ActivePresentation.Slides.Count + 1, ppLayoutBlank
    ' newPPT.Visible = msoTrue
    
    lngSlideHeight = newPPT.ActivePresentation.PageSetup.SlideHeight
    lngSlideWidth = newPPT.ActivePresentation.PageSetup.SlideWidth
    
    ActiveSheet.Cells(1, 1).Select
    
    ' Check what UsedRange returns against what you THINK it's supposed to return.
    ' Sometimes it's not quite what you expect:
    rowcount = ActiveSheet.UsedRange.Rows.Count
    
    ' No need for either of these; the For/Next syntax takes care of that
    'slinum = 1
    'x = 1
    
    'create slides
    For slinum = 1 To 2 * rowcount + 10
        Set Actslide = newPPT.ActivePresentation.Slides(slinum)
        newPPT.ActivePresentation.Slides.Add newPPT.ActivePresentation.Slides.Count + 1, ppLayoutBlank
    Next slinum
    
    'copy words
    slinum = 1
    x = 1
    For x = 1 To rowcount
    
        ActiveSheet.Cells(x, 1).Select
        Selection.Copy
        newPPT.Visible = True
    
        newPPT.ActiveWindow.View.GotoSlide (slinum)
        newPPT.ActiveWindow.Panes(2).Activate
        Set Actslide = newPPT.ActivePresentation.Slides(slinum)
         newPPT.ActiveWindow.View.PasteSpecial DataType:=ppPasteDefault
    
        newPPT.ActiveWindow.Selection.ShapeRange.Top = (lngSlideHeight - newPPT.ActiveWindow.Selection.ShapeRange.Height) / 2
        newPPT.ActiveWindow.Selection.ShapeRange.Height = 400
        newPPT.ActiveWindow.Selection.ShapeRange.Left = 1
        newPPT.ActiveWindow.Selection.ShapeRange.Width = lngSlideWidth - 1
        newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
        newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Font.Size = 48
    
            If slinum Mod 9 = 0 Then
                slinum = slinum + 9
            End If
    
        slinum = slinum + 1
    Next x
    
    slicount = 2 * rowcount + 10
    slinum = 10
    x = 1
    i = 1
    For x = 1 To rowcount
    
        ActiveSheet.Cells(x, 2).Select
        Selection.Copy
        If i = 1 Then
            newPPT.Visible = True
            newPPT.ActiveWindow.Panes(2).Activate
            newPPT.ActiveWindow.View.GotoSlide (slinum + 2)
            Else
                If i = 2 Then
                newPPT.Visible = True
                newPPT.ActiveWindow.Panes(2).Activate
                newPPT.ActiveWindow.View.GotoSlide (slinum)
                Else
                    If i = 3 Then
                    newPPT.Visible = True
                    newPPT.ActiveWindow.Panes(2).Activate
                    newPPT.ActiveWindow.View.GotoSlide (slinum - 2)
                    End If
                End If
        End If
        i = i + 1
    
        If i = 4 Then
            i = 1
        End If
    
        newPPT.ActiveWindow.View.PasteSpecial DataType:=ppPasteDefault
        newPPT.ActiveWindow.Selection.ShapeRange.Top = (lngSlideHeight - newPPT.ActiveWindow.Selection.ShapeRange.Height) / 2
        newPPT.ActiveWindow.Selection.ShapeRange.Height = 400
        newPPT.ActiveWindow.Selection.ShapeRange.Left = 1
        newPPT.ActiveWindow.Selection.ShapeRange.Width = lngSlideWidth - 1
        newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
        newPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Font.Size = 28
    
            If slinum Mod 9 = 0 Then
                slinum = slinum + 9
            End If
    
            If slinum > slicount Then
                Exit For
            End If
    
        slinum = slinum + 1
    Next x
    
    
    End Sub