【问题标题】:Why is this VBA Code not saving and restoring the Selection correctly为什么这个 VBA 代码不能正确保存和恢复选择
【发布时间】: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 格式,因为其中一些可能已被“设置” " 在您选择的文本的开头之前)。

标签: vba macos ms-word


【解决方案1】:

对于此类问题,提供之前/之后情况的示例内容和屏幕截图也将有所帮助 - on 显示非打印字符。 Selection 使用起来非常棘手,因为它总是取决于当前的情况;没有原始环境几乎是不可能排错的……

也就是说,最好的办法是在选择的“周围”添加一个书签,最后可以选择。书签将独立于可能对内容进行的任何更改,只要它没有被删除。示例:

Sub ReplaceText()
    ' Save the original selection
    'Dim original As range
    'Set original = Selection.range
    Dim bkm as Bookmark
    Set bkm = Selection.Bookmarks.Add("temp", 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...Next removed for the sake of clarity

    ' Restore the original selection
    'original.Select
    bkm.Range.Select
    'Optional: bkm.Delete
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-06
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多