如何访问形状集合中元素的Row属性以实现泳道分组?
问题解决:访问形状集合元素Row属性报错
错误原因
allShpsColl.Item(j)返回的对象(无论是Excel或Visio中的Shape对象)本身并不直接提供Row属性,这是导致"Object doesn't support this property or method"错误的核心原因。需要根据你使用的Office应用(Excel/Visio),通过对应API获取形状对应的行号。
解决方案
场景1:Excel中的形状集合
Excel的Shape对象可以通过TopLeftCell.Row获取形状左上角所在单元格的行号,直接替换原代码中的属性调用即可:
修改后的循环代码:
For i = 1 To swimlaneCount For j = 1 To allShpsColl.Count ' 获取形状左上角对应的单元格行号 Dim shapeRow As Integer shapeRow = allShpsColl.Item(j).TopLeftCell.Row If GetSwimlaneNum(shapeRow) = i Then shpCount = shpCount + 1 ReDim Preserve rowShpsArr(1 To shpCount) rowShpsArr(shpCount) = allShpsColl.Item(j) End If Next j Next i
场景2:Visio中的泳道形状集合
Visio的Shape对象没有直接的行属性,需要通过形状的坐标(PinY)结合泳道高度(你函数中使用的9单位)计算行号:
修改后的循环代码:
For i = 1 To swimlaneCount For j = 1 To allShpsColl.Count Dim shp As Visio.Shape Set shp = allShpsColl.Item(j) ' 获取页面高度与形状的Y坐标(PinY以页面底部为原点) Dim pageHeight As Double pageHeight = shp.ParentPage.PageSheet.CellsU("PageHeight").ResultIU Dim pinY As Double pinY = shp.CellsU("PinY").ResultIU ' 根据泳道高度计算对应的行号(可根据实际布局调整计算逻辑) Dim lowRow As Integer lowRow = CInt(Int((pageHeight - pinY) / 9) + 1) If GetSwimlaneNum(lowRow) = i Then shpCount = shpCount + 1 ReDim Preserve rowShpsArr(1 To shpCount) rowShpsArr(shpCount) = shp End If Next j Next i
额外检查
- 确认
allShpsColl中的每个元素都是标准的Shape对象,而非其他类型的集合元素; - 如果你的泳道高度不是固定9单位,需要同步调整
GetSwimlaneNum函数中的数值。
内容的提问来源于stack exchange,提问作者Brian Babo
相关产品推荐
相关产品推荐

