当前位置: 首页 > news >正文

一篇文章带你玩转VBA中的形状操作(含代码演示)

文章目录

  • 1)Shapes / Shape 到底是什么关系?
  • 2)Picture 是什么?跟 Shape 有啥区别?
    • 2.1 Excel 常见的Picture相关家族
    • 2.2 Addpicture方法插入图片
    • 2.3 插入图片的其他几种方式
  • 3)形状的常见操作
    • 3.1 改名
    • 3.2 查找某个 shape(按名称)
    • 3.3 遍历所有图片并删除
    • 3.4 批量操作:ShapeRange
    • 3.5 把图片“贴”到某个单元格位置
    • 3.6 让图片适配单元格大小(保持比例)

1)Shapes / Shape 到底是什么关系?

在 Excel VBA 里,图形体系基本是这样:

  • Worksheet.Shapes:一个集合(集合里装着所有 Shape)
  • Shape:集合里的单个图形对象(矩形、文本框、图片、按钮、图表对象……都算 Shape)

结论一句话:在 Excel 里,“图片”本质上也是 Shape,只是 Shape 的类型不同。典型代码如下:

' 此代码用于打印活动工作表中的所有形状和具体类型编号 Dim shp As Shape For Each shp In ActiveSheet.Shapes Debug.Print shp.Name, shp.Type Next

对于所有的形状,我这里整理了一张速查表,可以对照参考,带了数字的是编号简写:

形状(英文)名称(中文)形状(英文)名称(中文)
rectangle矩形(1)roundedRectangle圆角矩形(5)
parallelogram平行四边形(2)trapezoid梯形 (3)
diamond菱形(4)flowchartDecision判定(菱形流程图)
isoscelesTriangle等腰三角形(7)rightTriangle直角三角形
oval椭圆(9)circle圆形
hexagon六边形octagon八边形
pentagon五边形decagon十边形
star5五角星star8八角星
star16十六角星star24二十四角星
cross十字形can圆柱体
cube立方体beveledRectangle斜角矩形
cloud云形lightningBolt闪电形
arrow箭头leftArrow向左箭头
rightArrow向右箭头upArrow向上箭头
downArrow向下箭头leftRightArrow左右双向箭头
upDownArrow上下双向箭头curvedRightArrow弯曲右箭头
flowchartProcess流程(处理)flowchartTerminator开始/结束
flowchartData数据flowchartDocument文档
flowchartPredefinedProcess预定义流程flowchartDelay延迟
textbox文本框callout标注框

如果我们需要在Excel中插入一个形状,需要跟上前缀msoShape,例如可以写作:

ActiveSheet.Shapes.AddShape msoShapeRectangle, 50, 50, 100, 60 ActiveSheet.Shapes.AddShape 1, 50, 50, 100, 60 ' 这里的1代表的也是长方形,是形状编号的简略写法

2)Picture 是什么?跟 Shape 有啥区别?

很多同学会在 VBA 里看到PicturesPictureFormat容易混,下面我们就系统讲一下

2.1 Excel 常见的Picture相关家族

  1. Worksheet.Pictures:这是一个图片集合,但在现代 Excel 中图片也会出现在Shapes里,建议用Shapes统一管理

  2. Shape.PictureFormat重点!Shape是图片时,PictureFormat提供裁剪、亮度、对比度等能力。

你只要记住这个实战规则,工作表上的图片 =Shape(Type 通常是msoPicturemsoLinkedPicture

2.2 Addpicture方法插入图片

当然现在Excel也提供Addpictrue方法,其基本语法可以写作:

Set pictureObject = Worksheet.Shapes.AddPicture( Filename, LinkToFile, SaveWithDocument, _ Left,Top, Width, Height )

其中参数解释如下:

  • Filename:图片文件的完整路径和文件名
  • LinkToFile:,msoTrue表示图片链接到源文件,但源文件被删除文档也受影响,因此一般msoFalse(图片嵌入文档)
  • SaveWithDocument:是否随文档保存,msoTrue:图片随文档保存,msoFalse:仅保存链接,一般用前者
  • Left,Top, Width, Height:表示的分别是左、上、宽、高,以磅为单位,如要用厘米,需要进行单位转换
Sub InsertPic_AddPicture() Dim picPath As String picPath = "C:\test\1.jpg" Dim shp As Shape Set shp = ActiveSheet.Shapes.AddPicture( _ Filename:=picPath, _ LinkToFile:=msoFalse, _ SaveWithDocument:=msoTrue, _ Left:=100, Top:=50, Width:=-1, Height:=-1 _ ) shp.Name = "Logo" '在这里我们可以设置 placement 属性 End Sub

Width:=-1, Height:=-1表示按原始尺寸插入,同时在插入后,我们有了shp对象,主要包括以下三种方式,按需使用:

  • xlFreeFloating:自由浮动(不随单元格变化,这个是默认值)
  • xlMove:随单元格移动
  • xlMoveAndSize:随单元格移动并缩放(做报表模板最常用)

锁定纵横比:我们一般按原图的大小插入,然后可以通过设置LockAspectRatio来锁定纵横比调整图片大小:

With ActiveSheet.Shapes("Logo") .LockAspectRatio = msoTrue .Width = 120 End With

但是注意很多人直接.Width=....Height=...,图片拉伸变形,记得先.LockAspectRatio = msoTrue再只改一个维度。

等比例缩放:同样也可以通过ScaleWidth / ScaleHeight来等比例缩放图片

With ActiveSheet.Shapes("Logo") .ScaleWidth 0.5, msoTrue, msoScaleFromTopLeft .ScaleHeight 0.5, msoTrue, msoScaleFromTopLeft End With

注意这个是以图片最开始的大小等比例缩放,同时msoScaleFromTopLeft代表的是缩放参考中心点,这个为左上角

图片裁剪:可以通过PictureFormat来裁剪图片,裁剪的单位也是磅,这个是常用的一个方法,写法如下

Sub CropDemo() With ActiveSheet.Shapes("Picture 32").PictureFormat .CropLeft = 10 .CropTop = 10 .CropRight = 10 .CropBottom = 10 End With End Sub

2.3 插入图片的其他几种方式

方式1:Pictures.Insert(简单但控制少),插入位置、大小不太好控,通常还要再改 Shape 属性

Sub InsertPic_PicturesInsert() ActiveSheet.Pictures.Insert("C:\test\1.jpg") End Sub

方式2:把区域复制成图片

Sub RangeToPicture() Dim rng As Range Set rng = ActiveSheet.Range("A1:D10") ' 复制范围为图片,其中Appearance:=xlScreen 表示屏幕截图,Format:=xlPicture 表示图片格式 rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture ActiveSheet.Paste ' 粘贴出来也是 Shape(或图像对象),可以从 Selection 拿 Selection.Name = "RngShot" ' 改名后续就方便定位此对象了 End Sub

3)形状的常见操作

3.1 改名

ActiveSheet.Shapes("图片 1").Name = "Logo"

3.2 查找某个 shape(按名称)

Dim shp As Shape Set shp = ActiveSheet.Shapes("Logo")

3.3 遍历所有图片并删除

Sub DeleteAllPictures() Dim shp As Shape For Each shp In ActiveSheet.Shapes If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then shp.Delete End If Next End Sub

3.4 批量操作:ShapeRange

这个是一个小技巧,可以通过Range接收一个arr数组,批量修改形状

Sub BatchMove() Dim arr arr = Array("Logo", "RngShot") With ActiveSheet.Shapes.Range(arr) .Left = 20 .Top = 20 End With End Sub

3.5 把图片“贴”到某个单元格位置

这个是做报表模板最常见需求:图片固定在某个单元格里,行高列宽变了它也跟着变。

Sub StickPicToCell() Dim cell As Range Set cell = ActiveSheet.Range("B2") With ActiveSheet.Shapes("Logo") .Left = cell.Left .Top = cell.Top .Placement = xlMoveAndSize End With End Sub

3.6 让图片适配单元格大小(保持比例)

Sub FitPicInCell() Dim cell As Range Set cell = ActiveSheet.Range("B2") With ActiveSheet.Shapes("Logo") .LockAspectRatio = msoTrue .Placement = xlMoveAndSize ' 先按宽度适配 .Left = cell.Left .Top = cell.Top .Width = cell.Width ' 如果高度超出,再按高度适配 If .Height > cell.Height Then .Height = cell.Height End If ' 居中(可选) .Left = cell.Left + (cell.Width - .Width) / 2 .Top = cell.Top + (cell.Height - .Height) / 2 End With End Sub

所以请记住Shapes 是总入口:图片、矩形、文本框、按钮、图表对象都在Worksheet.Shapes里,建议养成插入后立刻改名的习惯,后续维护成本会低很多,后续也会继续分享更多VBA编程的相关内容,我是不懂代码的杰瑞学长,我们下期再见!

如果觉得文章对你有帮助,欢迎点赞 + 收藏 + 关注,一起进步!

http://www.cnnetsun.cn/news/1884826.html

相关文章:

  • Stable Diffusion整合包v4.10:从零开始的AI绘画全流程指南
  • AMD Ryzen处理器深度调试完整指南:3大核心功能解锁隐藏性能
  • I2C EEPROM 读取异常0xFF:从时序到地址宽度的深度解析
  • Whisper-large-v3在教育领域的应用:课堂语音转录与分析
  • 深入理解Linux内核调度原理
  • 移远FC41D WIFI模块实战:从配网到OneNET数据上报全链路解析
  • 区块链隐私保护
  • NaViL-9B镜像免配置实操手册:无需下载权重,5分钟启动服务
  • 深度挖掘AMD Ryzen性能:SMUDebugTool终极硬件调试指南
  • 从存算一体到存算分离:在单机上用Docker体验StarRocks 3.2新架构(含MinIO对象存储)
  • ROS全覆盖规划避坑指南:为什么你的GeneticTSPSolver跑得慢?试试Nearest Neighbor TSP
  • Cadence Allegro 24.1 汉化指南:从环境变量配置到多系统适配
  • 解密OpenHands插件系统:手把手教你开发自定义微代理
  • 如何5分钟配置你的Windows本地实时语音转文字工具:免费离线解决方案
  • 伏羲天气预报模型部署与运维指南:Ubuntu20.04服务器环境配置详解
  • ColorRay
  • Qwen-Image-Edit-F2P算法解析:从CNN到Transformer的演进
  • 优化嵌入式开发流程:STM32CubeMX与Git的协同配置指南
  • 从思想实验到可运行代码:一本系统的PTP技术书
  • BGE Reranker-v2-m3在法律文书检索中的应用
  • 2026年4月最新|OpenClaw卸载完整教程|避开这3个坑
  • CV算法工程师面试指南:从入门到offer只需掌握这25点
  • SDMatte与传统算法对比:在边缘细节与复杂背景下的效果实测
  • Agent在RPA中的应用:自动化办公新范式
  • 深度解析R3nzSkin内存换肤技术:从逆向工程到安全实现
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI进阶:利用LaTeX生成技术报告与数学公式
  • CoPaw多模态应用展示:图文理解与智能摘要生成效果
  • 系统调用,库函数,exec系列函数,shell实现
  • 国产连接器是否能全面替代 Adam Tech 进口连接器?深度解析与评估
  • C语言位运算实战:从奇偶校验到循环移位,5个嵌入式开发必会技巧(附完整代码)