MS Word函数将范围附加到文档



>假设我想在文档末尾添加一些文本并立即访问它作为一个Range对象,所以我可以在不影响前面的文本的情况下设置它的一些属性。 理想情况下,Range.InsertAfter方法将返回一个 Range 对象,该对象非常适合此,但它没有。

令我恼火的是,Word 必须非常清楚什么范围定义了调用 InsertAfter 的结果,但从表面上看,我需要根据插入文本的长度或其他方式"事后"计算它。

所以我设计了一个头脑简单的解决方法。 在伪代码中(实际上是德尔福代码,但我希望这不会阻止 VBA 答案)我所做的是这个

ARange := Document.Range
ARange.Text := 'AAA'
AEnd := ARange.End - 1        // AEnd is an integer
ARange.SetRange(AEnd, AEnd)
ARange.Text := 'XXX'
ARange.Bold := True

似乎我可以无限期地在最后添加文本块通过重复第二个代码块来记录文档。

该行

ARange.SetRange(AEnd, AEnd)

据我了解,似乎在现有范围的末尾构造一个新范围(与在现有范围上调用折叠不同),并且适用于我尝试过的简单测试用例。 但这让我想知道我是否在某处错过了技巧。 有没有更直接的方法来附加范围到文档并获取对它的引用?

PS:我应该更清楚一点,我正在尝试在不使用 Select 对象的情况下执行此操作(出于各种原因,包括您一次只能拥有其中一个)。

有多种方法可以在文档末尾获取范围。你已经发现了一个,但正如你所说,它有点迂回。我的偏好:

Word.Range rngEndOfDoc = Document.Content; 
//Content returns a Range object and is a property, not a method like Range()
rngEndOfDoc.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
rngEndOfDoc.Text = "Text at the end of the document";

概念上讲,折叠范围就像在有选择时按向右(或向左)箭头键一样。因此,rngEndOfDoc变成了一个"点",而不是包含文档主体的全部内容。

FWIW 我永远想不出何时会为此使用 EndKey(模拟用户操作),并且只有在我想将用户留在文档末尾以便他可以开始在该位置键入时,我才会更改选择。

感谢其他人的三个令人钦佩的答案,我想我会添加我的有。 以下是我开始希望Word提供的功能的两个版本本机,返回追加的范围。

第一个版本使用 MS Word 类型库导入中的 MS Word 对象传统上随Delphi一起提供的单元(例如Word2000.Pas之一),并使用"早期绑定"自动化,而第二个版本使用后期绑定做同样的事情。

function AppendRange(InputRange : Range) : Range;
var
  Direction : OleVariant;
begin
  Result := InputRange;
  Direction := wdCollapseEnd;
  Result.Collapse(Direction);
end;
function AppendRangeLB(InputRange : OleVariant) : OleVariant;
begin
  Result := InputRange;
  Result.Collapse(wdCollapseEnd);
end;

用法是例如

AppendedRange := AppendRange(ExistingRange);
AppendedRange.Text := 'YYY';

Document.Range视为主文档中所有可能范围的并集(即除了标题,页脚,浮动内容等)。它总是在第一个字符之前开始,在最后一个字符之后结束(根据我的经验,这总是一个隐藏的段落标记)。不可能定义当前Document.Range之后的另一个范围,或者在概念上"附加"Document.Range之后的任何内容,因为没有"之后"Document.Range(它总是到达末尾)。

因此,要使用新文本或其他内联对象扩展文档,您必须将它们插入Document.Range的末尾 - 实际上就在结尾之前,因为最后一个隐藏的段落标记必须仍然是文档的最后一个字符。这正是您在伪代码中所做的。在 VBA 中,文档末尾的空白范围可以引用

Document.Range(Document.Range.End-1, Document.Range.End-1)

尝试在 Document.Range.End 处定义它实际上会引发一个错误,因为它指向最后一个(隐藏)字符之后 - 这是文档之外的 - 这就是为什么我们需要"-1"。

获得此范围后,我们可能会用东西填充它 - 扩展它,从逻辑上讲,Document.Range .例如,要在活动文档的末尾添加文本,可以写

ActiveDocument.Range(ActiveDocument.Range.End-1, ActiveDocument.Range.End-1).Text = "New Text"

请注意,可以通过以下方式达到相同的"最终"空范围:

Document.Bookmarks("EndOfDoc").Range
以下内容在Word

15(Office 365)中使用Word 2010类型库(我正在使用早期绑定,但它也应该与后期绑定相同)。 WordTWordApplicationaRangeWordRange

Word.Selection.EndKey(wdStory, wdMove);
aRange := Word.Selection.Range;
aRange.Text := 'This is new text added at the end.';

最新更新