You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:24:06