Word VBA丨一鍵導(dǎo)出文檔所有圖片

不知道你有沒有遇到這種情況:
寫完論文正在做答辯 PPT,而 PPT 中的大部分內(nèi)容都是 Word 論文中的圖片;做實(shí)驗(yàn)的截圖都保存在 Word 文檔中,而圖片需要做進(jìn)一步處理,比如重點(diǎn)標(biāo)注……
如果頻繁遇到這種需要「從Word文檔批量提取圖片」的情況,怎么辦?
這里我通過(guò)編寫 VBA 代碼,輕松實(shí)現(xiàn)這個(gè)功能:

完整代碼見文末。
如果你想了解代碼是如何實(shí)現(xiàn)的,可以繼續(xù)往下看。
手工實(shí)現(xiàn)法
通常來(lái)說(shuō),批量提取 Word 中的圖片,有兩種方法:一種是另存為網(wǎng)頁(yè)格式,另外一種則是將它作為壓縮文件進(jìn)行解壓,提取其中的媒體元素(圖片)
當(dāng)然,要想通過(guò) VBA 實(shí)現(xiàn)這個(gè)功能,我們首先看一下正常的操作是什么,然后用 VBA 代碼來(lái)“復(fù)述”一下就可以了。
1丨另存網(wǎng)頁(yè)法
我們打開一個(gè) Word 文檔,另存為,在保存的文件類型中,選擇網(wǎng)頁(yè)格式,注意不是單網(wǎng)頁(yè)形式:

接著,我們就可以在保存的路徑下,看到自動(dòng)生成的一個(gè) XXXX.files 的文件夾,打開此文件夾,就可以看到我們保存好的圖片了:

不過(guò),Word 中的圖片,在這里你會(huì)看到兩個(gè),一個(gè)是小的縮覽圖需要?jiǎng)h掉,另外一個(gè)才是清晰的圖片。
2丨壓縮文件法
其實(shí)我們的 Word 也是一種壓縮文件,里面存放圖片、文字、版式等信息,因此,我們就可以把它視作壓縮文件來(lái)打開。
當(dāng)然,這里有兩種方法,一種是選擇打開方式——解壓軟件:

另外一種,則是先將文檔的后綴名更改為.zip,然后使用默認(rèn)程序打開。
我們解壓這份文件,在解壓后的文件夾下,我們可以看到有很多的文件與文件夾,我們依次打開「Word-media」就可以找到提取的圖片了。

每個(gè) Word 圖片只保存了一張,不用我們自己再去挑選,并且,圖片質(zhì)量上會(huì)更好一些。
VBA 實(shí)現(xiàn)法
好了,那么接下來(lái)就是 VBA 的環(huán)節(jié)了,如何通過(guò) VBA 代碼實(shí)現(xiàn)這一過(guò)程。
這里由于第一種方式,產(chǎn)生的圖片數(shù)量不等,且圖片格式不確定,不好實(shí)現(xiàn)完全自動(dòng)化,這里只考慮第二種方式。
首先,要在 VBA 中解壓文件,我們可以使用 shell Folder 對(duì)象的 CopyHere 方法:
其中 vItem 參數(shù)可以是一個(gè)文件的完整路徑,也可以是一個(gè) FolderItem 對(duì)象,或者 FolderItems 集合對(duì)象。
特別要注意的是,vItem 參數(shù)一定要以 Variant 類型傳入,否則會(huì)沒有任何響應(yīng)。
vOptions 參數(shù)可以設(shè)置一些顯示模式,比如設(shè)置為 4,在解壓縮 zip 文件時(shí)不會(huì)顯示進(jìn)度條。設(shè)置為 16,如果彈出對(duì)話框?qū)⒛J(rèn)全選是。
經(jīng)過(guò)測(cè)試,這段代碼無(wú)法直接解壓把后綴名為 .docx 的文件。因此,我們需要先重命名文檔,可以使用 VBA 中的 Name As 語(yǔ)句:
當(dāng)然,我們這里是無(wú)法對(duì)當(dāng)前激活的文檔重命名,因此,我們可以先拷貝一份文檔,可以使用 Word.documents 的 saveas2 方法。
需要注意,需要保存為docx格式,否則之后解壓出的文件可能會(huì)與這里的程序不同
這里與 Excel 的 VBA 不同,沒有后臺(tái)偷偷保存的方法,SaveAs2 方式保存后,Word 會(huì)打開另存后的文檔,導(dǎo)致該文件被鎖定,無(wú)法使用上面的解壓方法。
因此,我們需要先關(guān)閉自動(dòng)打開的文檔,并打開原始文檔:
通過(guò)上面這段代碼,我們已經(jīng)可以將文件進(jìn)行解壓了,但這里的保存路徑是寫在代碼中的,不能由用戶自定義,不是特別方便,因此,我們可以使用 VBA 的文件夾選擇對(duì)象,由用戶做出選擇:
這樣,解壓后的所有文件,就可以保存到用戶選擇文件夾中了。
但我們會(huì)發(fā)現(xiàn),這里的文件夾比較多,用戶無(wú)法一眼看到導(dǎo)出的圖片,因此,我們可以刪除那些無(wú)關(guān)的文件及文件夾。

刪除文件可以使用 kill 方法,而刪除文件夾可以使用 RmDir 方法。但刪除文件夾方法,如果文件夾內(nèi)有文件,會(huì)報(bào)告錯(cuò)誤。因此,我定義了這樣的一個(gè)函數(shù),你可以刪除文件夾及里面的文件:
另外,我們的圖片文件夾層級(jí)比較深,我們需要把它移動(dòng)到用戶指定的文件夾,需要使用文件對(duì)象中的 move 方法,同樣,我們定義一個(gè)通用函數(shù):
為了進(jìn)一步提升用戶體驗(yàn),我們可以在程序運(yùn)行完成后,提示用戶操作已完成,并打開對(duì)應(yīng)的文件夾:
至此,再稍微完善一下細(xì)節(jié),一個(gè)比較通用的「批量導(dǎo)出當(dāng)前文檔的圖片」工具就做好了。
完整代碼
整體代碼如下:
完結(jié),撒花!
這樣,只需要打開任何一個(gè)文檔,使用快捷鍵 Alt +F11?打開 VBA 編輯器,在左側(cè)找到 normal 這個(gè)模板文件,右鍵新建模塊,將上面的代碼拷貝進(jìn)去:

之后,返回 Word 頁(yè)面,按Alt + F8,打開執(zhí)行宏窗口,選擇運(yùn)行 ExtractPicture 就可以了:

之后使用也僅需重復(fù)第二個(gè)執(zhí)行步驟。當(dāng)然,也可以把這個(gè)功能添加到自定義選項(xiàng)卡中,或者可以學(xué)習(xí)一下 Ribbon 自定義。之后如果有時(shí)間,我也會(huì)專門講解。
最后
如果你想批量導(dǎo)出多個(gè)文檔的圖片,則可以在這部分代碼前,添加用戶選擇文件的對(duì)話框,并且,循環(huán)用戶打開的文件,然后執(zhí)行這里的操作,最后,關(guān)閉打開的文檔,繼續(xù)下一循環(huán)。
如果你想夸夸我或者有想吐槽的,可以到我的個(gè)人公眾號(hào)中找我~
