提问人:Dnyanesh 提问时间:11/9/2023 最后编辑:Dnyanesh 更新时间:11/9/2023 访问量:32
ShapesRange.Group 方法失败 - 用于 powerpoint 的 VBA
ShapesRange.Group method fail - VBA for powerpoint
问:
我正在尝试将两个对象(矩形、椭圆形)分组到幻灯片上 我收到“运行时错误 -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*
我只是不明白为什么引用元素数组有效,而数组变量却不行?
感谢任何帮助。
谢谢
代表性代码见上文
答:
0赞
taller
11/9/2023
#1
您的代码成功合并了第 1 张幻灯片上的形状,因为只有第 1 张幻灯片上的形状。ShpCollection
MSPowPnt.Presentations("PPTName.pptx").Slides(1).Shapes.Range(ShpCollection).Group
但是,在那之后,也开始从其他幻灯片中收集形状。这意味着该方法的下一次运行将失败,因为它包含来自不同幻灯片的形状。ShpCollection
Group
- 若要解决此问题,应在循环开始时重置 。这将确保它仅保存您正在处理的当前幻灯片中的形状,并且分组操作将按预期工作。
ShpCollection
For
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...
Shapes
Slides(1)
For each Slide in PPT
For each Shape in Slide
0赞
Dnyanesh
11/9/2023
我测试了您的代码,它仍然给了我与上述相同的错误。显式将 ShpCollection 声明为 Array 后,它工作正常。请看上面彼得的建议
0赞
taller
11/9/2023
两者都在我的电脑上运行良好。Dim ShpCollection As Variant
Dim ShpCollection() As Variant
评论
ShpCollection
Dim ShpCollection() as Variant