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

Gar*_*ill 11 vba ms-word word-vba word-2010

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

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

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

我试着坚持打电话ActiveDocument.Repaginate,但这没什么区别.

我确实有一些运气,在文档的末尾添加一个段落,然后再次删除它 - 但该黑客似乎不再有效(我最近从Word 2003迁移到Word 2010).

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

小智 8

我刚刚花了 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.
Run Code Online (Sandbox Code Playgroud)

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

任何知识渊博的人都可以随时纠正我,但这是第一种在我尝试过的任何文档上为我提供正确页数的方法!

我也很抱歉,但我无法弄清楚如何将该行格式化为代码块。如果模组想编辑我的评论来做我的客人。


ale*_*sky 5

尝试(也许之后ActiveDocument.Repaginate)

ActiveDocument.BuiltinDocumentProperties(wdPropertyPages)
Run Code Online (Sandbox Code Playgroud)

它导致我的Word 2010在状态栏中使用"Counting words"状态花费半秒钟,同时ActiveDocument.ComputeStatistics(wdStatisticPages)立即返回结果.

来源:https://support.microsoft.com/en-us/kb/185509


And*_*y G 2

完成所有更改后,您可以OnTime在读取页面统计信息之前强制稍微延迟。

Application.OnTime When:=Now + TimeValue("00:00:02"), _
        Name:="UpdateStats"
Run Code Online (Sandbox Code Playgroud)

我还将更新此语句之前的所有字段OnTime

ActiveDocument.Range.Fields.Update
Run Code Online (Sandbox Code Playgroud)