2016-01-09 24 views
0

我认为以下两个程序将是相同的,他们为什么不是?范围变量与段落变量不同的行为与选择

此代码:

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的开头并输入一个空格。

铊;博士:我不明白为什么这两个程序中有许多并不等同

我缺乏常识,以谷歌的原因。我试图拉出通用指南。我尝试着通过调试器来掌握控制流程,但这也没有帮助。

回答

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,它的0开始,并在运行的R 27的结束。缩小开始和结束都变为0(假设该段位于文档的开头)。

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

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

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

+0

感谢您抽出宝贵的时间。 我已经得到它的工作,但我需要帮助理解为什么。你能否详细说明'改变选择'?它为什么这样做? Arent我只是操纵内部的字符串,而不是选择? 即时通讯猜你的代码片段避免改变选择莫名其妙? –

+0

这行代码: Set r = Selection.Range.Paragraphs(i)。Range 基于文档中当前选择的内容。 您发布的第一个方法会保留所有选择。当你说在第二个方法p.Range.Text成为选择。所以当你循环下一次它试图找到一个很小的选择段落n,它不会存在。 我的方法是将原始选择作为范围存储在起始处,然后在每个循环的末尾再次选择它 –

+0

我明白,谢谢。它为什么这样做?为什么操纵文本缩小了选择范围?你已经备份了完整的选择,然后在每个周期结束时恢复它。这是唯一的解决方案吗? –