通过VBA导出word文档中的图片

一、问题重述:

工作中,经常有同事把新闻的照片贴在word文档中发过来,需要把照片一张张的转存成图片。

二、原始方法:

  1. 在文档中的照片上,右键,图片另存为……
  2. 把文档,按F12,另存为网页文件,然后在生成的文件夹中,去找(注意,要忽略同名的缩略图)
  3. 把docx文件直接改为zip文件,解压,在解压后的文件里面,去找照片。

三、VBA思路

  • 1.存储当前文档的完整名称:方便之后重新打开
  • 2.在文档的同一目录下,以word文件名,新建一个文件夹,如“XXXX文档_图片”。
  • 3.保存当前文档,然后另存一份来操作。  
  • 4.设置zip文件名,文档副本同名
  • 5.把docx文件命名为zip文件 
  • 6.解压另存的zip文件
  • 7.收拾收拾,把导出的图片移动出来,同时删除第6步建立的文件夹,删除zip文件
  • 8.打开图片文件所在目录

四、实现效果

会在当前文档的目录下,建一个文件夹,然后把导出的图片,存在在此文件夹里面。

五、原代码奉上,欢迎大家提出意见或修改的建议

Option Explicit
'批量导出单张图片
Sub ExtractPicture()
    Dim docFullName As String
    '1.存储当前文档的完整名称:方便之后重新打开
    docFullName = Word.ActiveDocument.FullName
    '2.在文档的同一目录下,以word文件名,新建一个文件夹,如“XXXX文档_图片”用于保存导出的照片及后面的一些临时文件
    Dim fileSavePath As String
    fileSavePath = ActiveDocument.Path & "\" & Left(ActiveDocument.Name, InStrRev(ActiveDocument.Name, ".") - 1) & "_图片\"
    If Dir(fileSavePath, vbDirectory) = "" Then MkDir (fileSavePath) '如果文件夹不存在,就新建一个

    Word.Application.ScreenUpdating = False '关闭屏幕刷新
    '3.保存当前文档,然后另存一份来操作。
    ActiveDocument.Save   '保存当前文档
    Dim CopyFileFullName As String
    Dim saveAsFileName As String
    saveAsFileName = Format(Now, "yyyymmddhhmmss")
    Word.ActiveDocument.SaveAs2 fileName:=fileSavePath & saveAsFileName & ".docx"
    CopyFileFullName = fileSavePath & saveAsFileName & ".docx"   '将副本的文件完整路径临时存储,方便之后调用解压
    Word.ActiveDocument.Close '关闭另存为后的文档,打开源文档
    Word.Documents.Open docFullName
    '4.设置zip文件名,文档副本同名
    Dim zipFullName As Variant  '使用变体变量
    zipFullName = fileSavePath & saveAsFileName & ".zip"
    '5.把docx文件命名为zip文件
    Name CopyFileFullName As zipFullName

    '6.解压另存的zip文件
    Dim strDate As String, FileNameFolder As Variant
    '创建一个文件夹来装临时文件,方便后面一并删除
    FileNameFolder = fileSavePath & "导出图片\"
    '创建名为 FileNameFolder 的文件夹
    MkDir FileNameFolder
    '解压文件
    Dim oShell As Object
    Set oShell = VBA.CreateObject("shell.application")
    oShell.Namespace(FileNameFolder).CopyHere oShell.Namespace(zipFullName).items, 4 + 16   '解压缩文件到指定位置
    Word.Application.ScreenUpdating = True '恢复屏幕刷新
    '7.收拾收拾,把导出的图片移动出来,同时删除第6步建立的文件夹,删除zip文件
    Call moveFile(FileNameFolder & "\word\media\*.*", CStr(fileSavePath))
    Call delete_folder(FileNameFolder)
    Kill fileSavePath & saveAsFileName & ".zip"
    '8.打开图片文件所在目录
    Shell "explorer.exe " & fileSavePath, vbNormalFocus
End Sub
'把指定文件移动到新的文件夹中
'newFilePath无需添加"\",oldfile 可以使用通配符
Public Sub moveFile(oldFile As String, newFilePath As String)
    Dim oFso As Object
    Set oFso = CreateObject("Scripting.FileSystemObject")
    oFso.moveFile oldFile, IIf(Right(newFilePath, 1) = "\", Left(newFilePath, Len(newFilePath) - 1), newFilePath)
End Sub
'删除文件夹及下面的所有文件和文件夹
Public Function delete_folder(sPath)
    sPath = IIf(Right(sPath, 1) = "\", Left(sPath, Len(sPath) - 1), sPath)
    Dim oFso As Object
    Set oFso = CreateObject("Scripting.FileSystemObject")
    Dim oFolder As Object
    If Len(sPath) Then
        '强制删除,参数True表示不管是否只读的文件都删除
        oFso.DeleteFolder sPath, True
    End If
End Function

六、感谢

通过以下作者提供的代码,进行的修改完善。

Word VBA丨一键导出文档所有图片 - 哔哩哔哩 (bilibili.com)

如何用vba删除某个文件夹及其子文件和所有文件? - VBA - ExcelOffice【微信公众号:水星Excel】

以前用Excel2003做了些宏,在网上还有不少粉丝,因一些功能在Excel2010中无法使用,故重新整理,欢迎指正; 本Excel中的宏在Excel2010中测试表现出色; 运行宏前,要保证EXCEL没有禁用宏。 Michael Ho QQ: 9900060 ----------------------- 本Excel有以下功能: 插入图片1 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet2到新工作簿,并插入你所选文件夹中的全部JPG图片到B列,对应的图片名自动填到C列; 3.图片的大小会自动适应Sheet2的B3单元格,因此可以在点击执行前调整Sheet2的B3单元格的大小来控制插入图片的大小。 -------- 插入图片2 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet3到新工作簿,并插入你所选文件夹中的全部JPG图片制作图册,对应的图片名自动填到图片下方; -------- 插入图片3 如果用户自己的Excel文件中有一列是型号,该宏可以插入指定文件夹里以型号命名的JPG图片到另一列; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+I (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏InsertPic3); 4.然后会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 5.在弹出的对话框中指定型号在第几列,图片要插入到第几列,以及从哪一行开始; 6.图片的大小会自动适应你设定的第一行要插入图片的单元格,因此提前调整那个单元格的大小可以控制插入图片的大小。 ------------- 删除活动工作表中所有图片 Ctrl+d 删除活动工作表里所有的JPG图片,(不一定是本工作簿中的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+d (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏DelPic); ------------- 导出活动工作表中被选中的一张JPG图片 Ctrl+e 导出活动工作表中被选中的一张JPG图片,(不一定是本工作簿中的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.请选中一张要导出图片; 4.在你的文件中按Ctrl+e (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏OutputOnePic); 5.在弹出的对话框中指定图片保存的名字; 1.不管图片在Excel中是否被缩放过,导出图片是按图片的原始尺寸进行保存。 2.在桌面上会自动新建一个"OutputPic"的文件夹,导出图片将会存在那个文夹里; 3.如果文件夹中已有相同名字的文件,则后面导出的文件会自动加上(v1), (v2), (v3)... ------------- 导出活动工作表中所有JPG图片 Ctrl+f 导出活动工作表中所有JPG图片,并且图片名自动使用指定列中的图片名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+f (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏OutputAllPic); 4.在弹出的对话框中指定图片所在列,图片名所在的列; 1.不管图片在Excel中是否被缩放过,导出图片是按图片的原始尺寸进行保存; 2.在桌面上会自动新建一个"OutputPic"的文件夹,所有导出图片将会存在那个文夹里; 3.如果文件夹中已有相同名字的文件,则后面导出的文件会自动加上(v1), (v2), (v3)... ---------------- 对指定文件夹中的JPG图片进行重命名 Ctrl+r 利用活动工作表中的所有图片的旧名与新名的对照,对指定文件夹中JPG图片进行重命名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+r (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏RenamePic); 4.在弹出的对话框中指定图片旧名所在列和图片新名所在的列; 1.可以结合插入图片的宏,将所有图片的旧名输入到Excel中,再在另一列中填上新图片名,然后使用该宏。 2.如果顺利运行,会在原来那个文件夹下面新建一个叫“New”的子文件夹,所有重命好名的图片会自动放入子文件夹里; 3.如果文件夹中已有相同名字的文件,则后面的文件会覆盖原来的文件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值