假设我想在文档的末尾添加一些文本并立即访问
它作为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
似乎我可以无限期地继续添加文本块到最后 重复第二个代码块的文档。
该行
ARange.SetRange(AEnd, AEnd)
据我所知,似乎在现有范围的末尾构建了一个新的Range(与在现有范围上调用Collapse不同), 并且对于我尝试过的简单测试用例工作得很好。但它让我感到疑惑 我是否在某个地方错过了一招。是否有更直接的方法来追加范围 到文档并获取它的参考?
PS:我应该更清楚一点,我试图在不使用Selection对象的情况下这样做(出于各种原因,包括你当时只能有一个这样的事实)。答案 0 :(得分:3)
有多种方法可以在文档末尾获取Range。你已经发现了一个,但正如你所说,它有些迂回曲折。我的偏好:
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(模拟用户操作)时我永远不会想到这种情况,当我想让用户留在文档的末尾时我只会更改选择以便他可以启动在那个地方打字。
答案 1 :(得分:3)
感谢其他人的三个令人钦佩的答案,我想我会加上我的 拥有。以下是我开始希望Word提供的函数的两个版本 原生地,返回附加范围。
第一个版本使用MS Word类型库导入中的MS Word对象 传统上与Delphi一起使用的单元(例如Word2000.Pas one),并使用"早期绑定"自动化, 而第二个版本使用后期绑定做同样的事情。
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';
答案 2 :(得分:2)
将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& #34;
获得此范围后,我们可以填充它 - 扩展它,逻辑上,Document.Range
。例如,要在活动文档的末尾添加文本,可以编写
ActiveDocument.Range(ActiveDocument.Range.End-1, ActiveDocument.Range.End-1).Text = "New Text"
请注意同样的" final"可以通过以下方式达到空的范围:
Document.Bookmarks("\EndOfDoc").Range
答案 3 :(得分:0)
以下在使用Word 2010类型库的Word 15(Office 365)中为我工作(我使用的是早期绑定,但它也应该与后期绑定相同)。 Word
为TWordApplication
,aRange
为WordRange
。
Word.Selection.EndKey(wdStory, wdMove);
aRange := Word.Selection.Range;
aRange.Text := 'This is new text added at the end.';