ShapesRange.Group 方法失败 - 用于 powerpoint 的 VBA

ShapesRange.Group method fail - VBA for powerpoint

提问人:Dnyanesh 提问时间:11/9/2023 最后编辑:Dnyanesh 更新时间:11/9/2023 访问量:32

问:

我正在尝试将两个对象(矩形、椭圆形)分组到幻灯片上 我收到“运行时错误 -2147467259 (80004005) Shapes.Range:失败”

简而言之,我遍历演示文稿的每张幻灯片,通过过滤掉在数组中收集的剩余形状来丢弃占位符对象Shape.type <> msoPlaceholder

Dim ShpCollection as Variant
Dim i as integer, k as integer

For each Slide in PPT
i = 0
Redim ShpCollection(i)
    For each Shape in Slide
        if Shape.Type <> msoPlaceholder then
            Redim Preserve ShpCollection(i)
            ShpCollection(i) = Shape.Name
            i = i + 1
        end if
    Next Shape
    For k = 1 to 5000
        DoEvents 'to allow shapes to be 
    next k
    MSPowPnt.Presentations("PPTName.pptx").Slides(1).Shapes.Range(ShpCollection).Group  
    'MSPowPnt is a variable representing late binding of Powerpoint application
Next Slide

错误发生在行 -

MSPowPnt.Presentations("PPTName.pptx").Slides(1).Shapes.Range(ShpCollection).Group*

奇怪的是,下面的工作 -

MSPowPnt.Presentations("PPTName.pptx").Slides(1).Shapes.Range(Array(ShpCollection(0),ShpCollection(1) ).Group*

我只是不明白为什么引用元素数组有效,而数组变量却不行?

感谢任何帮助。

谢谢

代表性代码见上文

VBA 幻灯片

评论

0赞 PeterT 11/9/2023
是否确实要将幻灯片 2(或幻灯片 3 或 4)中的形状与幻灯片 1 上的形状组合在一起?
0赞 Dnyanesh 11/9/2023
对不起,从我的代码片段中不清楚。即使对于第一张幻灯片,代码也会失败,如上所述的错误。
1赞 PeterT 11/9/2023
即使你声明了 并把它作为一个数组使用,也试着显式地把它声明为一个数组:看看它是否有效ShpCollectionDim ShpCollection() as Variant
0赞 Dnyanesh 11/9/2023
嘿,彼得,这奏效了!
0赞 Dnyanesh 11/9/2023
我简直不敢相信我在变量名称之后的一对牙套上劈开了这么多头发!以下作品:将 ShpCollection() 调暗为变体非常感谢!

答:

0赞 taller 11/9/2023 #1

您的代码成功合并了第 1 张幻灯片上的形状,因为只有第 1 张幻灯片上的形状。ShpCollection

MSPowPnt.Presentations("PPTName.pptx").Slides(1).Shapes.Range(ShpCollection).Group

但是,在那之后,也开始从其他幻灯片中收集形状。这意味着该方法的下一次运行将失败,因为它包含来自不同幻灯片的形状。ShpCollectionGroup

  • 若要解决此问题,应在循环开始时重置 。这将确保它仅保存您正在处理的当前幻灯片中的形状,并且分组操作将按预期工作。ShpCollectionFor
Sub GroupAllShapes()
    Dim ShpCollection() As Variant
    Dim oSlide As Slide
    Dim i As Integer
    For Each oSlide In ActivePresentation.Slides
        i = 0
        ReDim ShpCollection(i)
        For Each Shape In oSlide.Shapes
            If Shape.Type <> msoPlaceholder Then
                ReDim Preserve ShpCollection(i)
                ShpCollection(i) = Shape.Name
                i = i + 1
            End If
        Next Shape
        oSlide.Shapes.Range(ShpCollection).Group
     Next oSlide
End Sub

评论

0赞 Dnyanesh 11/9/2023
对不起,从我的代码片段中不清楚。即使对于第一张幻灯片,代码也会失败,如上所述的错误,我在 Slides 集合中的每张幻灯片的循环中移动了位“i = 0 Redim ShpCollection(i)”,仍然收到相同的错误。正如我所提到的,Shapes.Range(Array(ShpCollection(0),ShpCollection(1)))。Group 确实有效,但 Shapes.Range(ShpCollection)。组没有,即使是第一张幻灯片。
0赞 taller 11/9/2023
请先测试我的代码,然后根据您的项目进行调整。 符合 的条件。顺便说一句,在你的片段中不起作用。MSPowPnt.Presentations("PPTName.pptx").Slides(1).Shapes...ShapesSlides(1)For each Slide in PPTFor each Shape in Slide
0赞 Dnyanesh 11/9/2023
我测试了您的代码,它仍然给了我与上述相同的错误。显式将 ShpCollection 声明为 Array 后,它工作正常。请看上面彼得的建议
0赞 taller 11/9/2023
两者都在我的电脑上运行良好。Dim ShpCollection As VariantDim ShpCollection() As Variant