ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] Excel保存单元格区域为图片(支持13种文件格式、背景透明、半透明、矢量图)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2020-11-30 22:21 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:媒体交互应用
本帖最后由 joforn 于 2020-12-2 14:02 编辑

先上测试代码:
  1. Sub TestSaveRangeToPictrue()
  2.   Dim PathName    As String
  3.   Dim FileNames() As String
  4.   Dim FileName    As String
  5.   Dim I As Long
  6.   
  7.   PathName = "T:\测试目录"
  8.   PathName = ThisWorkbook.Path & Application.PathSeparator
  9.   Debug.Print "=============开始测试文件输出==================="
  10.   
  11.   
  12.   FileNames = Split("WMF,EMF,PDF,XPS", ",")
  13.   For I = 0 To UBound(FileNames)
  14.     FileName = PathName & "SaveRangeTo" & FileNames(I) & "(矢量)." & FileNames(I)
  15.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName), "成功", "失败") & "]:保存" & FileNames(I) & "文件""" & FileName & """"
  16.     FileName = PathName & "Pictures.ZIP>矢量\SaveRangeTo" & FileNames(I) & "." & FileNames(I)
  17.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName), "成功", "失败") & "]:添加" & FileNames(I) & "文件到""Pictures.ZIP"""
  18.   Next
  19.   
  20.   FileNames = Split("BMP,PNG,ICO,JPG,TIF,TGA,SVG,GIF", ",")
  21.   For I = 0 To UBound(FileNames)
  22.     FileName = PathName & "SaveRangeTo" & FileNames(I) & "(无透明)." & FileNames(I)
  23.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName), "成功", "失败") & "]:保存" & FileNames(I) & "文件""" & FileName & """"
  24.     FileName = PathName & "Pictures.ZIP>无透明\SaveRangeTo" & FileNames(I) & "." & FileNames(I)
  25.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName), "成功", "失败") & "]:添加" & FileNames(I) & "图片到""Pictures.ZIP"""
  26.   Next
  27.   
  28.   FileNames = Split("PNG,ICO,TGA,SVG", ",")
  29.   For I = 0 To UBound(FileNames)
  30.     FileName = PathName & "SaveRangeTo" & FileNames(I) & "(背景全透)." & FileNames(I)
  31.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName, -1), "成功", "失败") & "]:保存" & FileNames(I) & "文件""" & FileName & """"
  32.     FileName = PathName & "Pictures.ZIP>透明\背景全透\SaveRangeTo" & FileNames(I) & "." & FileNames(I)
  33.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName, -1), "成功", "失败") & "]:添加" & FileNames(I) & "背景全透明图片到""Pictures.ZIP"""
  34.     FileName = PathName & "SaveRangeTo" & FileNames(I) & "(背景半透)." & FileNames(I)
  35.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName, -1, 128), "成功", "失败") & "]:保存" & FileNames(I) & "文件""" & FileName & """"
  36.     FileName = PathName & "Pictures.ZIP>透明\背景半透\SaveRangeTo" & FileNames(I) & "." & FileNames(I)
  37.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName, -1, 128), "成功", "失败") & "]:添加" & FileNames(I) & "背景半透明图片到""Pictures.ZIP"""
  38.     FileName = PathName & "SaveRangeTo" & FileNames(I) & "(整体半透)." & FileNames(I)
  39.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName, -2, 128), "成功", "失败") & "]:保存" & FileNames(I) & "文件""" & FileName & """"
  40.     FileName = PathName & "Pictures.ZIP>透明\整体半透\SaveRangeTo" & FileNames(I) & "." & FileNames(I)
  41.     Debug.Print "[" & IIf(SaveRangeToPictrue(Range("L1:R21"), FileName, -2, 128), "成功", "失败") & "]:添加" & FileNames(I) & "整体半透明图片到""Pictures.ZIP"""
  42.   Next
  43.   Debug.Print "=============  测试结束  ==================="
  44. End Sub


  45. Sub TestSaveImageMso()
  46.   Dim PathName  As String
  47.   Dim FileNames() As String
  48.   Dim FileName    As String
  49.   Dim I As Long
  50.   
  51.   On Error Resume Next
  52.   
  53.   PathName = ThisWorkbook.Path & Application.PathSeparator
  54.   PathName = "T:\测试目录"
  55.   
  56.   FileNames = Split("About,AccessRecycleBin,BlogHomePage,ClearGrid,Folder", ",")
  57.   For I = 0 To UBound(FileNames)
  58.     FileName = PathName & FileNames(I)
  59.     With CommandBars.GetImageMso(FileNames(I), 32, 32)
  60.       Debug.Print "[" & IIf(SaveBitmapToFile(.Handle, FileName & ".PNG", &HFFFFFF), "成功", "失败") & "]:保存""" & FileNames(I) & """图标到文件""" & FileName & ".PNG""文件"
  61.       Debug.Print "[" & IIf(SaveBitmapToFile(.Handle, FileName & ".ICO", &HFFFFFF, , 32), "成功", "失败") & "]:保存""" & FileNames(I) & """图标到文件""" & FileName & ".ICO""文件"
  62.     End With
  63.   Next
  64. End Sub

复制代码
测试效果(本模块已完美通过XP+Office2007、Win7+Office2010(64位)、Win7+Office2007(32位)、Win10+Office2019(64位)测试):

测试视频

测试视频


本模块支持生成的文件格式:
1、BMP图片格式:32位位图文件 ,不支持透明;
2、PNG图片格式:生成32位带透明通道无损压缩图片;
3、ICO图片格式:生成Windows XP透明图标(注:VBA窗体中可能不能直接使用,不被VBA支持),要注意的是,如果没有为图标对应指定尺寸,那么生成的图标和Range区域大小相同,也就是说生成的图标并不是常见32×32或256×256之类的正方型图标;
4、TGA图片格式:生成32位带透明通道lwz无损压缩的TGA图片,由于TGA图片可被OpenGL直接调用做为3D贴图,故而常见于十多年前的老游戏素材中,但是要注意的是如果使用PS打开TGA文件的话,PS会忽略掉透明通道(包括PS自己生成的透明TGA图),但其它软件正常;
5、JPG/JPEG图片格式:最常见的有损压缩图片格式,不支持透明;
6、TIFF图片格式:不支持透明
7、GIF图片格式:不支持背景透明的GIF图片格式(注意:GIF格式本身是支持透明的,但本人偷懒,没去由自己生成二进制的GIF文件,所以本模块保存的GIF文件不支持背景透明);
8、SVG图片格式: 矢量图,可以使用主流网页浏览器直接打开查看些类图片。
9、WMF图片格式:矢量图
10、EMF图片格式:矢量图
11、PDF文件格式:呃……
12、XPS文件格式:建议使用XPS Viewer查看(Win10自带,但需手动在组件中添加)
13、ZIP文件格式:这货只是为了帮助我们把上面生成的文件打包成一个文件。直接调用Shell32生成,无需第三方库支持,但是要注意的是如果使用的Ghost版XP系统的话,有些Ghost系统会把zipfldr.dll文件精减删除了,需要自己再去重新下载一个注册重启后才能成功生成Zip文件。


源码在这里:
游客,如果您要查看本帖隐藏内容请回复


如果只需要用到里面的功能的话,只需要把basSaveRangeToPictrue这个模块直接导出到其它的文件中,然后按上面的测试代码调用SaveRangeToPictrue就行了,里面还有SaveClipboardToPictrue、SaveBitmapToFile可以自己参照原代码中的格式和说明结合自己的情况调用,比如如果想将Excel中的Ribbon图标导出到ICO或是PNG,只要自己参照SaveBitmapToFile使用方法就可以直接导出到磁盘文件(上面的测试代码里也有演示)。

最后使用说明
         我TM忘了自己想说什么,算了,不打字了,吃饭去…………

评分

33

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-12-1 06:13 | 显示全部楼层
本帖最后由 joforn 于 2020-12-2 09:54 编辑

来个沙发。。。。。
下面文字来自Joforn:
本来是要自己沙发然后用来补充一些说明的,但被这位兄弟抢了沙发,我只能利用自己的一点点特权直接占用了,希望层主不要介意
如果有函数运行失败的(其实我对完美成功运行不太感兴趣),希望能提示一下失败的问题是什么现象,比如:是完全一张图都没有输出还是某部分图形无输出?或是失败时直接整个Office消失不见了?如果能有动图或是能约个时间让我远程调试的话更好了。我把代码发出来,就是想让大家都运行运行,帮我测试出代码中的隐藏Bug。

另外补充一点说明:每种图片格式都会有高宽限制,比如:
WMF、EMF如果长度过长,会被截断——Excel自己截断的,还会有提示框,所以如果生成的图片太大的话不建议使用这类格式;
另外是TGA最大尺寸是65535×65535,这是由TGA文件格式的文件头决定的,我在处理里时发现有大于这个尺寸的图片会直接返回错误;
还有就是ICO本身最大的尺寸应该是256×256,但是我直接忽略了这个设置,所以生成的ICO并不是标准的ICO文件,但不会影响系统或是软件加载,只是老版本的软件可能加载不了。

TA的精华主题

TA的得分主题

发表于 2020-12-1 10:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
太强大了,关注后续代码发布

TA的精华主题

TA的得分主题

发表于 2020-12-1 10:37 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-12-1 10:44 | 显示全部楼层
期待,收藏了。
这样可以应用到:窗体订制表单背景,结合控件,使窗体展示为不同公司的表单。

TA的精华主题

TA的得分主题

发表于 2020-12-1 11:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-12-1 11:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
来占个位置,先坐板凳

TA的精华主题

TA的得分主题

发表于 2020-12-1 19:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-12-1 19:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好东西,学习了,非常感谢

TA的精华主题

TA的得分主题

发表于 2020-12-1 20:20 | 显示全部楼层
就喜欢这种把针对某一个知识点的系统性的代码,感谢分享!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 15:44 , Processed in 0.045005 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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