如何可靠地获取Word文档中的页数?

时间:2013-06-03 10:03:09

标签: vba ms-word word-vba word-2010

我使用自动化对Word文档进行了大量更改,然后运行VBA宏,其中包括检查文档是否只有一定数量的页面。

我正在使用ActiveDocument.Information(wdNumberOfPagesInDocument)来获取页数,但此方法返回的结果不正确。我认为这是因为Word尚未更新文档的分页以反映我所做的更改。

ActiveDocument.ComputeStatistics(wdStatisticPages)也会遇到同样的问题。

我曾尝试坚持打电话给ActiveDocument.Repaginate,但这没有任何区别。

我确实有幸在文档的末尾添加了一个段落,然后再次删除它 - 但是这个黑客似乎已经不再适用了(我最近从Word 2003迁移到了Word 2010)。

有什么方法可以强制Word 实际重新分页,和/或等到重新分页完成后?

6 个答案:

答案 0 :(得分:3)

我花了2个小时试图解决这个问题,我还没有在任何论坛上看到这个答案,所以我想我会分享它。

https://msdn.microsoft.com/en-us/vba/word-vba/articles/pages-object-word?f=255&MSPPError=-2147217396

这给了我我的解决方案,结合文章梳理,发现最新版本的Word不支持人们引用的大多数解决方案。我不知道它改变了什么版本,但我的假设是2013和更新版本可以使用此代码来计算页面:

ActiveDocument.ActiveWindow.Panes(1).Pages.Count.

我相信它的工作方式是ActiveDocument选择文件,ActiveWindow确认要使用的文件在当前窗口中(如果文件在视图选项卡的多个窗口中打开),Panes确定是否有多个窗口/拆分窗格/任何其他您想要评估“第一个”的废话,pages.count通过计算集合中的项目数来指定要评估的页面对象。

任何知识渊博的人都可以随意纠正我,但这是第一种方法,它为我尝试的任何文件提供了正确的页数!

我也道歉但我无法弄清楚如何将该行格式化为代码块。如果mod想要编辑我的评论,那就是我的客人。

答案 1 :(得分:2)

完成所有更改后,您可以使用OnTime强制稍微延迟,然后再阅读网页统计信息。

Application.OnTime When:=Now + TimeValue("00:00:02"), _
        Name:="UpdateStats"

我还会在此OnTime语句之前更新所有字段:

ActiveDocument.Range.Fields.Update

答案 2 :(得分:0)

我发现下面有一个可能的解决方法,如果不是主题问题的真正答案。 昨天,下面的第一个ComputeStatistics行返回了正确的31页,但今天它只返回1.

解决方法是删除Content对象并返回正确的页数。

Dim docMultiple As Document
Set docMultiple = ActiveDocument 
lPageCount = docMultiple.Content.ComputeStatistics(wdStatisticPages)  ' Returns 1
lPageCount = docMultiple.ComputeStatistics(wdStatisticPages)  ' Returns correct count, 31

答案 3 :(得分:0)

ActiveDocument.Range.Information(wdNumberOfPagesInDocument)

这对我来说每次都有效。它返回单词中的总物理页面。

答案 4 :(得分:0)

Dim wordapp As Object
Set wordapp = CreateObject("Word.Application")
Dim doc As Object
Set doc = wordapp.Documents.Open(oFile.Path)

Dim pagesCount As Integer
pagesCount = doc.Content.Information(4) 'wdNumberOfPagesInDocument
doc.Close False
Set doc = Nothing

答案 5 :(得分:0)

我在Excel中使用了此功能 它可以可靠地处理约20个文档 没有一个超过20页,但是有些非常复杂 图片和分页符等。

Sub GetlastPageFromInsideExcel()
Set wD = CreateObject("Word.Application")
Set myDoc = wD.Documents.Open("C:\Temp\mydocument.docx")
myDoc.Characters.Last.Select        ' move to end of document
wD.Selection.Collapse               ' collapse selection at end
lastPage = wD.Selection.Information(wdActiveEndPageNumber)
mydoc.close
wd.quit
Set wD = Nothing
End Sub