我使用自动化对Word文档进行了大量更改,然后运行VBA宏,其中包括检查文档是否只有一定数量的页面。
我正在使用ActiveDocument.Information(wdNumberOfPagesInDocument)
来获取页数,但此方法返回的结果不正确。我认为这是因为Word尚未更新文档的分页以反映我所做的更改。
ActiveDocument.ComputeStatistics(wdStatisticPages)
也会遇到同样的问题。
我曾尝试坚持打电话给ActiveDocument.Repaginate
,但这没有任何区别。
我确实有幸在文档的末尾添加了一个段落,然后再次删除它 - 但是这个黑客似乎已经不再适用了(我最近从Word 2003迁移到了Word 2010)。
有什么方法可以强制Word 实际重新分页,和/或等到重新分页完成后?
答案 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