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