Excel VBA: Index = ZOrderPosition в коллекции Shapes?

Индекс фигуры в коллекции Shapes рабочего листа всегда совпадает с его ZOrderPosition? (В принципе нельзя напрямую спрашивать об индексе данной формы).

Я подтвердил, что это верно в нескольких случаях (до 3000 фигур), но я не нашел документации по этому вопросу.

Я просмотрел всю коллекцию, выяснив возможные различия между Index и ZOrderPosition:

Sub dump_shapes()
' Dump information on all shapes in a Shapes collection
    Dim shc As Shapes
    Set shc = ActiveSheet.Shapes
    Dim shp As Shape
    For Each shp In shc
      Dim sh2 As Shape
      Set sh2 = sh2idxzosh_shc(shp)
      Dim zoidx As Long
      ' The second argument is not actually the Index, but since we are traversing the 
      ' whole collection, and Index and ZOrderPosition are at most permutations, we are
      ' covering all of the possible Indexes.
      zoidx = idx2zo_shc(shc, shp.ZOrderPosition)
    Next shp
End Sub

Функции, используемые для запроса, показаны ниже. Поскольку предупреждение в MsgBox'ах никогда не появляется, это означает, что Index = ZOrderPosition, для оцененных случаев.

' Functions between the set of shapes S and the set of natural numbers N.
' O=ZOrderPosition : S -> N  (function exists)
' D=From Index : N -> S  (function exists)
' D^-1=Index : S -> N  (function does not exist)
' f=OoD : N -> N  (can be constructed; this is expected to be only a permutation, 
'  i.e., bijective)
' g=DoO : S -> S  (can be constructed)

Function sh2idxzosh_shc(ByRef sh As Shape) As Shape
    Dim shc As Shapes
    Set shc = sh.Parent.Shapes
    Dim zo As Long
    zo = sh.ZOrderPosition
    Dim sh2 As Shape
    Set sh2 = shc(zo)
    ' g=DoO : S -> S
    ' Test Shape : g(S)=S for all s? If so, g=DoO=I ; D=O^-1 ; D^-1=O. Thus, the Index 
    '  is equal to the ZOrderPosition.
    ' Use ZOrderPosition to test Shape : O(g(s))=O(s) for all s? I.e., OoDoO=O? If so, 
    '  given that O is bijective, OoD=I ; D=O^-1 ; D^-1=O. Thus, the index is equal to 
    '  the ZOrderPosition.
    Dim zo2 As Long
    zo2 = sh2.ZOrderPosition
    If (zo2 <> zo) Then
      MsgBox ("Compound ZOrderPosition: " & zo2 & ", ZOrderPosition: " & zo)
    End If
    Set sh2idxzosh_shc = sh2
    'Set sh2 = Nothing
End Function

Function idx2zo_shc(ByRef shc As Shapes, idx As Long) As Integer
    Dim sh As Shape
    Set sh = shc(idx)
    Dim zo As Long
    zo = sh.ZOrderPosition
    ' f=OoD : N -> N
    ' Test index : f(i)=i for all i? If so, f=OoD=I ; D=O^-1 ; D^-1=O. Thus, the Index is 
    '  equal to the ZOrderPosition.
    If (zo <> idx) Then
      MsgBox ("Index: " & idx & ", ZOrderPosition: " & zo)
    End If
    idx2zo_shc = zo
End Function

PS: я адаптировал функции для коллекции ChartObjects на рабочем листе, и эквивалентность Index = ZOrder также была проверена.

PS2: Можно спросить, является ли это типичным (или даже гарантированным) для любой коллекции. ВExcel VBA: непоследовательная нумерация ZOrderPosition в коллекции Shapes Я сообщил о случае, когда не только это не так, но Index и ZOrderPosition даже не являются перестановками (обратите внимание, что это была коллекция Shapes Shape, связанной с ChartObject, случай, отличный от упомянутого выше).

редактировать: См. Редактировать вExcel VBA: как получить ссылку на форму из ChartObject.

Ответы на вопрос(1)

Ваш ответ на вопрос