ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何实现单击按钮后更换工作表中的图片?

如何实现单击按钮后更换工作表中的图片?

作者:绿色风 分类: 时间:2022-08-17 浏览:111
楼主
kevinchengcw
Q: 如何实现单击按钮后更换工作表中的图片?
A: 有些情况下我们需要实现单击鼠标后更换工作表中图片的功能,下面提供两个简单的方法及示例附件,实现单击按钮后的图片变换效果,当然也可以进一步实现选择单元格等可触发事件来实现变换功能。

方法一:通过插入与删除图片的方式实现图片变换
优点:图片随意更改,只需加入或替换掉PIC文件夹内JPG图片文件即可,灵活性高。
缺点:文件不能单独使用,一定要配合附属图片文件,本例中是本工作簿路径下的PIC文件夹中JPG文件,另外就是速度有些慢,当电脑配置低时延时明显。
  1. Dim N As Integer  '定义公共变量N用来存储循环到的图片名数组的索引值
  2. Dim Arr   '定义用来存放图片名的数组

  3. Sub ChangePic1()
  4. Dim Rng As Range
  5. Dim mShape As Shape
  6. Dim Str, StrA As String
  7. Str = ""
  8. StrA = ""
  9. Application.ScreenUpdating = False  '关闭屏幕刷新,避免中间效果都被看到,同时也加速代码执行速度
  10. Set Rng = Range("a1:d10")   '设定图片要插入的范围
  11. For Each mShape In ActiveSheet.Shapes   '枚举图片,删除原来位于A1单元格上的图片
  12.     If mShape.TopLeftCell.Address = "$A$1" Then mShape.Delete
  13. Next mShape
  14. If Dir(ThisWorkbook.Path & "\pic\*.jpg") <> "" Then  '获取PIC文件夹下图片列表
  15.     Str = Dir(ThisWorkbook.Path & "\pic\*.jpg")
  16.     Do While Str <> ""
  17.         If StrA = "" Then
  18.             StrA = Str
  19.         Else
  20.             StrA = StrA & "," & Str
  21.         End If
  22.         Str = Dir
  23.     Loop
  24.     Arr = Split(StrA, ",")   '将列表装入数组,便于循环调用
  25. End If
  26. If N > UBound(Arr) Then N = 0  '当循环值超出数组范围后归零,即回到数组起始值
  27. ThisWorkbook.ActiveSheet.Pictures.Insert(ThisWorkbook.Path & "\pic\" & Arr(N)).Select   '插入图片并选定,这句是关键
  28. With Selection  '对选定的图片调整大小以适合到设定的单元格范围内,注意:未设定自动居中
  29.     .Top = [a1].Top
  30.     .Left = [a1].Left
  31.     If .Height / .Width > Rng.Height / Rng.Width Then   '用来判断图片长宽比与单元格范围的长宽比
  32.         .Height = Rng.Height
  33.         .Width = Rng.Width * Rng.Height / .Height
  34.     Else
  35.         .Width = Rng.Width
  36.         .Height = Rng.Height * Rng.Width / .Width
  37.     End If
  38. End With
  39. N = N + 1   '循环值递增,因为N是公共变量,下次循环到时N值仍存在
  40. Application.ScreenUpdating = True  '操作完成,打开屏幕更新
  41. End Sub

方法二:通过层叠图片的置顶功能实现图片变换
优点:速度快,图片变换基本没有明显延时
缺点:图片全部插入文件,造成文件体积偏大,另通过索引值操作图片存在出错可能
  1. Dim N As Integer  '定义公共变量N用来存储循环到的图片名数组的索引值
  2. Dim Arr   '定义用来存放图片名的数组

  3. Sub ChangePic2()
  4. Dim M As Integer
  5. Application.ScreenUpdating = False   '关闭屏幕刷新,主要为了提高速度
  6. M = ThisWorkbook.ActiveSheet.Shapes.Count  '获取活动工作表中形状数量
  7. Do While ActiveSheet.Shapes((N Mod M) + 1).Type <> 13  '索引值为(N Mod M) + 1的形状不是图片时继续到下一个
  8.     N = (N Mod M) + 1   '(N mod M) + 1保证使N的值介于1到M之间
  9. Loop  '当索引值是图片时会跳出循环(在循环中可加入对图片位置的判断,这样就可以只对指定的区域的图片进行操作)
  10. ActiveSheet.Shapes((N Mod M) + 1).Select   '选中符合条件的图片
  11. Selection.ShapeRange.ZOrder msoBringToFront  '将图片移到顶层
  12. Application.ScreenUpdating = True  '打开屏幕更新展示结果
  13. End Sub

鼠标点击变换图片.part1.rar
鼠标点击变换图片.part2.rar
鼠标点击变换图片.part3.rar
2楼
成就滋味
谢谢分享
3楼
成就滋味
谢谢分享

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap