范围变量vs段落变量与选择的不同行为

时间:2016-01-09 13:09:46

标签: vba for-loop ms-word

我认为以下两个程序是相同的,为什么不呢?

此代码有效:

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

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

Tl;博士:我不明白为什么上述两个课程不等同

我缺乏google原因的一般知识。我的尝试提出了通用指南。我试着通过调试器来掌握控制流程,但这也没有帮助。

1 个答案:

答案 0 :(得分: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后,开始和结束都变为0(假设para位于文档的开头)。

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

在第二种方法下,您将直接更改段落的文本。你以后会崩溃,但这不会改变p。 P将在0,27范围内开始。通过添加空格而不选择它,Word不能将范围(0,27)更改为(0,28)。

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