Vba 获取Word文档中的页数

Vba 获取Word文档中的页数,vba,ms-word,Vba,Ms Word,我正在使用自动化对Word文档进行大量更改,然后运行VBA宏,其中包括检查文档的页数是否不超过一定的页数 我正在使用ActiveDocument.Information(wdNumberOfPagesInDocument)获取页数,但此方法返回的结果不正确。我认为这是因为Word还没有更新文档的分页以反映我所做的更改 ActiveDocument.ComputeTestatics(wdStatisticPages)也面临同样的问题 我试着坚持调用ActiveDocument.Repaginate

我正在使用自动化对Word文档进行大量更改,然后运行VBA宏,其中包括检查文档的页数是否不超过一定的页数

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

ActiveDocument.ComputeTestatics(wdStatisticPages)
也面临同样的问题

我试着坚持调用
ActiveDocument.Repaginate
,但这没有什么区别

我确实有幸在文档末尾添加了一个段落,然后又删除了它——但这种方法似乎不再有效(我最近从Word 2003改为Word 2010)


我有没有办法强迫Word实际重新分页,和/或等待重新分页完成?

在完成所有更改后,您可以使用
OnTime
强制稍微延迟一段时间,然后再阅读页面统计信息

Application.OnTime When:=Now + TimeValue("00:00:02"), _
        Name:="UpdateStats"
我还将更新此
OnTime
语句之前的所有字段:

ActiveDocument.Range.Fields.Update

我在下面找到了一个可能的解决方法,如果不是这个主题问题的真正答案的话。 昨天,下面的第一行
ComputeTestatics
返回了正确的总共31页,但今天它只返回了1页

解决方案是去掉
内容
对象,并返回正确的页数

Dim docMultiple As Document
Set docMultiple = ActiveDocument 
lPageCount = docMultiple.Content.ComputeStatistics(wdStatisticPages)  ' Returns 1
lPageCount = docMultiple.ComputeStatistics(wdStatisticPages)  ' Returns correct count, 31
尝试(可能在
ActiveDocument.Repaginate
之后)

这导致my Word 2010在状态栏中花费半秒钟的时间“计算字数”,而
ActiveDocument.ComputeStatistics(wdStatisticPages)
会立即返回结果


来源:

ActiveDocument.Range.Information(wdNumberOfPagesInDocument)


我每次都是这样。它返回word中的全部物理页面。

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

这让我找到了我的解决方案,并对文章进行了梳理,发现人们引用的大多数解决方案在最新版本的Word中都不受支持。我不知道它是在什么版本中更改的,但我的假设是2013及更新版本可以使用此代码计算页面数:

ActiveDocument.ActiveWindow.Panes(1).Pages.Count.
我相信这样做的方式是ActiveDocument选择文件,ActiveWindow确认要使用的文件在当前窗口中(如果文件在“视图”选项卡的多个窗口中打开),窗格确定是否有多个窗口/拆分窗格/任何其他您希望评估“第一个”的无意义,pages.count指定要通过计算集合中的项目数来计算的pages对象

任何有更多知识的人都可以随意纠正我,但这是第一个在我尝试过的任何文档中为我提供正确页数的方法


我也很抱歉,但我不知道如何将该行格式化为代码块。如果mods想编辑我的评论,那就请做我的嘉宾。

我在Excel中使用了这个
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
它在大约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

你使用的两种方法都是正确的。也许您应该在测试页数之前给它时间重新计算/重新编制页码?你做了什么样的更改导致了这个问题?我有类似的问题(我不记得是什么类型的,不是num pages,而是类似的),我通过显示Word应用程序窗口(它是隐藏的)解决了这个问题。@KazJaw:多少时间,尽管:-)我所做的更改主要是添加/删除文本,以及删除表行。但是,文档确实有一个复杂的布局。如何不引用
ActiveDocument
,而是显式引用文档对象?(您可能将其存储在变量中)按照在文档末尾添加段落的方式,如果
选择
文档结尾(即使用
ActiveDocument.Bookmarks(“\EndOfDoc”)。选择
),则可以调用
.Information(wdNumberOfPagesInDocument)
。对于一个1177页的复杂文档来说,它很好用,但需要很长时间。我想你看到的只是运气,或者更确切地说,是时间问题。ComputeTestistics最终将返回正确的结果,因此在循环中调用它,或者在延迟之后调用它,或者在某些情况下甚至调用它两次,将生成正确的结果。问题是,它的可预测性不足以让它变得有用。如果你再看一遍这个问题,你会发现我已经在使用ActiveDocument.ComputeStatistics,这对我来说并不可靠。好消息-现在不能尝试(这个问题是两个工作之前的问题),但听起来值得一试。@GaryMcGill谢谢,希望其他人会:)@alexkovelsky工作得很好!ThanksMy执行时间测试表明,在ComputeTestistics(wdStatisticPages)之前调用Repaginate是多余的。ComputeTestatics(wdStatisticPages)属性似乎在必要时强制重新分页。此外,我的测试是在应用程序窗口可见的情况下完成的。所以我一致的结果可能是这个状态的函数。Gary McGill没有说明这是否是他考虑的因素,但如果应用程序窗口不可见,则依赖于文档图像渲染状态的任何功能都将不可靠。这可以应用于信息属性以及ComputeTestistics和BuiltinoDocumentProperties属性,具体取决于请求的操作。这是我在问题中已经说过的
ActiveDocument.Information(wdNumberOfPagesInDocument)
ActiveDocument.Range.Information(wdNumberOfPagesInDocument)
相同,因为
Range
文档的默认属性。它在大多数情况下都有效,但不起作用
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