我认为以下两个程序是相同的,为什么不呢?
此代码有效:
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原因的一般知识。我的尝试提出了通用指南。我试着通过调试器来掌握控制流程,但这也没有帮助。
答案 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)空范围之前插入空格。