在EXCEL中插入图片是常规的不能再常规的动作,一般的人无非就是选择“插入”--“图片”,就把图片插入到工作表中去了。
没错!但是你想过没有,要成千上万张地插入图片,并按一定的顺序排列时,如下图所示的样子,难道你还是用手工插入吗?肯定不是!神奇加万能的VBA呀!
不是一张,是上千张!排到何时?
很不幸,最近做的一个项目就是用VBA实现批量插图的案子,但接连踩坑,为了提醒自己和别人,我把我处理的全过程记录下来,如果你有缘看到了,不想点个赞再走,谢谢!
第一坑:使用平台内置接口
考虑到客户不是一个人使用,需要多个人同时协作生成批量的“图文档”,马上想到的是使用平台代码来实现,于是第一版就写了如下代码:
作用:实现插入图片
参数:带完整路径的图片文件名字
返回值:没有
示例:
SubCommandButton1_Click()
‘定义接口变量
DimsErrAsString
DimsResultAsString
DimobjAsObject
‘获取高士达云平台的编程接口
Setobj=Application.COMAddIns.Item("prjAddin.Office_Addin").Object
‘通过接口调用InsertRowCol
obj.InsertPic“D:\Img\user.jpg”
‘释放编程接口
Setobj=Nothing
EndSub
解说:在当前图片项目的单元格中插入来自“D:\Img\user.jpg”的图片
终于成功了,可是图片不能紧贴着单元格,且长宽比不能调整。好吧,算我输。
第二坑:录制宏获得插入图片代码
一计不成,立马心生另一计。通过录制宏的办法,获得插入图片的代码。考虑到表格和图片排版的位置还不一样,把表格搞成了链接图片的样子。大力出奇迹,写出了如下代码:
Sheet4.Cells(图1,c).Select
当前树木=Range("第一行")用于获取出错时树木编号
mypic=choosefolder"\"Range("第一行")i".jpg"路径+项目编号+顺序号
ActiveSheet.Pictures.Insert(mypic).Select插图
Selection.ShapeRange.LockAspectRatio=msoFalse取消行列限制
Selection.ShapeRange.Height=.高4CM
Selection.ShapeRange.Width=85.宽3CM
终于成功了,挺有自豪感的。
可是高兴得太早了,客户一使用反馈了两个问题:一是数量太大时,速度很慢;二是生成好的结果复制到另一台电脑时图片全丢失了。
晕,怎么会这样?
第三坑:上网找来神代码
为什么慢,原来是链接表格图片的问题。为什么丢图,原来是这种代码插入的图片相当于插入图片时默认选择了“链接图片”形式,也就是说图片没插入到工作簿中。
几番搜索,找来一段别的高手代码,修改使用。
Fori=2ToCells(Rows.Count,cellcolumn).End(xlUp).Row数字2是设置开始填充图片的行号是第2行
Forj=1ToUBound(pictype)
IfDir(picadsCells(i,cellcolumn)pictype(j))""Then
Cells(i,piccolumn)="MMT"表格填图
ActiveSheet.Shapes.AddShape(msoShapeRectangle,(Cells(i,piccolumn).Left+0.5),(Cells(i,piccolumn).Top+0.5),(Cells(i,piccolumn).Width-1),(Cells(i,piccolumn).Height-1)).Fill.UserPicturepicadsCells(i,cellcolumn)pictype(j)
ExitFor插入图片,退出循环
EndIf
Nextj
Nexti
天!够复杂的。原理无非是先插入一个矩形框,再往框中填充图片。感觉仍不是理想。
终极解决方案:直接插入图片
几番摸索,终于找到一个神语句,解决了我的大问题。
Shapes.AddPicture方法:从现有文件创建图片。返回一个Shape对象,该对象表示新的图片。
语法:AddPicture(FileName、LinkToFile、SaveWithDocument、Left、Top、Width、Height)
这个语句不仅插入图片,而且还可调整图片大小,有参数控制是不是链接。真是踏破铁鞋无觅处!
现在剩下的问题就是计算每张图片的位置问题了。好办!
当前树木=Range("第一行")用于获取出错时树木编号
mypic=choosefolder"\"Range("第一行")i".jpg"路径+项目编号+顺序号
ActiveSheet.Shapes.AddPicturemypic,True,True,ly,Lx1,85.,.宽3CM,高4CM
几乎一句话就搞定了。
总结:
不尝试难修得正果,不积累难成为高手。愿你看完此文少走弯路。
顺利放几张成品图供参考。
这是主操作界面。
需要打印几千张这样的结果图片。