【问题标题】:Shape.ReplaceShape() and programmatically migrate shapesheet cellsShape.ReplaceShape() 并以编程方式迁移 shapesheet 单元格
【发布时间】:2016-07-04 01:43:52
【问题描述】:

我必须编写一个应用程序,它会迭代 visio 绘图并替换形状。 我测试了新的 Visio 2013 API 方法 Shape.ReplaceShape() 并且这有效 迄今为止。 问题是,在调用 .ReplaceShape() 后,用户定义的单元格及其值不会复制到新形状中,我不知道,我该怎么做(优雅地)。

【问题讨论】:

    标签: c# vba visio


    【解决方案1】:

    Visio API 提供了执行此操作所需的内容。不幸的是,API 调用不允许您指定复制用户单元格,因此您必须自己进行复制。

    不是 C# 代码,更接近 VBA,但作为一个简单的方法应该足够好(下面有一个简化的假设):

    For idx = 0 to FromShp.RowCount(visSectionUser) - 1
        newRow = ToShp.AddRow(visSectionUser,visRowLast,visTagDefault)
        ToShp.CellsSRC(visSectionuser,newRow,0).formulaU = FromShp.CellsSRC(vissectionUser,idx,0).formulaU
    Next idx
    

    很遗憾,如果您的用户单元格引用形状的 shapesheet 中的其他单元格,除非它们是标准单元格(如对象单元格:宽度、高度等...),这对您来说会变得更加复杂。

    p>

    因此,如果您的旧形状具有引用的动作或划痕或几何单元格,则您必须适当地处理它。在尝试复制单元格之前,您可以检查它是否有先例单元格,并且根据您正在处理的形状的性质,您可以决定是否只复制值而不是公式,这可能或者在新形状中可能不会无效。

    如果您的用户单元格仅引用其他用户单元格,那么您可以在复制任何公式之前在 ToShp 中创建所有复制单元格,这样可以解决这种情况下的任何错误。但重点是,在复制公式之前,您需要确保单元格的任何先前行都可用。

    【讨论】:

    • 在我的例子中,我并没有真正对两个形状进行操作,因为 FromShp.ReplaceShape( ) 将主形状作为参数,并且在调用该方法之后,FromShp 有一个新的主形状。我试图做的是在一个集合中收集bevor ReplaceShape()所有用户定义的单元格(它们不引用shapesheet中的其他单元格),并在调用replace之后将它们添加到FromShp。但这不起作用,不知何故我无法将任何 Cell 添加到 FromShp 并且 Visual Studio 中的 com 错误太笼统了。我想,如果我先删除洞用户定义部分会更好,但这也不起作用。
    • 您应该将单元格添加到 ToShp。交换后 FromShp 将不再存在。如果错误表明发生了异常,通常是因为该形状不再存在。
    • 过失。 shape.ReplaceShape() 的工作方式是我的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2019-09-02
    • 2014-03-19
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多