0、实现效果与代码

(1)背景与实现效果

写这一段代码的起因是,笔者发现同事竟然需要在 Word 文档中一页一页的数数,得到专利申请文件中五书各自的页数,从而与公司网站上记录的数据进行核对。而一般来说,专利申请文件中会将五书用分节符拆分为5个部分,所以完全可以根据分节符的位置来自动计算每节中的页数。实现效果如下图。(所谓五书,即“说明书摘要”、“摘要附图”、“权利要求书”、“说明书”、“说明书附图”)
企业微信截图_16227938807057.png

(2)工具与代码

在Word中用Word自带的开发工具VBA实现,代码如下:

  1. Sub 各节页数()
  2. Dim oSec As Object
  3. Dim nStartPg As Integer, nEndPg As Integer, nSecPages As Integer
  4. Dim NumSections As Integer
  5. Dim s1stPara As String
  6. NumSections = ActiveDocument.Sections.Count
  7. nStartPg = 1
  8. For Each oSec In ActiveDocument.Sections
  9. nEndPg = oSec.Range.Information(3)
  10. nSecPages = nEndPg - nStartPg + 1
  11. s1stPara = oSec.Range.Paragraphs(1)
  12. s1stPara = Replace(s1stPara, Chr(13), "")
  13. s1stPara = Replace(s1stPara, Chr(32), "")
  14. Debug.Print "P" & nStartPg & "-P" & nEndPg, _
  15. "页数:" & nSecPages, _
  16. "节" & oSec.Index & "【"; s1stPara & "】"
  17. nStartPg = nEndPg + 1
  18. Next
  19. End Sub
          • 以下是絮絮叨,太长别看 - - - - -

1、现成解决方案

首先呢,微软作为各大平台的最佳开发者,早已经有了现成的解决方案:如何使用 Word automation 计算文档每节中的页面数
这个代码实际应用起来有点错误,主要是nEndPg = oSec.Range.Information(3) - 1,这个减1不知道是为什么,减1完全不对。

2、写代码过程中获得的知识点

  1. Range.AutoFormat 方法通过这个文档中的示例,学会了如何对于word中选中的部分(即Selection用ComputeStatistics属性。该属性不能直接作用于Selection对象,只能用于Range和Documents对象。最后形成的代码是Selection.Range.ComputeStatistics(wdStatisticPages)
  2. 如何查看运行后的结果呢?除了最常用的msgbox方法外,还有debug.print方法。debug.print方法会将结果显示在“立即窗口”(视图>立即窗口)。Debug.print s
  3. 关于通配符、正则匹配。网络上有多种内容,有些正确有些错误,目前已知^m可匹配到分节符。参考文档
  4. WdInformation用来返回指定选择或范围的各种信息。包括页面编号等,主要用了下面两个:
    1. wdActiveEndAdjustedPageNumber (value=1)在总页数范围内的编码
    2. wdActiveEndPageNumber (value=3)在某一节范围内的编码
  5. Range.ComputeStatistics 方法:就是用这个方法来计算各个节的页数。或者选择范围的页数。还可以计算字符数量等等,约等于word中的字数统计功能。其中的参数有WdStatistic,可返回“字符数、行数、段落数、页数”。
  6. Selection 对象:可以对选中的内容、范围进行处理。selection就代表选中的范围。
  7. Section 对象:看起来跟上一个对象很像,初次接触时搞混了好几次,这个是节对象,比如Section(1)代表第一节。
  8. chr码值+Replace去掉换行符和空白符
  9. VBA:处理字符串的各种函数。今天试用了Trim,还挺好用的,不过对于文字中间的空格就没有作用了。

    3、待研究/解决的问题

  10. 现成解决方案中,为什么会用到Document.Repaginate 方法?即“重新分页整个文档”。

  11. 如图。word中用vba计算每节页数的疑问.png
  12. 代码差不多写完了,接下来的问题是如何打包。。。

    4、感悟

  • 多读文档……读官方文档……
  • 网上到处都是轮子,只看你的搜索技巧高低,看见后看不看得懂。