Shape.Child属性为复制的组返回False

时间:2013-12-12 13:38:38

标签: vba vsto powerpoint

根据MSDN Shape.Child是“msoTrue,如果形状是子形状,或者形状范围内的所有形状都是同一父级的子形状。”

这似乎对新创建的组或重新分组的对象有效。但是,如果我创建了一组几个对象(在PPT 2010中的其他空白幻灯片上)和复制这个组我得到了

ActiveWindow.Selection.SlideRange(1).Shapes(1).GroupItems(1).Child = msoTrue

ActiveWindow.Selection.SlideRange(1).Shapes(2).GroupItems(1).Child = msoFalse

似乎为原始组副本的子形状重置Child属性。

我是否有损坏的安装或这是一个错误(使用已知的修复/解决方法)?

3 个答案:

答案 0 :(得分:2)

我也遇到过这个问题,所以我猜测这是一个错误。

解决方法

到目前为止,我发现的唯一解决方法是取消组合并重新组合感兴趣的小组:

Shape copiedGroup = ActiveWindow.Selection.SlideRange(1).Shapes(2); // this is the group whose children don't know they are children
Shape fixedGroup = copiedGroup.Ungroup().Regroup(); // now all children know their parent again

使用此修复程序,子项将返回msoTrue Child属性的ParentGroup,{{1}}将返回组形状。

<强>注意事项

如果之前选择了要修复的组,则现在将取消选择该组。

答案 1 :(得分:1)

我在不同的机器上看到同样的问题,NobodysNightmare也证实了这似乎是一个错误的有力证据。

我想到的另一种解决方法是迭代所有这样的形状。我不太喜欢这种方法,但似乎有效。

Function IsChild(s As Shape) As Boolean
    For i = 1 To s.Parent.Shapes.Count
        If s.Parent.Shapes(i).Type = msoGroup Then
            For j = 1 To s.Parent.Shapes(i).GroupItems.Count
                If s.Parent.Shapes(i).GroupItems(j) Is s Then IsChild = True
            Next
        End If
    Next
End Function

答案 2 :(得分:0)

我还发现,当复制分组的形状时,复制的形状往往会失去“父/子”属性或关系。 NobodysNightmare的解决方案效果很好。 因此,当我复制分组的形状时,我会做以下技巧。

sub CopyShape()
    dim sld1 as Slide, sld2 as Slide
    dim shp as Shape

    Set sld1 = ActivePresentation.Slides(1)
    Set sld2 = ActivePresentation.Slides(2)    ' the target slide to copy the shape on
    Set shp = sld1.Shapes("myShape")            ' the target shape

    shp.Copy
    With sld2.Shapes.Paste
        'if it's a group, ungroup and regroup the shape and name it again as before
        If shp.Type = msoGroup Then .Ungroup.Regroup.Name = shp.Name
        'Now the copied shape has recovered it's Parent/Child property
    End With
end sub