编程语言应用

首页 » 常识 » 诊断 » 坑你没商量,EXCEL插入图片也带坑
TUhjnbcbe - 2023/8/12 20:43:00

在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

几乎一句话就搞定了。

总结:

不尝试难修得正果,不积累难成为高手。愿你看完此文少走弯路。

顺利放几张成品图供参考。

这是主操作界面。

需要打印几千张这样的结果图片。

1
查看完整版本: 坑你没商量,EXCEL插入图片也带坑