每天一篇Excel技术图文微信公众号:Excel星球NO.93-工作表图片处理作者:看见星光 微博:EXCELers / 知识星球:Excel哈喽,我是星光,之前分享了一期如何批量将图片从文件夹中插入到表格中……
批量将图片插入到表格中?So Easy!之后有朋友提问,如何将图片从一张工作表插入到另外一张工作表呢?举个例子。如下图▼

一份工作簿有两张工作表。存放照片的工作表名为【照片】,需要插入图片的工作表名为【数据】。现在需要根据【数据】表的A列的图片名称,将【照片】表的照片批量插入到【数据】表的B列中去……示例动画如下:

……实现这样的功能,其实3句代码就够了代码如下:代码如看不全可左右拖动..▼Sub InsertPicFromSheet() Dim rngData As Range, rngPicName As Range。
For Each rngData In Range("a2", Cells(Rows.Count, 1).End(3)) Set rngPicName = Sheets("照片").Cells.Find(rngData.Value, , , xlWhole)
使用Find方法在照片表完整匹配姓名 If Not rngPicName Is Nothing Then rngPicName.Offset(0, 1).Copy rngData.Offset(0, 1)
如果有找到对应的姓名,则将照片复制粘贴到目标位置 NextEnd Sub不过……以上代码最大的问题在于,没有删除数据表原本就有旧图片,如果重复运行程序,会造成图片累积,为了解决这个问题,我们需要再加上两句代码。
代码修改如下:代码如看不全可左右拖动..▼Sub InsertPicFromSheet() Dim shp As Shape, rngData As Range, rngPicName As Range
For Each shp In ActiveSheet.Shapes 删除活动工作表原有照片 If shp.Type = 13 Then shp.Delete Next
For Each rngData In Range("a2", Cells(Rows.Count, 1).End(3)) Set rngPicName = Sheets("照片").Cells.Find(rngData.Value, , , xlWhole)
使用Find方法在照片表的完整匹配姓名 If Not rngPicName Is Nothing Then rngPicName.Offset(0, 1).Copy rngData.Offset(0, 1)
如果有找到对应的姓名,则将照片复制粘贴到目标位置 NextEnd Sub以上代码使用一刀切的方式删除了旧有的图片二不过……尽管这段代码对于VBA基础良好的朋友来说,稍微修改下,已经足够应对大部分的问题,但是,对于小白而言,显然不够友好……。
比如说……照片的姓名固定在数据表的A列,实际情况,很可能不是A列,我说的对放置照片的位置固定于姓名列向右移动1列的单元格,实际情况,当然也很可能不是这样,我说的还是对代码中将储存照片的工作表固定设置为sheets("照片"),实际情况,肯定很可能不是这样,我英明……。
代码未设置单元格的大小以适应图片的大小,我……

代码修改如下:代码如看不全可左右拖动..▼Sub InsertPicFromSheet2() ExcelHome VBA编程学习与实践 by:看见星光 Dim rngData As Range, rngWhere As Range, cll As Range
Dim rngPicName As Range, rngPic As Range, rngPicPaste As Range Dim shp As Shape, sht As Worksheet, bln As Boolean
Dim strWhere As String, strPicName As String, strPicShtName As String Dim x, y As Long, lngYesCount As Long, lngNoCount As Long
On Error Resume Next Set rngData = Application.InputBox("请选择应插入图片名称的单元格区域", Type:=8) 用户选择需要插入图片的名称所在单元格范围
Set rngData = Intersect(rngData.Parent.UsedRange, rngData) intersect语句避免用户选择整列单元格,造成无谓运算的情况 If rngData Is Nothing Then MsgBox "选择的单元格范围不存在数据!": Exit Sub
strWhere = InputBox("请输入放置图片偏移的位置,例如上1、下1、左1、右1", , "右1") 用户输入图片相对单元格的偏移位置 If Len(strWhere) = 0 Then Exit Sub
x = Left(strWhere, 1) 偏移的方向 If InStr("上下左右", x) = 0 Then MsgBox "你未输入偏移方位": Exit Sub y = Val(Mid(strWhere, 2))。
偏移的值 Select Case x Case "上" Set rngWhere = rngData.Offset(-y, 0) Case "下"
Set rngWhere = rngData.Offset(y, 0) Case "左" Set rngWhere = rngData.Offset(0, -y)
Case "右" Set rngWhere = rngData.Offset(0, y) End Select strPicShtName = InputBox("请输入存放图片的工作表名称", , "照片")
For Each sht In Worksheets 查找是否存在指定保存图片的工作表名称 If sht.Name = strPicShtName Then bln = True: Exit For
Next If bln <> True Then MsgBox "未找到保存图片的工作表:" & strPicShtName & vbCrLf & "程序退出": Exit Sub Application.ScreenUpdating = False。
rngData.Parent.Select For Each shp In ActiveSheet.Shapes 如果旧图片存放在目标图片存放范围则删除 If Not Intersect(rngWhere, shp.TopLeftCell) Is Nothing Then shp.Delete
Next x = rngWhere.Row - rngData.Row y = rngWhere.Column - rngData.Column 偏移的纵横坐标 For Each cll In rngData
遍历选择区域的每一个单元格 strPicName = cll.Text 图片名称 If Len(strPicName) Then 如果单元格存在值
Set rngPicName = Sheets(strPicShtName).Cells.Find(cll.Value, , , xlWhole) 使用Find方法在照片表完整匹配姓名
If Not rngPicName Is Nothing Then Set rngPicPaste = cll.Offset(x, y) 粘贴图片的单元格
Set rngPic = rngPicName.Offset(0, 1) 保存图片的单元格 rngPicPaste.RowHeight = rngPic.RowHeight 设置放置图片单元格的行高和列宽,以适应图片的大小
rngPicPaste.ColumnWidth = rngPic.ColumnWidth rngPicName.Offset(0, 1).Copy rngPicPaste 如果有找到对应的姓名,则将照片复制粘贴到目标位置
Else lngNoCount = lngNoCount + 1 累加未找到结果的个数 End If
End If Next Application.ScreenUpdating = True MsgBox "有" & lngNoCount & "个非空单元格未找到对应的图片。
"End Sub以上代码解决了我们前面说的常见的三点问题……然……三不过……还是有一些实际应用中可能出现的问题未解决……比如说……如何解决图片和数据源的联动性?当数据源图片更改的时候,数据表的图片也自动更改?嗯,除了重新运行程序,也可以使用工作表的激活事件,或者是使用activesheet.chartobjects.add……
如何设置图片的大小适应单元格,而不是调整单元格的大小适应图片?……尽管还有这样那样的问题,然而伟大领袖——施耐庵老师说过,好汉三不过碗岗,所以咱们今就到这里吧,有关图片处理的代码,我们后期再继续分享,请记得持续关注本公众号……

文件下载百度网盘..▼https://pan.baidu.com/s/1PSkF0fQSdqLkHQay4Xp2mQ提取码: 4hug▎系统学习Excel推荐加入我的Excel社群 ▎▼ 点击图片可获取相关推文..
▼

扩展阅读▼



亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。