VBA中BeginConnect方法无法识别形状名称触发类型不匹配错误
VBA中连接符BeginConnect报类型不匹配的原因与修复
核心原因
- 你把形状的Name属性值和VBA对象变量名搞混了:给形状设置Name后,VBA不会自动生成同名的对象变量,直接写形状名当变量传参时,这个变量是未赋值的空值,和要求的Shape类型不匹配,自然报错。
- 对比能跑通的测试代码就会发现:测试代码里你提前用
Set Sector01_Node01 = 新建形状显式给对象变量赋了值,传参传的是真实的Shape对象,所以没问题。但正式代码里从来没定义、也没赋值过Sector00_Node01、Sector01_Node01这两个变量:- 生成S00节点的循环里,你一直用
Sector00_Node这一个变量接每次新建的节点,循环跑完这个变量只指向最后一个S00节点,没有任何变量对应名叫Sector00_Node01的形状。 - 生成S01节点的循环里,新建的节点是赋值给
Sector01_Node变量的,你只是把形状的Name改成了"Sector01_Node0"&i,并没有把这个对象赋值给叫Sector01_Node01的变量。
- 生成S00节点的循环里,你一直用
- 模块顶部没加
Option Explicit强制变量声明,导致未定义的变量不会在编译阶段报错,等到运行传参才炸。
修复步骤
- 先在所有VBA模块的最顶部加一行:
加完之后所有变量必须先声明再使用,后续再出现变量名写错、漏赋值的问题,点运行的时候直接就会提示,不用等到跑一半卡壳查半天。Option Explicit - 修改连接符绑定的代码,把不存在的对象变量替换成正确的引用:
' GENERATE NODE CONNECTIONS ----------------------------------------------------------- Set Sector01_Node_Connect = SectorNodes.AddConnector(msoConnectorStraight, 0, 0, 100, 100) With Sector01_Node_Connect.ConnectorFormat ' 从Shapes集合里按名称取S00的第一个节点,替换原来不存在的Sector00_Node01变量 .BeginConnect ConnectedShape:=SectorNodes("Sector00_Node01"), ConnectionSite:=1 ' 直接用当前循环已经赋值的Sector01_Node变量,就是刚创建的当前S01节点,不用额外找 .EndConnect ConnectedShape:=Sector01_Node, ConnectionSite:=1 End With
顺手优化的点
Set SectorSheet = Worksheets(1)、Set SectorNodes = SectorSheet.Shapes这两行现在写在循环里,每次循环都重复执行,挪到过程开头、循环外面就行,只需要赋值一次。- 现在连接符名称固定写死为
"C_S0_S1_1",如果rndNodeAmount_S01大于1,会报形状重名错误,把循环变量i拼到名称里即可,比如Sector01_Node_Connect.Name = "C_S0_S1_" & i。 - 如果后续需要S01节点连接不同的S00节点,建议生成S00节点时把所有节点对象存到数组或者Collection集合里,后续直接从集合取引用,比每次按名称从Shapes里找效率高,也不容易拼错名称。
内容的提问来源于stack exchange,提问作者phoenix
相关产品推荐
相关产品推荐

