家人们谁懂啊!做Excel可视化、画流程图、整理示意图时,最崩溃的不是画形状,而是连线条!
手动拖线条,要么歪歪扭扭,要么两个形状一移动,线条就“断联”,得重新调整;好不容易对齐,老板说“把两个形状换个位置”,瞬间心态爆炸——又要重新连!
我见过太多Excel打工人,明明VBA玩得还算溜,却在“连线条”这件事上栽跟头,硬生生把10分钟能搞定的活,拖成1小时的加班任务。
其实你们都忽略了VBA里一个“隐藏王者”——ConnectorFormat对象,它就是专门管“连线”的全能管家,能自动连、自动调、自动优化,让你彻底和手动拖线条说拜拜!
今天就用最接地气、不搞晦涩术语的方式,把ConnectorFormat讲透,不管你是VBA小白还是半吊子,看完就能上手,下次画流程图直接封神!
先搞懂:ConnectorFormat到底是个啥?(人话版)
很多人一看到“对象”“属性”“方法”就头大,别急,咱们用生活场景类比,一秒懂!
你可以把Excel里的各种形状(矩形、圆形、箭头),当成一个个“嘉宾”;而ConnectorFormat,就是专门负责给这些嘉宾“牵线搭桥”的红娘。
这个红娘不一般:
不用你手动找位置,它能精准找到每个嘉宾的“连接点”(专业叫“连接结点”);
嘉宾换位置,它自动调整牵线的长度和角度,绝不会断联;
还能自由切换牵线风格(直线、弧线、折线),颜值拉满;
想拆CP、换对象,它一键就能断开,重新牵线也毫不费力。
专业点说:ConnectorFormat是Excel VBA中专门控制“连接符”的对象,包含了连接符的所有属性和方法,只要你用它,就能实现连接符的自动化操作,告别手动调整的麻烦[superscript:2]。
重点:它不是独立存在的,必须依附于“连接符形状”(也就是你插入的线条),就像红娘不能脱离嘉宾单独工作一样——先有线条,才有ConnectorFormat。
避坑预警:90%的人都踩过的3个误区
在讲用法之前,先把大家常踩的坑扒出来,避免你学完还是白忙活,毕竟咱们学VBA,核心是“省时间”,不是“找罪受”!
误区1:手动画的线条,也能用上ConnectorFormat?
错!错!错!很多人以为“只要是线条,就能用ConnectorFormat”,大错特错!
ConnectorFormat只认“连接符”(也就是插入形状时,选“线条”里的“连接符”,比如直线连接符、弧线连接符),不认你手动用“线条工具”画的普通线条。
简单说:普通线条是“野路子”,连接符是“正规军”,ConnectorFormat只服务正规军!
误区2:给连接符设了初始位置,就不能改了?
大可放心!很多人插入连接符时,会纠结“初始位置设在哪里”,其实完全没必要。
因为只要你用ConnectorFormat给连接符绑定了两个形状,它就会自动调整自身的大小和位置,不管你初始设的是(0,0)还是(1000,1000),最后都会精准对齐两个形状的连接点,初始位置等于“无效操作”[superscript:2]。
误区3:连接点编号随便选,反正能连上?
虽然能连上,但选不对编号,线条会歪得离谱!
不同形状的连接点,编号规则不一样,记好这2条,避免踩坑:
1. 自选形状、艺术字、图片、OLE对象:连接点从顶部开始,按逆时针方向编号(比如矩形,顶部是1,右侧是2,底部是3,左侧是4);
2. 手绘多边形:连接点就是多边形的顶点,编号和顶点编号一致(比如三角形,3个顶点就是3个连接点,编号1、2、3)[superscript:2]。
实在记不住?教你个偷懒技巧:打开宏录制器,手动给形状连一次线,停止录制后看代码,里面就有连接点的编号,抄作业就行!
干货来了!ConnectorFormat核心用法(附可直接复制的代码)
不讲废话,只讲“能直接用、能解决实际问题”的用法,每个用法都配代码,复制粘贴到VBA编辑器,改一改参数就能用,小白也能轻松拿捏!
先记住一个核心前提:想要使用ConnectorFormat,必须先创建“连接符形状”,语法是:
Set 连接符对象 = 工作表.Shapes.AddConnector(连接符类型, 初始X, 初始Y, 初始宽度, 初始高度)
重点:连接符类型不用死记,常用的3种直接记:
- msoConnectorStraight:直线连接符(最常用);
- msoConnectorElbow:折线连接符(适合复杂布局);
- msoConnectorCurve:弧线连接符(颜值高,适合美观需求)。
用法1:一键连接两个形状(最常用,必学!)
场景:画流程图时,需要把两个矩形用直线连起来,不管怎么移动矩形,线条都自动跟随。
直接复制代码,替换“工作表名称”“形状位置”即可:
Sub 一键连接两个形状()
'1. 定义变量(小白可以不用懂,直接用)
Dim 工作表 As Worksheet
Dim 形状1 As Shape, 形状2 As Shape, 连接符 As Shape
'2. 指定工作表(改成你需要的工作表,比如Sheet1)
Set 工作表 = ThisWorkbook.Worksheets("Sheet1")
'3. 先创建两个形状(矩形,可修改位置和大小)
Set 形状1 = 工作表.Shapes.AddShape(msoShapeRectangle, 100, 50, 200, 100) 'X=100,Y=50,宽200,高100
Set 形状2 = 工作表.Shapes.AddShape(msoShapeRectangle, 300, 300, 200, 100) '第二个矩形位置
'4. 创建连接符(直线连接符,初始位置随便设,后续会自动调整)
Set 连接符 = 工作表.Shapes.AddConnector(msoConnectorStraight, 0, 0, 0, 0)
'5. 用ConnectorFormat绑定两个形状(核心步骤)
With 连接符.ConnectorFormat
.BeginConnect ConnectedShape:=形状1, ConnectionSite:=1 '连接形状1的第1个连接点(顶部)
.EndConnect ConnectedShape:=形状2, ConnectionSite:=1 '连接形状2的第1个连接点(顶部)
连接符.RerouteConnections '自动优化线条路径,找最短路线
End With
'6. 美化线条(可选,按需修改)
With 连接符.Line
.ForeColor.RGB = RGB(255, 0, 0) '线条颜色:红色
.Weight = 2 '线条粗细:2磅
End With
MsgBox "连接完成!移动形状试试,线条会自动跟随~"
End Sub
解读:核心是BeginConnect(连接起点)和EndConnect(连接终点)两个方法,只要绑定了形状和连接点,线条就会“粘死”在形状上,怎么移都不会断[superscript:8]。
小技巧:如果觉得线条路径不好看,加上连接符.RerouteConnections,它会自动找两个形状之间的最短路径,不用你手动调整。
用法2:一键断开连接(拆CP神器)
场景:画错连接关系,需要断开连接符和形状的绑定,重新连接。
代码超简单,直接复制:
Sub 一键断开连接()
'指定要断开的连接符(这里假设连接符名称是“连接符 1”,可修改)
Dim 连接符 As Shape
Set 连接符 = ThisWorkbook.Worksheets("Sheet1").Shapes("连接符 1")
'用ConnectorFormat断开连接(起点和终点都断开)
With 连接符.ConnectorFormat
.BeginDisconnect '断开起点连接
.EndDisconnect '断开终点连接
End With
MsgBox "断开成功!可以重新连接其他形状啦~"
End Sub
解读:BeginDisconnect和EndDisconnect,对应断开起点和终点的连接,断开后连接符会保留,方便你重新绑定其他形状,不用重新画线条[superscript:6]。
用法3:批量给形状编号+连接(复杂流程图必备)
场景:画复杂流程图时,有很多形状,不知道每个连接点的编号,导致连接错位。这个代码能自动给每个连接点编号,还能自动连线,帮你快速定位连接点。
Sub 批量给连接点编号()
'1. 先选中一个形状(比如复杂的自选形状)
Dim 目标形状 As Shape, 连接符 As Shape, 文本框 As Shape
Dim j As Integer, bx As Double, by As Double
'2. 判断是否选中了形状
If ActiveWindow.Selection.ShapeRange.Count = 0 Then
MsgBox "请先选中一个形状!"
Exit Sub
End If
Set 目标形状 = ActiveWindow.Selection.ShapeRange(1)
'3. 设定编号文本框的位置(在形状右侧)
With 目标形状
bx = .Left + .Width + 50
by = .Top + .Height + 50
End With
'4. 循环给每个连接点编号,并画连接线
With ActiveSheet
For j = 1 To 目标形状.ConnectionSiteCount '循环所有连接点
'创建连接符,连接到当前连接点
Set 连接符 = .Shapes.AddConnector(msoConnectorElbow, bx, by, bx + 50, by + 50)
With 连接符.ConnectorFormat
.EndConnect 目标形状, j '连接目标形状的第j个连接点
.Type = msoConnectorElbow '折线连接符
.Line.ForeColor.RGB = RGB(255, 0, 0) '红色线条,醒目
End With
'创建文本框,显示连接点编号
Set 文本框 = .Shapes.AddTextbox(msoTextOrientationHorizontal, 连接符.Left, 连接符.Top, 36, 14)
With 文本框
.Fill.Visible = False '无填充
.Line.Visible = False '无线条
.TextFrame.Characters.Text = j '显示编号
End With
Next j
End With
MsgBox "编号完成!每个红色线条对应一个连接点编号~"
End Sub
解读:运行代码前,先选中你要编号的形状,代码会自动循环所有连接点,用红色折线连接,并在旁边显示编号,再也不用猜连接点是多少了[superscript:2]。
用法4:判断连接符是否绑定了形状(避坑必备)
场景:批量处理连接符时,需要判断哪些连接符已经绑定了形状,哪些是空白的,避免重复操作。
Sub 判断连接符状态()
Dim 连接符 As Shape
'循环工作表中所有连接符
For Each 连接符 In ThisWorkbook.Worksheets("Sheet1").Shapes
'判断是否是连接符
If 连接符.Connector Then
With 连接符.ConnectorFormat
'判断起点和终点是否绑定形状
If .BeginConnected And .EndConnected Then
Debug.Print 连接符.Name & ":已绑定两个形状"
ElseIf .BeginConnected Then
Debug.Print 连接符.Name & ":只绑定了起点形状"
ElseIf .EndConnected Then
Debug.Print 连接符.Name & ":只绑定了终点形状"
Else
Debug.Print 连接符.Name & ":未绑定任何形状"
End If
End With
End If
Next 连接符
MsgBox "判断完成!请查看VBA编辑器的“立即窗口”(按Ctrl+G调出)"
End Sub
解读:核心是BeginConnected和EndConnected两个属性,返回“True”就是绑定了形状,“False”就是未绑定,批量处理时超实用[superscript:2]。
必背!ConnectorFormat核心属性+方法(精简版,不记等于白学)
不用死记硬背,收藏这张表,用到的时候翻一翻,比查微软官方文档还方便(官方文档太晦涩,谁看谁头大)!
类型
名称
人话解读(小白必看)
方法(能做什么)
BeginConnect
给连接符绑定“起点形状”和连接点
EndConnect
给连接符绑定“终点形状”和连接点
BeginDisconnect
断开连接符的起点绑定
EndDisconnect
断开连接符的终点绑定
属性(是什么样子)
BeginConnected
判断起点是否绑定了形状(True/False)
EndConnected
判断终点是否绑定了形状(True/False)
BeginConnectionSite
返回起点的连接点编号(比如1、2、3)
EndConnectionSite
返回终点的连接点编号(比如1、2、3)
Type
设置/返回连接符类型(直线、折线、弧线)
实战案例:用ConnectorFormat画一个简易流程图(全程自动化)
光说不练假把式,结合上面的用法,给大家写一个完整的实战代码,运行后直接生成一个“工作流程”示意图,连线条带形状全自动化,复制就能用!
Sub 自动生成简易流程图()
'生成:开始 → 处理 → 审核 → 完成 流程图
Dim 工作表 As Worksheet
Dim 形状(1 To 4) As Shape, 连接符(1 To 3) As Shape
Dim i As Integer
'指定工作表
Set 工作表 = ThisWorkbook.Worksheets("Sheet1")
'清空工作表中的形状(避免干扰,可注释)
worksheet.Shapes.Delete
'1. 创建4个形状(开始、处理、审核、完成)
Set 形状(1) = 工作表.Shapes.AddShape(msoShapeOval, 100, 50, 100, 50) '圆形:开始
Set 形状(2) = 工作表.Shapes.AddShape(msoShapeRectangle, 250, 50, 100, 50) '矩形:处理
Set 形状(3) = 工作表.Shapes.AddShape(msoShapeRectangle, 400, 50, 100, 50) '矩形:审核
Set 形状(4) = 工作表.Shapes.AddShape(msoShapeOval, 550, 50, 100, 50) '圆形:完成
'2. 给形状添加文字
形状(1).TextFrame.Characters.Text = "开始"
形状(2).TextFrame.Characters.Text = "处理"
形状(3).TextFrame.Characters.Text = "审核"
形状(4).TextFrame.Characters.Text = "完成"
'3. 创建3个连接符,连接4个形状
For i = 1 To 3
Set 连接符(i) = 工作表.Shapes.AddConnector(msoConnectorStraight, 0, 0, 0, 0)
With 连接符(i).ConnectorFormat
.BeginConnect 形状(i), 2 '起点:前一个形状的右侧连接点(编号2)
.EndConnect 形状(i + 1), 4 '终点:后一个形状的左侧连接点(编号4)
连接符(i).RerouteConnections '自动优化路径
End With
'美化线条
With 连接符(i).Line
.ForeColor.RGB = RGB(0, 128, 0) '绿色线条
.Weight = 2 '粗细2磅
End With
Next i
MsgBox "流程图生成完成!移动任意形状,线条会自动跟随~"
End Sub
运行代码后,你会发现:4个形状和3条连接线自动生成,不管你把哪个形状拖到哪里,连接线都会自动调整,不用手动碰一下,效率直接拉满!
最后总结:ConnectorFormat的核心价值,就是“省时间”
其实ConnectorFormat不算VBA里的“高阶知识点”,但它绝对是“最实用的知识点”之一——很多人觉得它没用,只是因为没遇到需要批量画流程图、批量处理连接符的场景。
等你需要画复杂示意图、批量调整连接关系时,就会发现:学会ConnectorFormat,能帮你节省80%的手动操作时间,不用再熬夜调整线条,也不用因为老板改需求而崩溃。
记住:VBA的核心不是“炫技”,而是“偷懒”——把重复、繁琐的工作交给代码,你只需要专注于更重要的事情。
最后,给大家留一个小作业:把上面的实战代码复制到VBA编辑器,运行后,尝试修改连接符类型(把直线改成弧线),再调整形状的连接点编号,看看线条会发生什么变化~
如果运行代码时遇到报错,或者有其他疑问,评论区留言,我会一一回复,帮你解决!
另外,收藏这篇文章,下次画流程图、连线条时,直接翻出来抄代码,省时又省力!
最后求个点赞,你的支持,就是我持续分享VBA干货的动力,下期咱们讲更实用的VBA技巧,不见不散