有趣的问题。[见最后更新]
Word 的对象模型实际上并没有“页面”对象,因为文档的分页会随着您添加和删除内容(或更改字体大小、纸张大小等)而不断变化。因此,没有“ActiveDocument.Pages(1)”之类的东西。
更重要的是,没有简单的方法来判断当前显示的页面。部分原因是用户不一定一次只能看到一页。他可能正在查看一页的结尾和下一页的开头,或者可能显示几页 - 取决于他的查看设置。
如果我能让这个问题稍微简单一点,那么也许我可以用对你有帮助的方式来回答它。让我将“当前活动(用户可见)页面”重新定义为选择所在的页面。(实际上,由于选择可以跨越多个页面,我们将其定义为“选择的活动端所在的页面”)。
我还将使用 VBA 进行回答,因为在 VBA 即时窗口中使用它更容易,并且在需要时转换为 C# 是微不足道的(毕竟它是相同的对象模型)。
Word 的Selection
对象具有 a 的属性Range
,如果您只是想要所有选定的单词,那么这将是微不足道的(Selection.Words
!)。但是,如果我们想要该页面上的所有单词,那么我们需要更加努力。
首先,让我们找出(开始)选择在哪个页面上。为此,我们可以使用信息方法:
pageNumber = Selection.Information(wdActiveEndPageNumber)
所以现在我们知道我们对哪个页面感兴趣。我们现在需要获取一个Range
包含该页面上所有文本的对象。我们需要分两步执行此操作——首先找到该范围的起点,然后找到该范围的终点。
要查找范围的开始,我们可以使用该Goto
函数,它返回一个 Range 对象,表示指定项的开始:
startOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber).Start
范围的结尾是下一页的开头(减去一个字符,但我们不要吹毛求疵),或者是文档的结尾(如果我们在最后一页上):
If pageNumber = ActiveDocument.Content.Information(wdNumberOfPagesInDocument) Then
endOfRange = ActiveDocument.Content.End
Else
endOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber + 1).Start
End If
现在我们可以构造一个Range
包含页面上所有文本的对象:
Set pageRange = ActiveDocument.Range(startOfRange, endOfRange)
...从那里我们可以得到的话:
Set words = pageRange.Words
这是一个简短的 VBA 宏,它使用上述技术来报告活动页面上的字数:
Sub Test()
Dim pageNumber As Integer
Dim startOfRange As Integer
Dim endOfRange As Integer
Dim pageRange As Range
pageNumber = Selection.Information(wdActiveEndPageNumber)
startOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber).Start
If pageNumber = ActiveDocument.Content.Information(wdNumberOfPagesInDocument) Then
endOfRange = ActiveDocument.Content.End
Else
endOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber + 1).Start
End If
Set pageRange = ActiveDocument.Range(startOfRange, endOfRange)
MsgBox pageRange.Words.Count
End Sub
更新
好的,事实证明有一种更简单的方法可以做到这一点。Word 有一个“特殊书签”,它指向当前页面上的文本,所以这将与上面的所有代码一样:
words = ActiveDocument.Bookmarks("\page").Range.Words