Excel VBA实现从多篇Word文档内抓取文本框内内容(书接上一篇博客)
一、前情提要
我在上一篇博客《VBA摘取Word图形(Shapes)内文字》里验证了遍历doc文档内图形——尤其是文本框内内容的可行性。指出了文本框是形状(shape)而不是段落(paragraph)需要区别对待这一点。内容很简单直白,有兴趣的读者老爷可以移步先了解下。但拙作的局限性很明显:
- 上一篇内容是在Word VB里实现的,和在Excel里打开相比缺少了创建word对象模型的步骤;
- 仅在单篇内实现了摘取,完全没有涉及多文件批量操作,显然也不够实用;
- 样本规模太小很多问题暴露不出来,量大了就会冒泡。
基于以上原因,希望能用今天记录的实践补上些许遗憾。同之前一样,声明在先:不才脚本水平很菜,代码风格冗长且乏巧思(很多本来嵌套在一起就可以实现的功能非要分步骤重复操作),贻笑大方之处还请不吝指点~
二、应用场景&需求目标
文件夹 A 内有Word文档 n 篇,每篇内皆有包含了文章作者信息的文本框。需要逐个打开这些文件,然后把作者信息拷贝到Excel表格里面。由于工作量大,希望使用VB脚本实现。
三、涉及到的主要技术点
循环遍历之类就不说了,只说Excel跨界到Word时候的常见的:
- 在Excel里打开文件夹,涉及FSO(文件对象模型)操作
- 在Excel里打开Word,涉及Application对象(Word)操作
- 取出的各类数据需要临时存储容器,涉及一维数组的应用
建议搜下微软官方文档,市面上书籍基本都是就着Excel将Excel或者就着Word讲Word,参考意义有限。
四、代码环节
仅展示从文件夹里读取各文档地址,然后逐个打开取Shape文字的部分……后面把存有各文档shape文字放进Worksheet的部分就不写了以免稀释重点。上原文👇:
Rem 整体思路:
Rem 1. 先用FSO把待收集信息的文件的全地址从文件夹里面读出来,存入数组 。重点:FSO对象操作
Rem 2. 有了每个文件的完整地址就可以遍历打开。重点:Application对象(Word)的操作
Rem 3. 打开以后直奔word文档的形状内文字而去,把所有形状里的文字都读出来。重点:从形状里面取文字
Rem 4. 对读取结果进行截取,把作者信息部分截取出来。重点:穷尽可能出现的定位词方便切片
Rem 5. 把读取出来的结果存入数组,最后写进Excel表的目标列。重点:数组→Range的操作
Rem 注:其实完全可以把前面四步套叠在一起,FSO遍历到一个文件地址就Word对象打开操作,分步完全是迁就个人比较笨的现实
Sub AuthorInfo_Gathering()
Application.ScreenUpdating = False '关闭屏幕更新避免频繁闪烁
Application.DisplayAlerts = False '关闭提示
Dim target_ws As Worksheet '最终要写入抓取信息的表