代码在使用中断单步执行时正常运行,但在 运行 没有中断时失败 - 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喜欢在替换的时候加上总行(虽然在屏幕上无法区分,但是在循环遍历这些行并打印它们的文本内容时,你可以看到这种现象)在替换的时候。反向循环将忽略这些额外的行。为了更加安全,可以循环两次。
我有一个 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喜欢在替换的时候加上总行(虽然在屏幕上无法区分,但是在循环遍历这些行并打印它们的文本内容时,你可以看到这种现象)在替换的时候。反向循环将忽略这些额外的行。为了更加安全,可以循环两次。