【问题标题】:Range variable vs Paragraph variable different behaviour with selection范围变量与段落变量的不同行为与选择
【发布时间】:2016-04-14 03:03:42
【问题描述】:

我以为下面两个程序是一样的,为什么不呢?

此代码有效:

For i = 1 To n
    Set r = Selection.Range.Paragraphs(i).Range
    r.Collapse
    r.Text = " "
    r.ContentControls.Add (wdContentControlCheckBox)
Next i

这段代码没有:

For i = 1 To n
    Set r = Selection.Range.Paragraphs(i).Range
    Set p = r.Paragraphs(1)
    p.Range.Text = " " + p.Range.Text
    r.Collapse
    r.ContentControls.Add (wdContentControlCheckBox)
Next i

据我所知,唯一的区别是不是在空格后面连接旧文本然后将光标放在段落的开头,而是将光标放在段落的开头并输入一个空格。

Tl;dr:我不明白为什么上面的两个程序不等价

我缺乏谷歌搜索原因的一般知识。我的尝试提取了通用指南。我尝试单步调试调试器以掌握控制流,但这也无济于事。

【问题讨论】:

    标签: vba for-loop ms-word


    【解决方案1】:

    试试:

    Dim sel As Range
    
    
    Set sel = Selection.Range
    
    For i = 1 To n
        Set r = Selection.Range.Paragraphs(i).Range
        Set p = r.Paragraphs(1)
        p.Range.Text = " " + p.Range.Text
        r.Collapse
        r.ContentControls.Add (wdContentControlCheckBox)
        sel.Select
    Next i
    

    问题是:

    p.Range.Text = " " + p.Range.Text

    正在更改选择....

    **** 编辑以包含更好的解释****

    当您使用 r.Collapse - 您将范围 r 设置为具有相等的开始和结束位置。

    例如,如果您有这样的段落:

    “这是我的第一段”

    当您设置 r 时,它的开头为 0,结尾为 27。在您运行 r.Collapse 后,开头和结尾都变为 0(假设 para 位于文档的开头)。

    然后您在位置 0 处插入一个空格(在您的第一种方法下),然后添加您的内容控件。 Word 可以在选择选择时处理此问题。

    在第二种方法中,您直接更改段落的文本。您稍后将折叠 r,但这不会改变 p。 P 将在 0,27 范围内开始。 Word 无法通过添加空格而不选择它来将范围 (0,27) 更改为 (0,28)。

    简而言之,不同之处在于折叠导致 Word 能够在当时(对 Word)空范围之前插入空格。

    【讨论】:

    • 感谢您花时间回答。我已经让它工作了,但我需要帮助理解为什么。你能详细说明“它改变了选择”吗?为什么这样做?我不是在操作其中的字符串,而不是选择吗?我猜你的代码 sn-p 避免以某种方式改变选择?
    • 这行代码: Set r = Selection.Range.Paragraphs(i).Range 基于文档中当前选择的内容。您发布的第一种方法使所有内容保持选中状态。当您在第二种方法中说 p.Range.Text 时,它将成为选择。因此,当您下次循环时,它会尝试在一个很小的选择中找到第 n 段,并且它不会存在。我的方法是在开始时将原始选择存储为一个范围,然后在每个循环结束时再次选择它
    • 我明白了,谢谢。为什么这样做?为什么操作文本会缩小选择范围?您已经备份了完整的选择,然后在每个周期结束时恢复到它。这是唯一的解决方案吗?
    • 我的主要困惑:为什么在范围变量中弄乱段落变量的范围会改变整个选择,但完全折叠主范围变量根本不会影响选择?
    • 因为 VBA 导致了文档中位置的物理选择。就像你手动输入文档一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多