2011-09-24 82 views
0

鑑於其中包含修訂的範圍,我需要重建原始文本和修改後的文本。第一個解決方案是:Word VBA中的克隆變量

Sub OriginalText (ByVal Rng as Range) 
Rng.Revisions.RejectAll 
OriginalText = Rng.Text 
End sub 

然而,事實證明,BYVAL是不是真的BYVAL。在RejectAll被調用的那一刻,原始文檔中的所有更改都被拒絕,並且無法應用它們 - 它們從ThisDocument.Revisions中消失。

是否有一個(最好方便的)方法來將變量Rng複製到子中的任何(比如說Rng2),以便我可以在不影響源的情況下使用範圍的副本?

有沒有一種方法來序列化的範圍,並把它放在一起,也許?

Upd:讓我這樣說吧。是否有機會複製對象(在我的情況下爲Range),以便對副本所做的更改不會影響源代碼?我認爲這仍然是最快和最優雅的解決方案。

回答

0

範圍是一個標記,即使它返回範圍的內容。如果你想要的文字,你需要這樣說。

Set r = Selection.Range 
TextNow = Selection.Range.Text 
TextOrig = OriginalText(r) 
+0

當在子程序中調用'.RejectAll'時,它將清除所有修訂(大概是第0個「修訂」,因爲在該範圍內沒有文本) – jonsca

+0

問題不在於如何訪問文本字符串,但更多的是如何從現有的範圍創建新的範圍。範圍保留修改,這些文本顯然沒有。 – user962409

+0

@ user962409你問爲什麼ByVal範圍沒有工作,它不工作,因爲你發送範圍,這是一個位置的標記或標記,所以你可以改變範圍(即開始和結束點)和ByVal會來進入遊戲,但如果您通過Rejectall更改文本,則您正在更改範圍的內容,即文本,所以ByVal毫無意義。 – Fionnuala

0

.RejectAll似乎要清除所有修訂(包括首次輸入文本時)。如果我們可以訪問.Revisions(0)會很方便,但看起來這不可能。

您最好的選擇可能是看看您是否可以在更改前存儲原始文檔。如果這是不可能的,你可以通過諸如this script之類的東西來完成,並且手工找到所有的變化。