![e4c2cae6bcb7addb1b64785223260173.png](https://img-blog.csdnimg.cn/img_convert/e4c2cae6bcb7addb1b64785223260173.png)
在《全民一起VBA 实战篇》中,我们讲到过怎样使用 Acrobat 官方控件,在VBA程序里显示和浏览 PDF 文件。
![cf5d21afbcd4954d94308a12ebf8af64.png](https://img-blog.csdnimg.cn/img_convert/cf5d21afbcd4954d94308a12ebf8af64.png)
不过仅仅浏览PDF还不能满足需要,因为随着 PDF 文件应用越来越广泛,把 PDF 中的表格读取到Excel现在也已经成为我们最常见的任务。事实上,Acrobat的官方控件本身就支持 PDF 内容读取,而且毫无疑问,其解读能力是最权威、最准确的。但遗憾的是,只有安装了价格昂贵的专业版Acrobat后,才能使用这个控件。
![0311544957ee475a0d18db04d38c1473.png](https://img-blog.csdnimg.cn/img_convert/0311544957ee475a0d18db04d38c1473.png)
那么我们这些穷人该怎么办呢?如果不敢用盗版,最好的选择当然是 ——
![8fe3a84fb6ff370218e544358b0a3268.png](https://img-blog.csdnimg.cn/img_convert/8fe3a84fb6ff370218e544358b0a3268.png)
不过远水不解近渴,何况我们要在《全民一起玩Python 实战篇》中才详细介绍PDF处理。所以今天教各位 VBA 学友一个“旁门技巧”—— 用 Word 做二传手!
众所周知:从Word2013版开始,Word就可以直接打开PDF文件、转换成Word格式。而我们在《全民一起VBA 提高篇》中又讲过,Excel VBA 中可以创建Word应用、并控制它去打开文件,所以一条线索就非常清晰了:
- 在Excel中编写VBA程序
- 在程序中创建Word对象
- 让Word对象读取PDF文件
- 让Word对象把读到的内容复制一下
- 让Excel单元表对象执行粘贴操作
看起来顺理成章,于是现在就可以做个试验。
首先,找一个PDF表格文件。这里为了演示方便,我们的文件内容很简单,就是一行标题加一个表格:
![bb16d48e4840c65d0876a84bcd11b7c2.png](https://img-blog.csdnimg.cn/img_convert/bb16d48e4840c65d0876a84bcd11b7c2.png)
然后,我们在Excel中新建一个模块,并用下面的代码打开和操作Word对象。
![88dee7a3d754707253cba56de7d8248e.png](https://img-blog.csdnimg.cn/img_convert/88dee7a3d754707253cba56de7d8248e.png)
上面代码并不复杂,完全都是《全民一起VBA 提高篇》第34回“Office软件互相调用,VBA技术处处开花” 中介绍过的内容,只不过打开的不是Word文件而是PDF而已。那么实际执行会怎样呢?如果没有系统配置方面的问题,稍等片刻就会看到 d:/vbademo/pdf/1.pdf 这个文件的第一行文字被顺利写入B2单元格:
![8d2e2bc8e96ba503f23ae9f2367843ae.png](https://img-blog.csdnimg.cn/img_convert/8d2e2bc8e96ba503f23ae9f2367843ae.png)
不过这里需要说明一点:读取转换PDF涉及很多系统环节,所以难免会发生一些异常错误。假如我们的程序在运行中,因为异常而导致没有执行最后的关闭Word操作,那么被打开的PDF文件可能就无法及时释放,使得下一次再运行程序读取PDF时,发生程序死锁等问题。所以这里我们加一个简单的错误处理语句,希望在发生错误时也能正常关闭Word程序。
![28d881c3ab39afc4a387e74f75f4751e.png](https://img-blog.csdnimg.cn/img_convert/28d881c3ab39afc4a387e74f75f4751e.png)
初战告捷,再接再厉,接下来就看看能否把里面的表格也搞定!在《全民一起VBA 实战篇》专题七第一回 “Word操作也能编程优化,Table对象可查所有表格” 中 ,我们介绍了怎样使用Word的Table对象处理表格,所以下面的代码大家应该看着比较熟悉:
![c3ef2646765b1cc8a4a4be9da0d7ee2c.png](https://img-blog.csdnimg.cn/img_convert/c3ef2646765b1cc8a4a4be9da0d7ee2c.png)
详细过程看看注释应该可以理解,那么效果怎样呢?执行一下,果然不错:
![67082c758501c65801c4eea6e610356b.png](https://img-blog.csdnimg.cn/img_convert/67082c758501c65801c4eea6e610356b.png)
到这里,基本技术点都已清晰。把这个代码套上循环判断、以及我们早已熟悉的各种VBA文件表格处理套路,就能够完成各种批量处理技术。比如:假设我的文件夹中有多个格式相同的PDF文件,都是上面这种 “标题 + 一张表格” 的模式:
![413e1a13fa1c21c53a9b9670512f6229.png](https://img-blog.csdnimg.cn/img_convert/413e1a13fa1c21c53a9b9670512f6229.png)
那么使用下面的代码,就可以自动读取所有这几个pdf,并在Excel中给每个pdf创建一张工作表、表名就是该pdf第一段的标题;同时在每张表的B2单元格处复制pdf里面的表格。(为了简化演示,这里假设pdf文件名都是顺序数字,从而不必使用 dir 函数或 fso 对象)
![4e654e43e21ce9685c5bf8014bc06b7f.png](https://img-blog.csdnimg.cn/img_convert/4e654e43e21ce9685c5bf8014bc06b7f.png)
点击运行,静等片刻,三张可爱的工作表就在那里(第I列显示#,是因为截图时忘了调整列宽,加大列宽即可看到数字):
![86b6772681b0313759e342869657edff.png](https://img-blog.csdnimg.cn/img_convert/86b6772681b0313759e342869657edff.png)
总结一下,其实这个技巧就是在没有专业控件的情况下,把Word当成了一个“PDF读取控件”。虽然效果不一定有Acrobat自家控件那么完美,但毕竟微软的产品也不是盖的。所以虽然本方法是“旁门”技巧,但如果用熟(特别是各种异常错误的处理),解决起实际问题还是很给力的。
所以还是那句话:动脑筋综合运用我们学过的各种小技巧,组合在一起往往就能解决大问题!