代码在使用中断时正常运行,但在没有它们的情况下运行时失败 - Powerpoint VBA

时间:2016-01-11 19:25:23

标签: vba powerpoint indentation

我有一个PointPoint演示文稿,文本范围是从外部文本文件自动生成的。文本文件中的每一行都是powerpoint主体中的新行。有些行以" parent开头。"这些行通过replace函数删除" parent。"所有其他行必须缩进。

输出到正文的行很好,当我使用断点慢慢地遍历代码时代码有效。请注意,使用自定义暂停功能强制代码缓慢运行并不能解决问题。以下是我必须完成上述步骤的代码:

Private Sub Indenter(slideName)

With ActivePresentation.Slides(slideName).Shapes("ContentHolder").TextFrame.TextRange
    For i = 1 To .Lines.count
        If Left(.Lines(i).Text, 6) <> "parent" Then
            .Lines(i).IndentLevel = 2
        Else
            .Lines(i).Text = Replace(Replace(Replace(.Lines(i).Text, "parent", ""), Chr(10), ""), Chr(13), "")
            .Lines(i).IndentLevel = 1
        End If
    Next i
End With

End Sub

以下是在运行代码之前powerpoint的样子:

enter image description here

以上是运行上述代码时输出的内容:

Wrong Ouput

最后,这就是输出应该是什么样的:

good

非常感谢任何帮助。

我使用的暂停功能如下:

Public Function Pause(NumberOfSeconds As Variant)

    Dim PauseTime As Variant, Start As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Do While Timer < Start + PauseTime
        DoEvents
    Loop


End Function

1 个答案:

答案 0 :(得分:0)

我明白了。在涉及引用TextRange中的行时,PowerPoint非常挑剔。因此,条件中使用的Replace函数正在改变行顺序,导致某些行被跳过,缺少条件。因此,我将代码更改为以下内容:

Private Sub Indenter(slideName)

With ActivePresentation.Slides(slideName).Shapes("ContentHolder").TextFrame.TextRange
    For i = 1 To .Lines.count
        If Left(.Lines(i).Text, 6) <> "parent" Then
            .Lines(i).IndentLevel = 2
        Else
            .Lines(i).IndentLevel = 1
        End If
    Next i

    For i = .Lines.count To 1 Step -1
        If Left(.Lines(i).Text, 6) = "parent" Then
            .Lines(i).Text = Replace(Replace(Replace(.Lines(i).Text, "parent", ""), Chr(10), ""), Chr(13), "")
        End If
    Next i

End With

End Sub

文本替换在缩进完成后完成。这样可以确保不会更改任何行,从而导致某些行被跳过。由于同样的原因,进行替换的循环是反向完成的。 Powerpoint喜欢在更换时添加总线(虽然在屏幕上无法区分,但在循环线和打印文本内容时,您可以看到这种现象)。反向循环将忽略这些额外的行。为了更加安全,可以循环两次。