【发布时间】:2020-07-25 07:25:26
【问题描述】:
我一直在尝试使用 Visual Basic 获取 Word 文档中的每一行文本,并根据文本内容以某种方式对其进行格式化。
我试图实现的方法是:
1.保存当前选择的文本
2.查找选择的行数
3. 通过一次选择一行来遍历这些行
4.修改线路
5.最后,恢复原来的选择
我已将代码缩减为问题的最小示例。
Sub ReplaceText()
' Save the original selection
Dim original As range
Set original = Selection.range
' Get the number of lines in the selection
Dim lines As Long
With Dialogs(wdDialogToolsWordCount)
.Execute
lines = .lines
End With
' Iterate through each line
For Index = 1 To lines
' Go to beginning of line
Selection.HomeKey Unit:=wdLine
' Select the entire line
Selection.Expand wdLine
' Save the text of the line
Dim line
line = Selection.Text
' Line with the problem
' Just setting the selection text back to itself
Selection.Text = line
' Advance cursor to next Line
Selection.MoveDown Unit:=wdLine
Next Index
' Restore the original selection
original.Select
End Sub
问题是当原始选择最终恢复时,它不能正确恢复。恢复的选择从原始选择中选择除最后一行之外的所有内容。我不确定为什么会发生这种情况。
编辑:在原来的.Select之后,我加了一行:
Selection.MoveDown Extend:=wdExtend
这似乎有效,但没有解释为什么会发生这种情况以及我如何防止选择发生变化。
【问题讨论】:
-
cmets中提到的“问题”是什么,发布的代码是否解决了它,还是这里遗漏了一些代码?
-
@TimWilliams 我正在尝试保存用户的当前选择,以便稍后在更改文本后恢复它。问题是,在添加带有注释的行后,我尝试保存和恢复它的方式不起作用。这是损坏的代码,这是我无法解决的问题的最小示例。
-
我对 Word VBA 不太熟悉,但是如果您捕获
Selection.Range.Start和.End位置,那么您应该能够使用ActiveDocument.Range(oStart, oEnd).Select恢复选择但是如果在您的实际用例中您正在修改内容,那么您需要在恢复选择之前跟踪新的结束位置 -
@TimWilliams 我能够找到一些有用的东西,但这仍然不能解释为什么保存在变量 original 中的选择发生了变化。这就是为什么我仍然感到困惑,因为它不应该改变,但它仍然存在。
-
可能不相关,但是当您使用Selection.Text检索Selection的文本时,您检索的是Selection的纯文本“。如果您然后设置Selection .Text 到您检索的文本,您将丢失其中非纯文本的任何内容 - 包括格式更改等内容(您可能不会丢失 *all 格式,因为其中一些可能已被“设置” " 在您选择的文本的开头之前)。