Excel.Shape бросая ArgumentException - PullRequest
       24

Excel.Shape бросая ArgumentException

0 голосов
/ 17 января 2020

У меня есть класс, который упаковывает 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

Система .ArgumentException: указанное значение выходит за пределы диапазона.

Это довольно запутанно, потому что строка в основном делает MyObject.Property = MyObject.Property & Something. При отладке я могу повторить ?MyShape.Name (что в любом случае только что было прочитано двумя строками выше в коде)

Я не совсем понимаю, к чему относится это исключение (оно не может найти фигуру с помощью index?), и почему присвоение свойства завершается неудачей.

Это код VB. Net, но я добавил тег VBA, так как подозреваю, что это проблема API Office.Interop.

1 Ответ

0 голосов
/ 18 января 2020

Если фигура защищена, ее можно перемещать программно, но нельзя переименовывать. Точно так же, как можно программно изменять содержимое ячеек защищенного листа, в то время как объединение / удаление ячеек требует снятия защиты листа.

Исправление заключается в снятии флажка protected в свойствах формы (или через Interop API ), или чтобы разблокировать сам лист.

...