ChatGPT搞砸了~,如何使用VBA导出Word文档中的图片

今年大火的ChatGPT似乎无所不能,但是它的确不是万能的,咱们来试试。
在这里插入图片描述

提供的代码根本无法运行,继续问,换了个代码,非常不幸的是–还是不能用。
在这里插入图片描述

Word VBA中并没有内置的方法可以直接导出图片,ChatGPT没有正确的答案也是可以理解的。

示例代码如下。

Sub ExportInlineShps()
    Dim i As Integer
    Dim iShpCnt As Integer
    Dim arrScale()
    With ActiveDocument
        iShpCnt = .InlineShapes.Count
        If iShpCnt > 0 Then
            ReDim arrScale(1 To 2, 1 To iShpCnt)
            For i = 1 To iShpCnt
                With .InlineShapes(i)
                    arrScale(1, i) = .ScaleHeight
                    arrScale(2, i) = .ScaleWidth
                    .ScaleHeight = 0.1
                    .ScaleWidth = 0.1
                End With
            Next
            For i = 1 To iShpCnt
                sSaveImg .InlineShapes(i), .Path & "\" & i & ".png"
            Next
            For i = 1 To iShpCnt
                With .InlineShapes(i)
                    .ScaleHeight = arrScale(1, i)
                    .ScaleWidth = arrScale(2, i)
                End With
            Next
        Else
            MsgBox "文档中没有图片"
        End If
    End With
End Sub

【代码解析】
第6行代码获取活动文档中图片对象(InlineShape)的个数。
第7行代码判断是否存在图片对象,如果不存在图片,第27行代码将显示提示消息框。
第8行代码重新声明数组arrScale用于保存图片对象的缩放比例。
第9~16行代码将图片对象的缩放比例保存在数组arrScale中,并设置图片对象的缩放比例为0.1。

注意:Word文档中的图片较多时,部分图片对象的.Range.WordOpenXML属性返回值中缺少Base64格式的图片内容(如果路过的高手知道其原因,请留言赐教。),导致无法导出图片。根据目前测试,减小文档图片显示尺寸,可以解决图片无法导出的问题,并且不影响导出图片的分辨率。

第17~19行代码调用sSaveImg过程导出图片对象。
第20~25行代码恢复图片显示比例。

Sub sSaveImg(ByVal objShp As InlineShape, ByVal strFullPath As String)
    Const TAG_S = "<pkg:binaryData>"
    Const TAG_E = "</pkg:binaryData>"
    Dim objNode As Object 'MSXML2.IXMLDOMElement
    Dim lngStart As Long, lngEnd As Long
    Dim bytImage() As Byte
    Dim strXML As String
    Dim rngShp As Range
    strXML = objShp.Range.WordOpenXML
    lngStart = InStr(strXML, TAG_S)
    If lngStart = 0 Then
        MsgBox "无法定位图片数据"
        Exit Sub
    Else
        lngStart = lngStart + Len(TAG_S)
        lngEnd = InStr(lngStart, strXML, TAG_E)
        strXML = Mid$(strXML, lngStart, lngEnd - lngStart)
        Set objNode = CreateObject("MSXML2.DOMDocument").createElement("b64")
        objNode.DataType = "bin.base64"
        objNode.Text = strXML
        bytImage = objNode.nodeTypedValue
        Open strFullPath For Binary As #1
        Put #1, 1, bytImage
        Close #1
        Set objNode = Nothing
    End If
End Sub

【代码解析】
第一个参数为InlineShape,即Word中的图片,第二个图片是图片文件的全路径。
第2~3行代码定义图片对象XML起始标签和结束标签。
第9行代码获取图片对象的XML代码。
第10行代码查找XML起始标签。
如果无法定位XML起始标签,第12行代码将显示提示消息框。
如果成功定位XML起始标签,第13行代码将获取图片对象(Base64编码)的起始位置。
第16行代码查找XML结束标签。
第17行代码提取图片对象(Base64编码)的XML代码。
第18行代码创建MSXML2.DOMDocument对象,并增加一个节点。
第19行代码设置数据类型为bin.base64
第20行代码将图片对象(Base64编码)的XML代码赋值给节点。
第21行代码读取结点的nodeTypedValue属性,并保存在Byte数组中。
第22~24行代码将图片对象保存为硬盘文件。
第25行代码释放对象变量占用的系统资源。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以前用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.如果文件夹已有相同名字的文件,则后面的文件会覆盖原来的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注VB编程开发20年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值