VBA常用小代码:在单元格中批量插入图片

转载自品略图书馆 http://www.pinlue.com/article/2020/03/2914/4510066052758.html

代码如下:

Sub InsertPic()

"ExcelHome VBA编程学习与实践 by:看见星光

Dim Arr, i&, k&, n&, pd&

Dim PicName$, PicPath$, FdPath$, shp As Shape

Dim Rng As Range, Cll As Range, Rg As Range, book$

"On Error Resume Next

"用户选择图片所在的文件夹

With Application.FileDialog(msoFileDialogFolderPicker)

.AllowMultiSelect = False "不允许多选

If .Show Then FdPath = .SelectedItems(1) Else: Exit Sub

End With

If Right(FdPath, 1) <> "\" Then FdPath = FdPath & "\"

Set Rng = Application.InputBox("请选择图片名称所在的单元格区域", Type:=8)

"用户选择需要插入图片的名称所在单元格范围

Set Rng = Intersect(Rng.Parent.UsedRange, Rng)

"intersect语句避免用户选择整列单元格,造成无谓运算的情况

If Rng Is Nothing Then MsgBox "选择的单元格范围不存在数据!": Exit Sub

book = InputBox("请输入图片偏移的位置,例如上1、下1、左1、右1", , "右1")

"用户输入图片相对单元格的偏移位置。

If Len(book) = 0 Then Exit Sub

x = Left(book, 1) "偏移的方向

If InStr("上下左右", x) = 0 Then MsgBox "你未输入偏移方位。": Exit Sub

y = Val(Mid(book, 2)) "偏移的尺寸

Select Case x

Case "上"

Set Rg = Rng.Offset(-y, 0)

Case "下"

Set Rg = Rng.Offset(y, 0)

Case "左"

Set Rg = Rng.Offset(0, -y)

Case "右"

Set Rg = Rng.Offset(0, y)

End Select

Application.ScreenUpdating = False

Rng.Parent.Select

For Each shp In ActiveSheet.Shapes "如果旧图片存放在目标图片存放范围则删除

If Not Intersect(Rg, shp.TopLeftCell) Is Nothing Then shp.Delete

Next

x = Rg.Row - Rng.Row: y = Rg.Column - Rng.Column

"偏移的坐标

Arr = Array(".jpg", ".jpeg", ".bmp", ".png", ".gif")

"用数组变量记录五种文件格式

For Each Cll In Rng

"遍历选择区域的每一个单元格

PicName = Cll.Text "图片名称

If Len(PicName) Then "如果单元格存在值

PicPath = FdPath & PicName "图片路径

pd = 0 "pd变量标记是否找到相关图片

For i = 0 To UBound(Arr)

"由于不确定用户的图片格式,因此遍历图片格式

If Len(Dir(PicPath & Arr(i))) Then

"如果存在相关文件

ActiveSheet.Pictures.Insert(PicPath & Arr(i)).Select

"插入图片并选中

With Selection

.ShapeRange.LockAspectRatio = msoFalse

"撤销锁定纵横比

.Top = Cll.Offset(x, y).Top + 5

.Left = Cll.Offset(x, y).Left + 5

.Height = Cll.Offset(x, y).Height - 10 "图片高度

.Width = Cll.Offset(x, y).Width - 10 "图片宽度

End With

pd = 1 "标记找到结果

n = n + 1 "累加找到结果的个数

[a1].Select: Exit For "找到结果后就可以退出文件格式循环

End If

Next

If pd = 0 Then k = k + 1 "如果没找到图片累加个数

End If

Next

MsgBox "共处理成功" & n & "个图片,另有" & k & "个非空单元格未找到对应的图片。"

Application.ScreenUpdating = True

End Sub

代码已有注释,这儿就再说明一下运行过程。

首先,会让用户选择存放图片的文件夹。注意是选择文件夹,不是选择图片;选择文件夹后,看不到文件夹内的图片是正常现象。

然后,选择图片名称存放的单元格区域,可以选择整列、多列、整行或多行,比如示例动画中的B:D列,2:2行等。。

最后,设置图片相对于图片名称所在的单元格偏移的位置;比如图片名称在B列,图片放在C列,那就是向右偏移1列,即右1。上下左右代表了方向,数字代表偏移的量。

代码继续运行,先删除存放于放置图片单元格范围的原图片图形(如何用代码删除指定位置的图形图片?这个问题也不要在后台提问了),然后遍历图片名称,根据偏移位置插入新图片。

代码运行结束后会告之用户一共成功插入了多少张图片,以及失败了多少张;有朋友说找不到图片的单元格能否填充颜色作提醒,我想想觉得没必要啊,就没做……不要说我懒,认真脸。

小贴士:

1,该段小代码支持一下图片格式:

".jpg", ".jpeg", ".bmp", ".png", ".gif"

2,图片的纵横比是未锁定的,如需锁定,可以注释掉下句代码:

.ShapeRange.LockAspectRatio = msoFalse

3,图片的行高和列宽是由放置图片的单元格行高和列宽决定的。当然,您也可以把代码稍微修改,设置固定的图片行高和列宽,并由图片的行高和列宽决定单元格的大小。

4,图片的名称必须和指定单元格范围内的名称一致,如果需要模糊匹配,使用DIR函数搭配通配符的方式即可。

 

 

以前用Excel2003做了些宏,在网上还有不少粉丝,因一些功能在Excel2010中无法使用,故重新整理,欢迎指正; 本Excel中的宏在Excel2010中测试表现出色; 运行宏前,要保证EXCEL没有禁用宏。 Michael Ho QQ: 9900060 ----------------------- 本Excel有以下功能: 插入图片1 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet2到新工作簿,并插入你所选文件夹中的全部JPG图片到B列,对应的图片名自动填到C列; 3.图片的大小会自动适应Sheet2的B3单元格,因此可以在点击执行前调整Sheet2的B3单元格的大小来控制插入图片的大小。 -------- 插入图片2 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet3到新工作簿,并插入你所选文件夹中的全部JPG图片制作图册,对应的图片名自动填到图片下方; -------- 插入图片3 如果用户自己的Excel文件中有一列是型号,该宏可以插入指定文件夹里以型号命名的JPG图片到另一列; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+I (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏InsertPic3); 4.然后会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 5.在弹出的对话框中指定型号在第几列,图片插入到第几列,以及从哪一行开始; 6.图片的大小会自动适应你设定的第一行要插入图片单元格,因此提前调整那个单元格的大小可以控制插入图片的大小。 ------------- 删除活动工作表中所有图片 Ctrl+d 删除活动工作表里所有的JPG图片,(不一定是本工作簿中的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+d (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏DelPic); ------------- 导出活动工作表中被选中的一张JPG图片 Ctrl+e 导出活动工作表中被选中的一张JPG图片,(不一定是本工作簿中的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.请选中一张要导出的图片; 4.在你的文件中按Ctrl+e (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏OutputOnePic); 5.在弹出的对话框中指定图片要保存的名字; 1.不管图片在Excel中是否被缩放过,导出的图片是按图片的原始尺寸进行保存。 2.在桌面上会自动新建一个"OutputPic"的文件夹,导出的图片将会存在那个文夹里; 3.如果文件夹中已有相同名字的文件,则后面导出的文件会自动加上(v1), (v2), (v3)... ------------- 导出活动工作表中所有JPG图片 Ctrl+f 导出活动工作表中所有JPG图片,并且图片名自动使用指定列中的图片名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+f (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏OutputAllPic); 4.在弹出的对话框中指定图片所在列,图片名所在的列; 1.不管图片在Excel中是否被缩放过,导出的图片是按图片的原始尺寸进行保存; 2.在桌面上会自动新建一个"OutputPic"的文件夹,所有导出的图片将会存在那个文夹里; 3.如果文件夹中已有相同名字的文件,则后面导出的文件会自动加上(v1), (v2), (v3)... ---------------- 对指定文件夹中的JPG图片进行重命名 Ctrl+r 利用活动工作表中的所有图片的旧名与新名的对照,对指定文件夹中JPG图片进行重命名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+r (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏RenamePic); 4.在弹出的对话框中指定图片旧名所在列和图片新名所在的列; 1.可以结合插入图片的宏,将所有图片的旧名输入到Excel中,再在另一列中填上新图片名,然后使用该宏。 2.如果顺利运行,会在原来那个文件夹下面新建一个叫“New”的子文件夹,所有重命好名的图片会自动放入子文件夹里; 3.如果文件夹中已有相同名字的文件,则后面的文件会覆盖原来的文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值