VBA如何按值将Visio Shape对象添加到数组中
Visio VBA数组存储Shape引用重复问题解决方案
问题根源
你现有代码直接读取的是模具BASFLO_U.vssx中Process母版的内置Shape实例,该实例全局唯一,每次修改属性都是操作同一个对象,数组存储的是该对象的引用,因此最终所有元素都与最后一次修改结果一致。
Visio不支持通过New Visio.Shape创建实例,需调用官方提供的Drop方法生成独立的Shape对象。
修复后代码
If rw3("PROCEDURE_ID_TRUE") = currPage Or rw3("PROCEDURE_ID_TRUE") = currPage Then ' 提前缓存母版对象,避免循环中重复读取模具提升性能 Dim processMaster As Visio.Master Set processMaster = AppVisio.Documents.Item("BASFLO_U.vssx").Masters.ItemU("Process") ' 调用Drop方法生成全新的独立Shape实例,示例放置在当前活动页,坐标可自定义 Dim ShapeObj2 As Visio.Shape Set ShapeObj2 = AppVisio.ActivePage.Drop(processMaster, 0, 0) ' 原有属性赋值逻辑保持不变 ShapeObj2.Name = Str(rw3("REGISTRATION_CONTROL_ID")) & "_Link" ShapeObj2.NameU = Str(rw3("REGISTRATION_CONTROL_ID")) & "_Link" ShapeObj2.Text = Str(rw3("REGISTRATION_CONTROL_ID")) & "_Link" Set prevPageLinks(i) = ShapeObj2 i = i + 1 End If
注意事项
- 若不需要生成的Shape显示在绘图中,可提前创建一个隐藏页面放置这些临时Shape,使用完成后统一删除即可
- 放置坐标可根据实际业务需求调整,不会影响Shape本身的属性存储效果
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

