Vb.net Excel.Shape异常

Vb.net Excel.Shape异常,vb.net,vsto,excel-interop,Vb.net,Vsto,Excel Interop,我有一个类包装了一个Excel.Shape 在我的一个函数(允许将形状从一张图纸移动到另一张图纸)中,我有以下代码: Private Property ThisShape As Excel.Shape Public Property Sheet As Excel.Worksheet Implements IShapeWrapper.Sheet Get If Not Me.HasShape Then Return Nothing Return Me._Sh

我有一个类包装了一个
Excel.Shape

在我的一个函数(允许将形状从一张图纸移动到另一张图纸)中,我有以下代码:

Private Property ThisShape As Excel.Shape

Public Property Sheet As Excel.Worksheet Implements IShapeWrapper.Sheet
    Get
        If Not Me.HasShape Then Return Nothing
        Return Me._Sheet
    End Get
    Set(value As Excel.Worksheet)

        If value Is Nothing Then Throw New ArgumentNullException(NameOf(value))
        If Not Me.HasShape Then Exit Property 'Throw New InvalidOperationException("Unable to assign sheet: This wrapper does not contain any shapes.")
        If value Is Me._Sheet Then Exit Property

        Try
            Dim TestShapeName As Excel.Shape = value.Shapes.Item(Me.ThisShape.Name)
            Throw New InvalidOperationException("The destination worksheet already contains a shape with the same name.")
        Catch ex As Exception
        End Try

        Me._Sheet = value

        VBMath.Randomize()
        Dim ShapeNamePrefix As String = $"AppName_{CInt(VBMath.Rnd() * 1000000)}_{Date.Now.Millisecond}_"
        Dim TempName As String = ShapeNamePrefix & Me.ThisShape.Name
        Me.ThisShape.Name = TempName
        Me.ThisShape.Cut()
        value.Paste()

        Me.ThisShape = Nothing
        For Each MyShape As Excel.Shape In value.Shapes
            If MyShape.Name = TempName Then
                Me.ThisShape = MyShape
                MyShape.Name = String.Concat(MyShape.Name.Skip(ShapeNamePrefix.Length))
                Exit For
            End If
        Next

        If Me.ThisShape Is Nothing Then Throw New ApplicationException("Unable to re-bind with shape after copy/pasting.")

    End Set
End Property
Private _Sheet As Excel.Worksheet
对于某些形状(实际上,总是同一个,这是我正在处理的50个形状中的一个)

MyShape.Name=String.Concat(MyShape.Name.Skip(ShapeNamePrefix.Length))
抛出
MyShape

System.ArgumentException:指定的值超出范围

这非常令人困惑,因为这行基本上是
MyObject.Property=MyObject.Property&Something
。调试时,我能够回显
?MyShape.Name
(代码中上面的两行刚刚读过)

我不明白这个异常指的是什么(它是否无法通过索引定位形状?),以及为什么分配属性失败


这是VB.Net代码,但我添加了VBA标记,因为我怀疑这是Office.Interop API问题。

如果形状受保护,可以通过编程方式移动,但不能重命名。就像可以通过编程更改受保护工作表的单元格内容一样,合并/取消合并单元格需要取消对工作表的保护


解决方法是在形状属性中取消选中受保护的
框(或通过),或解锁板材本身。

与其他形状相比,这一形状有什么不同?我仍然没有弄清楚。。!它们都由相同的对象包装和操作。
MyShape.Name
的有效形状和无效形状的实际字符串值是多少?如果
ShapeNamePrefix.Length
大于
MyShape.Name
,则会出现该错误。调试这些值,并查看此形状是否为真。这相当于说,在VBA中,
shp.Name=Mid(“Sid”,6,5)
所有形状都具有相同的长度(GUID和关键字的混合)。问题解决了,这是因为特定的形状被锁定了。有趣且令人困惑的是:在锁定时,究竟如何复制/粘贴形状而不重命名,以及
超出范围
如何转换为
属性被锁定
。。。