Search code examples
vbapowerpointpowerpoint-2007

Positioning images on slides in PowerPoint 2007 using vba


I'd like to do one of two things in PowerPoint 2007 on Windows.

The first is to change the default location for pasting in an image. When I paste in a graph I made with SAS, it pastes into the upper lefthand corner. Ideally, I'd like to change the default paste position. There don't seem to be any simple options for this but I thought maybe it was possible with VBA.

If it's not possible, then I'd like to write a VBA macro to step through each slide and change the image position.

I got a slide loop to work, thanks to this and other sites (the MsgBox is just a test):

Sub SlideLoop()
    Dim osld As Slide

    For Each osld In ActivePresentation.Slides
        osld.Select
        MsgBox "The slide index of the current slide is: " & _
             ActiveWindow.View.Slide.SlideIndex
    Next osld

End Sub

Beyond that, I haven't had much luck. I have seen code snippets that select all images on a slide and crop or resize them, and I found this bit on excelhelphq.com that is meant to position an image:

With ActiveWindow.Selection.ShapeRange
  .Left = 50 'change the number for desired x position
  .Top = 50 'change the number for desired y position
End With 

But I'm not sure how to integrate it into the loop, and the online documentation for Powerpoint VBA is not particularly robust. Some code deals with the ShapeIndex but I wasn't sure how to work with that.

I should mention that I have only one image on a slide when I have an image (some slides do not have images at all, though).

This seems like the best time-saving approach, though I'm still manually pasting into PowerPoint in the first place.

I appreciate any help with this! I couldn't find anything that addressed this exact question.

Is VBA for PPT being phased out? It feels like Microsoft doesn't want people to be able to figure out how to use it based on their not-stellar online documentation.


Solution

  • It's unlikely that MS will phase out VBA any time soon. Too many large corporate clients would roast them if they did. All the same, you're right, the documentation is bad and getting worse with every release.

    Makes places like this all the more valuable, then. So, a little cleanup to your basic loop first:

    Sub SlideLoop()
        Dim osld As Slide
    
        For Each osld In ActivePresentation.Slides
            ' osld.Select  No need to select a slide before acting on it
            'MsgBox "The slide index of the current slide is: " & _
            '     ActiveWindow.View.Slide.SlideIndex
            MsgBox "The slide index of the current slide is: " & cstr(osld.SlideIndex)
        Next osld
    
    End Sub
    

    So here's a start on how to do what you're after:

    Sub SlideLoop()
        Dim osld As Slide
        Dim oSh As Shape
    
        For Each osld In ActivePresentation.Slides
            ' check each shape on the slide
            ' is it an image or whatever you're looking for?
            For Each oSh In osld.Shapes
                With oSh
                    If .Type = msoLinkedPicture _
                    Or .Type = msoPicture Then
    
                    ' position it to taste
                    .Left = 100
                    .Top = 100
    
                    ' centering/resizing gets trickier
                    ' but is still possible.
                    ' Exercise for the reader?
                    ' Hint:
                    ' ActivePresentation.PageSetup.SlideWidth and .SlideHeight
                    ' tells you the width and height of the slide
                    '
                    ' All values are in Points (72 to the inch)
    
                    End If
                End With
            Next    ' Shape
        Next osld   ' Slide
    
    End Sub