Search code examples
vstopowerpointoffice-interopofficedev

PowerPoint Programming: Indentation with Ruler margin levels not working?


Recently we upgraded one our PowerPoint addin to support 2007 and 2010. most of the items we were able to port without problem. one problem we have is that indentations doesn't work when create tables or shapes using the addin.

for eg: same table gets dropped with proper indentation in 2003 but same thing doesn't get indentation when added to using 2007.

below is the code snippet that allows indenting:

With PropertyValues.ObjShape.Table.Cell(row, col).Shape.TextFrame.Ruler
               For rulerCount = 0 To 5
                    .Levels(rulerCount).FirstMargin = rulerFirstMargin(rulerCount) '.LeftMargin = rulerLeftMargin
                    .Levels(rulerCount).LeftMargin = rulerLeftMargin(rulerCount) 'Left indent marker
                Next rulerCount
        End With

any idea why this is not working ?

I read the following thread too but didn't help much http://answers.microsoft.com/en-us/office/forum/office_2007-customize/why-shapetextframerulerlevelsi-cant-set-the-bullet/9eac3e46-b13b-433e-b588-216ead1d9c1a?tab=AllReplies#tabs

Updated Code:

 PropertyValues.ObjShape.Table.Cell(row, col).Shape.TextFrame.TextRange.Text = "N/A"
            With PropertyValues.ObjShape.Table.Cell(row, col).Shape.TextFrame
                'Dim rulerCount As Short
                For rulerCount = 1 To 5
                    .Ruler.Levels(rulerCount).FirstMargin = 10 * rulerCount 'rulerFirstMargin(rulerCount) '.LeftMargin = rulerLeftMargin
                    .Ruler.Levels(rulerCount).LeftMargin = 20 * rulerCount 'rulerLeftMargin(rulerCount) 'Left indent marker
                Next rulerCount
            End With
            PropertyValues.ObjShape.Table.Cell(row, col).Shape.TextFrame.TextRange.Text = text

Solution

  • FWIW, in 2007 and up, you can now have up to 9 ruler levels instead of 5 as in earler versions. But your code should work as is. Here's a simplified version that does work on an arbitrary cell (2,2) of a table:

    Dim oSh As Shape
    Dim x As Long
    Set oSh = ActiveWindow.Selection.ShapeRange(1)
    
    With oSh.Table.Cell(2, 2).Shape.TextFrame
        For x = 1 To 9
        .Ruler.Levels(x).LeftMargin = x * 10
        .Ruler.Levels(x).FirstMargin = x * 20
        Next
    End With
    

    The other thing you might be running into is that you can apply certain types of formatting (including ruler settings) all you like; if there's no text at the level you're applying it to, PPT won't bark. It'll ignore you. Your settings will have no effect. Sometimes you need to check for text, supply some if there's none there (something highly improbable in the real world) then delete all instances of your improbable text afterwards.

    Ugly. Yes.

    Here we add text and set indent levels before trying to FORMAT each indent level:

    Sub test()
    
    Dim oSh As Shape
    Set oSh = ActiveWindow.Selection.ShapeRange(1)
    Dim RulerCount As Long
    Dim sTemp As String
    
    sTemp = "@#$%"  ' dummy text
    
    With oSh.Table.Cell(2, 3).Shape.TextFrame
    
        For RulerCount = 1 To 5
            .TextRange.Paragraphs(RulerCount).Text = sTemp & vbCrLf
            .TextRange.Paragraphs(RulerCount).IndentLevel = RulerCount
        Next
        For RulerCount = 1 To 5
            .Ruler.Levels(RulerCount).FirstMargin = 10 * RulerCount 'rulerFirstMargin(rulerCount) '.LeftMargin = rulerLeftMargin
            .Ruler.Levels(RulerCount).LeftMargin = 20 * RulerCount 'rulerLeftMargin(rulerCount) 'Left indent marker
        Next RulerCount
    End With
    
    
    End Sub