ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2280|回复: 18

[求助] VBA代码能再Excel2016版本上完美运行,为什么在Excel 365版本上却运行不.

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-1 00:54 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我有一个大的表格,里面有几百张图片,需要把Excel里的图片都导出来保存在文件夹里,并且图片要根据表格里图片对应到A列单元格的值来给图片命名,所以写了个VBA代码来完成,代买如下:
Sub exportpictures()

Dim i As Long
Dim pic
Dim p As String
Dim path As String

path = InputBox("请输入要保存图片的路径:", "保存路径", ThisWorkbook.path)

  For i = 1 To Sheet1.Shapes.Count
    Set pic = Sheet1.Shapes(i)
     If pic.Type = 11 Or pic.Type = 13 Then
        pic.Name = pic.TopLeftCell.Offset(0, -1).Value
        p = path & "\" & pic.Name & ".jpg"
        pic.CopyPicture
        With ActiveSheet.ChartObjects.Add(0, 0, pic.Width, pic.Height).Chart
          .Paste
          .Export p, "jpg"
          .Parent.Delete
        End With
    End If
  Next
End Sub

本来这个代码是在家里摸索了半天倒腾出来的,家里的Excel版本是2016版,试过了也可以完美运行,但是回到公司,用的是Excel 365版本,反而是运行不了。主要出现几个问题:
1. 报错:“copypicture”方法作用于对象“shape”时失败“, 改成copy也不行。
2. 用On Error Resume Next 语句强行运行,部分图片导出来后,打开是一片空白的,没有图像在里面,但在2016版本上是没这个问题的。

搞了半天,实在搞不定,只能上来这里,请教一下各位大神,看看有没有办法可以完美解决呢?或者那个大神能够提供另外一个办法能够把图片完美导出的,谢谢

附上简化后的附件。


款式表.xlsx.zip

88.77 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2023-4-1 08:41 | 显示全部楼层
image.png 好像要把这个打开,你试试

TA的精华主题

TA的得分主题

发表于 2023-4-1 11:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 vistababy 于 2023-4-1 11:46 编辑

楼主,代码在excel2013也不起作用呢。。也不出错,也不导出图片。你的文件、我的文件,都试过
我用代码MsgBox Sheet1.Shapes.Count查了下,显示0,说明找不到图片。

TA的精华主题

TA的得分主题

发表于 2023-4-1 12:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-2 15:50 | 显示全部楼层
vistababy 发表于 2023-4-1 11:09
楼主,代码在excel2013也不起作用呢。。也不出错,也不导出图片。你的文件、我的文件,都试过
我用代码Msg ...

那我也不太清楚是哪里出问题了,但这个代码,我再2016是可以的,这个“shape"的图形的语句,感觉是各个版本都会改还是怎么回事,头疼。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-2 15:51 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-4-2 17:58 | 显示全部楼层
thomasxian84 发表于 2023-4-2 15:50
那我也不太清楚是哪里出问题了,但这个代码,我再2016是可以的,这个“shape"的图形的语句,感觉是各个版 ...

楼主,问题解决了,我把所有的sheet1改成ActiveSheet就没有问题了。
但拿你的文件做试验,导出图片只有2张,一个是:连衣裙.jpg,另一个是:长裤.jpg,原来是因为你的类目只有连衣裙、长裤,导致另外3张图片导出时覆盖,所以我改了一下代码,增加了“款号”在后面,就能导出5张图片了。 同时参考了4楼的意见加了一行代码。完美了!
另外,我还改了下你的保存路径为:ActiveWorkbook.path,这样才能对应xls文件所有目录,否则thisworkbook.path每次都指向了C:\Users\用户名\AppData\Roaming\Microsoft\Excel\XLSTART这个文件夹,感觉不太对。


Sub 导出所有图片()
On Error Resume Next


Dim i As Long
Dim pic
Dim p As String
Dim path As String

path = InputBox("请输入要保存图片的路径:", "保存路径", ActiveWorkbook.path)

  For i = 1 To ActiveSheet.Shapes.Count
    Set pic = ActiveSheet.Shapes(i)
     If pic.Type = 11 Or pic.Type = 13 Then
        pic.Name = pic.TopLeftCell.Offset(0, -1).Value & pic.TopLeftCell.Offset(0, -3).Value
        p = path & "\" & pic.Name & ".jpg"
        pic.CopyPicture
        With ActiveSheet.ChartObjects.Add(0, 0, pic.Width, pic.Height).Chart
          .Parent.Select
          .Paste
          .Export p, "jpg"
          .Parent.Delete
        End With
    End If
  Next
End Sub




截屏_2023-04-02_17-53-54.png

TA的精华主题

TA的得分主题

发表于 2023-4-2 18:15 | 显示全部楼层
本帖最后由 vistababy 于 2023-4-2 18:40 编辑

7楼的代码是没有问题了,但我又发现了一个问题,就是导出图片的大小和当时Excel的视图显示比例有关,把表格界面缩小,导出的图片就很小,才几KB,和蚂蚁一样。
你们不信试一下,把页面显示比例设置为25%,再运行上面的程序,导出的图片只有几KB。
而我用另存为网页的方式,进文件夹看,里面的图片尺寸、文件大小都是大很多的。所以有问题。
于是我想到了很奇怪的一招。就是导出前将显示比例调为400%,图片大多了。完美!

截屏_2023-04-02_18-40-01.png




TA的精华主题

TA的得分主题

发表于 2023-4-2 18:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助



当然想更省事的话,可以在for i=1那句前面加上:

Application.ScreenUpdating = False
oldzoom = ActiveWindow.Zoom
ActiveWindow.Zoom = 400


在保存完后的最末尾一行Next后面加上:

Application.ScreenUpdating = True
ActiveWindow.Zoom = oldzoom


就更完美了。不但速度快了,而且看不到任何界面缩放的变化。

TA的精华主题

TA的得分主题

发表于 2023-4-2 21:19 | 显示全部楼层
我还有方法2,就是在导出前将图片放大,导出后缩小。图片也能变大变清晰一些。对排版没有影响。


代码如下图,导出前放大5倍,导出后缩小5倍,等于还原。记得显示比例到400%的代码要取消。

截屏_2023-04-02_21-17-15.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 18:43 , Processed in 0.043307 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表