【问题标题】:Deleting all shapes on a PowerPoint slide删除 PowerPoint 幻灯片上的所有形状
【发布时间】:2025-11-20 14:35:02
【问题描述】:

我正在尝试使用 VBA 删除 PowerPoint 形状上的所有幻灯片。我想做的只是:

For Each sld In ActivePresentation.Slides
    For Each sh In sld.Shapes
       sh.Delete
    Next 
Next

但这不会删除所有形状,如下图所示:(灰色箭头是我在运行下面的代码之前添加的形状,但也不会消失)

知道我做错了什么吗?

【问题讨论】:

  • 我觉得没问题,你是在什么情况下开始添加形状的?
  • 您在左侧幻灯片上看到的形状是手动添加的。在执行上述代码之前,我从代码中向幻灯片添加了两条箭头线,以查看它的行为方式。右侧幻灯片上的灰色线箭头是这些箭头之一。如果我从代码中添加形状或手动添加它们,都会出现问题。

标签: vb.net vba powerpoint


【解决方案1】:

这真的很有趣,我能够重现这个问题。我还首先尝试进行计数并遍历计数;然而,问题是那里有多少形状是实时刷新的。我的意思是,如果它在某个时间点将形状计算为 2 个形状,那么当删除一个形状时,那里只有 1 个形状。因此,您最好的选择是循环遍历每次删除第一个形状的形状计数。

For Each sld In ActivePresentation.Slides

    TotalShapes = sld.Shapes.Count

    For i = TotalShapes to 1 step -1 

        sld.Shapes(i).Delete

    Next

Next

谢谢, 肖恩·W.

【讨论】:

  • 我很高兴你能重现错误。不错的斑点。是否正确理解在 sh.Delete 调用之后,整个幻灯片被更新(并重新渲染到屏幕上),并且当 for each 循环尝试第二次迭代时,第二个索引处的形状现在是转移到第一个索引,因此不删除形状?在我看来似乎效率很低
  • 是的,您的理解似乎是正确的。这当然很奇怪。
  • 与是否重新渲染幻灯片无关;如果演示文稿是无窗口打开的(即屏幕上根本没有显示任何内容),也会发生同样的事情。更多的是在 For/Each 循环中,有一个隐式计数器。你本质上是在做 For x = 1 to What.Count。在循环的第一次迭代中,您删除了 Whatever(1)。在第二次迭代中,您删除了whatever(2),但是因为您已经删除了whatever(1),所以之前的whatever(2)现在是whatever(1),所以删除whatever(2)会删除之前的whatever(3),留下新的whatever(1),是whatever(2)
【解决方案2】:
typo: missing 0 in > 0

While ActivePresentation.Slides.Count > 0
      While ActivePresentation.Slides(1).Shapes.Count **> 0**
            ActivePresentation.Slides(1).Shapes(1).Delete
      Wend
      ActivePresentation.Slides(1).Delete
Wend

【讨论】:

    【解决方案3】:

    或者你可以说:

    sld.Shapes.Range.Delete
    

    【讨论】:

    • 你必须定义osld吗?如果我运行代码,我会收到“需要对象”错误(尽管我认为代码应该在选择范围时选择所有形状?)
    • 在 John 的例子中使用你的 sld 而不是 osld。
    【解决方案4】:
    For Each sld In ActivePresentation.Slides
        For x = sld.shapes.count to 1 step -1
           sld.shapes(x).Delete
        Next 
    Next
    

    【讨论】:

      【解决方案5】:

      我认为,最简单的方法是:

      while ActivePresentation.Slides.count>0
        while ActivePresentation.Slides(1).shapes.count>
          ActivePresentation.Slides(1).shapes(1).delete
        wend
        ActivePresentation.Slides(1).delete
      wend
      

      【讨论】: