2016-01-09 25 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

我明白,謝謝。它爲什麼這樣做?爲什麼操縱文本縮小了選擇範圍?你已經備份了完整的選擇,然後在每個週期結束時恢復它。這是唯一的解決方案嗎? –