代码在使用中断单步执行时正常运行,但在 运行 没有中断时失败 - Powerpoint VBA

Code functions properly when stepped through using breaks, but fails when ran without them - Powerpoint VBA

我有一个 PointPoint 演示文稿,文本运行ge 是从外部文本文件自动生成的。文本文件中的每一行都是 powerpoint 正文中的新行。某些行以 "parent." 开头 这些行通过替换函数删除 "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 的样子 运行:

以上代码为 运行:

时的输出如下所示

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

非常感谢任何帮助。

我使用的暂停功能如下:

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

我明白了。在 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喜欢在替换的时候加上总行(虽然在屏幕上无法区分,但是在循环遍历这些行并打印它们的文本内容时,你可以看到这种现象)在替换的时候。反向循环将忽略这些额外的行。为了更加安全,可以循环两次。