我有一个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的样子:
以上是运行上述代码时输出的内容:
最后,这就是输出应该是什么样的:
非常感谢任何帮助。
我使用的暂停功能如下:
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
答案 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喜欢在更换时添加总线(虽然在屏幕上无法区分,但在循环线和打印文本内容时,您可以看到这种现象)。反向循环将忽略这些额外的行。为了更加安全,可以循环两次。