0、实现效果与代码
(1)背景与实现效果
写这一段代码的起因是,笔者发现同事竟然需要在 Word 文档中一页一页的数数,得到专利申请文件中五书各自的页数,从而与公司网站上记录的数据进行核对。而一般来说,专利申请文件中会将五书用分节符拆分为5个部分,所以完全可以根据分节符的位置来自动计算每节中的页数。实现效果如下图。(所谓五书,即“说明书摘要”、“摘要附图”、“权利要求书”、“说明书”、“说明书附图”)
(2)工具与代码
在Word中用Word自带的开发工具VBA实现,代码如下:
Sub 各节页数()
Dim oSec As Object
Dim nStartPg As Integer, nEndPg As Integer, nSecPages As Integer
Dim NumSections As Integer
Dim s1stPara As String
NumSections = ActiveDocument.Sections.Count
nStartPg = 1
For Each oSec In ActiveDocument.Sections
nEndPg = oSec.Range.Information(3)
nSecPages = nEndPg - nStartPg + 1
s1stPara = oSec.Range.Paragraphs(1)
s1stPara = Replace(s1stPara, Chr(13), "")
s1stPara = Replace(s1stPara, Chr(32), "")
Debug.Print "P" & nStartPg & "-P" & nEndPg, _
"页数:" & nSecPages, _
"节" & oSec.Index & "【"; s1stPara & "】"
nStartPg = nEndPg + 1
Next
End Sub
- 以下是絮絮叨,太长别看 - - - - -
1、现成解决方案
首先呢,微软作为各大平台的最佳开发者,早已经有了现成的解决方案:如何使用 Word automation 计算文档每节中的页面数。
这个代码实际应用起来有点错误,主要是nEndPg = oSec.Range.Information(3) - 1
,这个减1不知道是为什么,减1完全不对。
2、写代码过程中获得的知识点
- Range.AutoFormat 方法:通过这个文档中的示例,学会了如何对于word中选中的部分(即Selection用
ComputeStatistics
属性。该属性不能直接作用于Selection
对象,只能用于Range和Documents对象。最后形成的代码是Selection.Range.ComputeStatistics(wdStatisticPages)
。 - 如何查看运行后的结果呢?除了最常用的msgbox方法外,还有debug.print方法。debug.print方法会将结果显示在“立即窗口”(视图>立即窗口)。
Debug.print s
- 关于通配符、正则匹配。网络上有多种内容,有些正确有些错误,目前已知
^m
可匹配到分节符。参考文档。 - WdInformation。用来返回指定选择或范围的各种信息。包括页面编号等,主要用了下面两个:
- wdActiveEndAdjustedPageNumber (value=1)在总页数范围内的编码
- wdActiveEndPageNumber (value=3)在某一节范围内的编码
- Range.ComputeStatistics 方法:就是用这个方法来计算各个节的页数。或者选择范围的页数。还可以计算字符数量等等,约等于word中的字数统计功能。其中的参数有WdStatistic,可返回“字符数、行数、段落数、页数”。
- Selection 对象:可以对选中的内容、范围进行处理。selection就代表选中的范围。
- Section 对象:看起来跟上一个对象很像,初次接触时搞混了好几次,这个是节对象,比如Section(1)代表第一节。
- chr码值+Replace去掉换行符和空白符。
VBA:处理字符串的各种函数。今天试用了Trim,还挺好用的,不过对于文字中间的空格就没有作用了。
3、待研究/解决的问题
现成解决方案中,为什么会用到Document.Repaginate 方法?即“重新分页整个文档”。
- 如图。
- 代码差不多写完了,接下来的问题是如何打包。。。
4、感悟
- 多读文档……读官方文档……
- 网上到处都是轮子,只看你的搜索技巧高低,看见后看不看得懂。