前言
受同事的委托,要我帮忙做一个将word批注提取出来导入到Excel中的工具
以前听说过office有VBA,宏之类的东西,而且和VB相似(本人以前做过简单的VB开发,但基本都忘没了),就答应了下来
经过一番苦战,终于完成了,回头看一下自己走过来的路,发现又学到很多东西,同时发现了一片新大陆,在Microsoft Office\OFFICE11\2052路径下,有VBA API的文档,而且是装了office以后自带的,这些宝贝在那待了那么长时间浪费啦。接下来我就说一下这次的开发过程吧,也算是一个小的总结。
需求开发
对于自己不了解的东西,到网上搜索就没有错了
在baidu里搜了一下“word 批注 excel”,还真有现成的代码,本着拿来主义,将代码拷贝到了excel的编辑器中,将文件路径这类的东西改了一下,运行!别说,还真好用。于是就拿去向同事交差。把网上的东西直接拿来就用当然不能满足同事的要求,于是同事又提了一大堆需求(同事也算是客户了,要求也算是需求),比如要可以在弹出的浏览窗口选择文件;不光要显示批注,还要显示批注的人和批注的章节位置;要可以导出到她(当然是她了)提供的统计模板里等等。
既然大框已经有了,接下来就是在基础上继续的完善了,我们接下来就一个一个来吧。
解题思路
弹出选择文件的提示框,又是网上一顿搜,结果搜来的都是打开文件夹的,郁闷,看来得自己动手了。
网上找的:Set fd = Application.FileDialog(msoFileDialogFolderPicker)
但只能打开文件夹,据我对VB的了解,两者应该是在方法中的参数上有所区别,经过再一的查找,终于找到了,将上述代码改为:Set fd = Application.FileDialog(msoFileDialogOpen)。嘿嘿,稍作修改以后,成功。
批注的内容和人很容易,直接在对象的后面点就能点出属性来,于是我迅速的添加上该功能并迫不及待的运行起来。结果出来后我发现问题了,批注的作何和批注人都可以得到,但是批注的位置却没有属性能能够得到。
其实,这部分也是这次开发最耗费时间的部分,我自己些的代码基本上都是在这部分了(不知道为什么网上竟然没有这部分的代码)。
这个时候的思维方向我认为是很重要的,要是走错了路,在往回走就更困难了,但没准也是个捷径,不知道了,反正我是按如下方式思考的:
要求搜索的是批注所在的章节号,章节是样式的一种,记得word中有可以搜索样式的功能,具体怎么操作就还的上网查了,这个通用的查找功能当然很容易找到,也有说用宏来录制一段看代码的,我就两种方式都试验了一下,最后得到了如下代码:
With appword.Selection.Find
.Style = appword.ActiveDocument.Styles("标题 1")
.Forward = False
.Wrap = wdFindStop
.MatchByte = True
End With
这里我采用的是从批注位置向上查找的方法,原因当然是批注所在段落的标题一定在批注的上面啦,“哎,这个你咋还给我们解释呢,上火”。别急,下面就是我解释的原因了,查找的时候大家可能都遇到过这种情况,比如字符串“aaabbb”,我想查找“ab”,但是关键是我现在鼠标的位置就是在“ab”这个字符串的中间,这样,查找的结果就是找不到字符串“ab”。我举这个例子就是说,当你在标题中打上批注的话,他找到的就是上一个章节的标题,这样错误就严重了,不是有那么一句名言吗“没有总比错误好”。对啊,告诉人家错了地方,还不如直接就说不知道。找到问题了,接下来就让我们来解决这个问题,还是按我们的方式,先想想和我们以前知识的积累有没有想关联的,必经我们已经搞了1年多的计算机了。
其实想想也很好解决,只要让光标焦点移到字符串的后面,就可以查到所要查找的位置了,接下来的关键就是在word里用vba怎么定制光标的位置。信息多了还真就是个麻烦事,在网上搜了很长时间,才找到一篇非常理想的文章,当然对于这么来之不易的文章我当然要搜藏了,在我前几篇文章里有全文的转帖。既然解决了,当然通过.selection就可以获得查到的标题了。这里还有一个问题,就是如何判断标题的级别,比如我要是批注了第二段,怎么能确定上一级标题就是“标题 1”呢,我想了一个很土的办法就是判断标题所在的行数,每次都查出来3级的标题,然后在比较他们行号的大小,将最大行号的标题作为最后显示的标题。恩,标题问题到这基本就完成了,再执行一下程序,完事?还是差了那么一点点,执行的结果中发现,标题只有标题的内容,没有标题的编号,这可不好办啊,接下来我们就来解决编号问题。见代码中文件。
问题都解决了,最后当然要用同事给的模板试一下了,结果发现,在插入行的时候并没有增加,而是将下面的行给覆盖了,这个也不难解决,录一小段宏看看,呵呵,代码都放在那了,就等你去取了。所有东西都结束了,最后是要在执行一下格式刷,将格式整理一下,大功告成。