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

Mar*_*ynA 5 delphi vba ms-word

假设我想在文档的末尾添加一些文本并立即将其作为Range对象访问,这样我就可以设置它的一些属性而不影响前面的文本.理想情况下,该Range.InsertAfter 方法将返回一个Range对象,这对于此是完美的,但事实并非如此.

让我感到烦恼的是,Word必须完全清楚哪个范围定义了调用的结果InsertAfter,但从表面上看,我需要从插入文本的长度"或事后"计算它,或者以其他方式计算它.

所以我设计了一个简单的解决方法.在伪代码中(实际上它是Delphi代码,但我希望不会阻止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
Run Code Online (Sandbox Code Playgroud)

似乎我可以通过重复第二个代码块无限期地将文本块添加到文档的末尾.

这条线

ARange.SetRange(AEnd, AEnd)
Run Code Online (Sandbox Code Playgroud)

据我了解,似乎在现有的一个末尾构建一个新的Range(不像在现有范围上调用Collapse),并且对于我尝试过的简单测试用例工作正常.但它让我想知道我是否在某个地方错过了一个技巧.是否有更直接的方法将范围附加到文档并获取对它的引用?

PS:我应该更清楚一点,我试图在不使用Selection对象的情况下这样做(出于各种原因,包括你现在只能有一个这样的事实).

Cin*_*ter 5

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

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";
Run Code Online (Sandbox Code Playgroud)

从概念上讲,折叠范围就像在进行选择时按向右(或向左)箭头键。所以rngEndOfDoc变成了一个“点”而不是包含文档主体的全部内容。

FWIW我永远无法想到我会使用 EndKey 来执行此操作(模拟用户操作)的情况,并且只有当我想将用户留在文档末尾以便他可以开始在该处输入时,我才会更改选择地点。

  • @肯怀特。不是真的,不,不是。一方面,它不如使用 Range 高效。即使用户没有与文档交互,Word 也必须更改光标在文档中的位置。如果“文档”窗口不可见,则选择可能会很棘手,因为 Word 确实依赖于“物理”布局页面来完成某些操作。选择本质上是不可预测的,尽管我同意在当前 Story 的 EndKey 情况下您可能会到达您期望的位置。但如果有使用选择的替代方法,您应该尽可能避免使用它。 (2认同)