Word VBA丨一键导出文档所有图片

不知道你有没有遇到这种情况:

写完论文正在做答辩 PPT,而 PPT 中的大部分内容都是 Word 论文中的图片;做实验的截图都保存在 Word 文档中,而图片需要做进一步处理,比如重点标注……

如果频繁遇到这种需要「从Word文档批量提取图片」的情况,怎么办?

这里我通过编写 VBA 代码,轻松实现这个功能:

完整代码见文末。

如果你想了解代码是如何实现的,可以继续往下看。

手工实现法

通常来说,批量提取 Word 中的图片,有两种方法:一种是另存为网页格式,另外一种则是将它作为压缩文件进行解压,提取其中的媒体元素(图片)

当然,要想通过 VBA 实现这个功能,我们首先看一下正常的操作是什么,然后用 VBA 代码来“复述”一下就可以了。

1丨另存网页法

我们打开一个 Word 文档,另存为,在保存的文件类型中,选择网页格式,注意不是单网页形式:

接着,我们就可以在保存的路径下,看到自动生成的一个 XXXX.files 的文件夹,打开此文件夹,就可以看到我们保存好的图片了:

不过,Word 中的图片,在这里你会看到两个,一个是小的缩览图需要删掉,另外一个才是清晰的图片。

2丨压缩文件法

其实我们的 Word 也是一种压缩文件,里面存放图片、文字、版式等信息,因此,我们就可以把它视作压缩文件来打开。

当然,这里有两种方法,一种是选择打开方式——解压软件:

另外一种,则是先将文档的后缀名更改为.zip,然后使用默认程序打开。

我们解压这份文件,在解压后的文件夹下,我们可以看到有很多的文件与文件夹,我们依次打开「Word-media」就可以找到提取的图片了。

每个 Word 图片只保存了一张,不用我们自己再去挑选,并且,图片质量上会更好一些。

VBA 实现法

好了,那么接下来就是 VBA 的环节了,如何通过 VBA 代码实现这一过程。

这里由于第一种方式,产生的图片数量不等,且图片格式不确定,不好实现完全自动化,这里只考虑第二种方式。

首先,要在 VBA 中解压文件,我们可以使用 shell Folder 对象的 CopyHere 方法:

其中 vItem 参数可以是一个文件的完整路径,也可以是一个 FolderItem 对象,或者 FolderItems 集合对象。

特别要注意的是,vItem 参数一定要以 Variant 类型传入,否则会没有任何响应。

vOptions 参数可以设置一些显示模式,比如设置为 4,在解压缩 zip 文件时不会显示进度条。设置为 16,如果弹出对话框将默认全选是。

经过测试,这段代码无法直接解压把后缀名为 .docx 的文件。因此,我们需要先重命名文档,可以使用 VBA 中的 Name As 语句:

当然,我们这里是无法对当前激活的文档重命名,因此,我们可以先拷贝一份文档,可以使用 Word.documents 的 saveas2 方法。

需要注意,需要保存为docx格式,否则之后解压出的文件可能会与这里的程序不同

这里与 Excel 的 VBA 不同,没有后台偷偷保存的方法,SaveAs2 方式保存后,Word 会打开另存后的文档,导致该文件被锁定,无法使用上面的解压方法。

因此,我们需要先关闭自动打开的文档,并打开原始文档:

通过上面这段代码,我们已经可以将文件进行解压了,但这里的保存路径是写在代码中的,不能由用户自定义,不是特别方便,因此,我们可以使用 VBA 的文件夹选择对象,由用户做出选择:

这样,解压后的所有文件,就可以保存到用户选择文件夹中了。

但我们会发现,这里的文件夹比较多,用户无法一眼看到导出的图片,因此,我们可以删除那些无关的文件及文件夹。

删除文件可以使用 kill 方法,而删除文件夹可以使用 RmDir 方法。但删除文件夹方法,如果文件夹内有文件,会报告错误。因此,我定义了这样的一个函数,你可以删除文件夹及里面的文件:

另外,我们的图片文件夹层级比较深,我们需要把它移动到用户指定的文件夹,需要使用文件对象中的 move 方法,同样,我们定义一个通用函数:

为了进一步提升用户体验,我们可以在程序运行完成后,提示用户操作已完成,并打开对应的文件夹:

至此,再稍微完善一下细节,一个比较通用的「批量导出当前文档的图片」工具就做好了。

完整代码

整体代码如下:

完结,撒花!

这样,只需要打开任何一个文档,使用快捷键 Alt +F11 打开 VBA 编辑器,在左侧找到 normal 这个模板文件,右键新建模块,将上面的代码拷贝进去:

之后,返回 Word 页面,按Alt + F8,打开执行宏窗口,选择运行 ExtractPicture 就可以了:

之后使用也仅需重复第二个执行步骤。当然,也可以把这个功能添加到自定义选项卡中,或者可以学习一下 Ribbon 自定义。之后如果有时间,我也会专门讲解。

最后

如果你想批量导出多个文档的图片,则可以在这部分代码前,添加用户选择文件的对话框,并且,循环用户打开的文件,然后执行这里的操作,最后,关闭打开的文档,继续下一循环。

如果你想夸夸我或者有想吐槽的,可以到我的个人公众号中找我~

资源下载: