Powerpoint VBA foreach跳过某些有效形状

Powerpoint VBA foreach跳过某些有效形状,vba,powerpoint,transparency,textrange,Vba,Powerpoint,Transparency,Textrange,我用背景湿巾做演示,背景湿巾是流程图形状,黄色湿巾用“湿巾”,蓝色湿巾用“湿巾”。在制作训练幻灯片的动画时,我将湿巾放在前面,透明度为0.75。一旦擦除动画顺序正确且擦除位置正确,我将以0透明度将擦除移动到文本后面。 我的Wipe_-Back宏工作正常,但每次调用时,我的Wipe_-Front宏仅获得部分擦除。我必须多次调用它才能使所有形状向前移动。宏几乎是一样的,所以我不确定我做错了什么,但我是VBA新手! 这两个宏如下所示,我也愿意接受关于代码中更优雅实践的建议 擦回(似乎有效): 前刮水器

我用背景湿巾做演示,背景湿巾是流程图形状,黄色湿巾用“湿巾”,蓝色湿巾用“湿巾”。在制作训练幻灯片的动画时,我将湿巾放在前面,透明度为0.75。一旦擦除动画顺序正确且擦除位置正确,我将以0透明度将擦除移动到文本后面。 我的Wipe_-Back宏工作正常,但每次调用时,我的Wipe_-Front宏仅获得部分擦除。我必须多次调用它才能使所有形状向前移动。宏几乎是一样的,所以我不确定我做错了什么,但我是VBA新手! 这两个宏如下所示,我也愿意接受关于代码中更优雅实践的建议

擦回(似乎有效):

前刮水器不能持续工作:

Sub Wipe_Front()
  Dim sld As slide
  Dim shp As Shape
  Dim str As String
  For Each sld In ActivePresentation.Slides
    For Each shp In sld.Shapes
        If shp.Type = msoAutoShape Then
            If shp.HasTextFrame Then
              If shp.TextFrame.TextRange = "wipey" Then
                'shp.Fill.Transparency = 0
                'shp.ZOrder msoSendToBack
                shp.Fill.Transparency = 0.75
                shp.ZOrder msoBringToFront
              End If
              If shp.TextFrame.TextRange = "wipeb" Then
                'shp.Fill.Transparency = 0
                'shp.ZOrder msoSendToBack
                shp.Fill.Transparency = 0.75
                shp.ZOrder msoBringToFront
              End If
            End If
        End If
    Next shp
  Next sld
End Sub

如果在For Each/Next循环中更改形状的顺序(就像更改z顺序一样)或删除它们,则结果将与预期不符

如果要删除形状,可以使用以下方法:

对于x=sld.Shapes.Count到1步-1 '如果sld.Shapes(x)符合您的条件,则删除它 下一个


如果更改z顺序,您可能需要收集对数组中形状的引用,并一次一个形状地遍历数组。

好的,明白了!Steve Rindsberg为我指出了正确的方向,我纠正了“下一步恢复时出错”的错误,现在例程正在做预期的事情。谢谢你的帮助

擦拭前部()

向后擦拭():


嗨,史蒂夫-你的回答让我离你越来越近了,但我还是犯了一些新手错误。下面是我尝试将句柄存储到动态数组中,然后提取它们以设置透明度和ZOrder。恭喜!
Sub Wipe_Front()
  Dim sld As slide
  Dim shp As Shape
  Dim str As String
  For Each sld In ActivePresentation.Slides
    For Each shp In sld.Shapes
        If shp.Type = msoAutoShape Then
            If shp.HasTextFrame Then
              If shp.TextFrame.TextRange = "wipey" Then
                'shp.Fill.Transparency = 0
                'shp.ZOrder msoSendToBack
                shp.Fill.Transparency = 0.75
                shp.ZOrder msoBringToFront
              End If
              If shp.TextFrame.TextRange = "wipeb" Then
                'shp.Fill.Transparency = 0
                'shp.ZOrder msoSendToBack
                shp.Fill.Transparency = 0.75
                shp.ZOrder msoBringToFront
              End If
            End If
        End If
    Next shp
  Next sld
End Sub
Sub Wipe_Front()
  Dim sld As slide
  Dim shp As Shape
  Dim str As String
  Dim wshps() As Shape, i As Long
  ReDim wshps(0 To 1)
  i = 0

  For Each sld In ActivePresentation.Slides
    For Each shp In sld.Shapes
        If shp.Type = msoAutoShape Then
            If shp.HasTextFrame Then
              If shp.TextFrame.TextRange = "wipey" Then
                Set wshps(i) = shp
                i = i + 1
                ReDim Preserve wshps(0 To i) As Shape
              End If
              If shp.TextFrame.TextRange = "wipeb" Then
                Set wshps(i) = shp
                i = i + 1
                ReDim Preserve wshps(0 To i) As Shape
              End If
            End If
        End If
    Next shp
    For Each wshp In wshps
      On Error Resume Next
      wshp.Fill.Transparency = 0.75
      wshp.ZOrder msoBringToFront
      'wshp.Fill.Transparency = 0
      'wshp.ZOrder msoSendToBack
    Next wshp
  Next sld
End Sub
Sub Wipe_Back_New()
  Dim sld As slide
  Dim shp As Shape
  Dim str As String
  Dim wshps() As Shape, i As Long
  ReDim wshps(0 To 1)
  i = 0

  For Each sld In ActivePresentation.Slides
    For Each shp In sld.Shapes
        If shp.Type = msoAutoShape Then
            If shp.HasTextFrame Then
              If shp.TextFrame.TextRange = "wipey" Then
                Set wshps(i) = shp
                i = i + 1
                ReDim Preserve wshps(0 To i) As Shape
              End If
              If shp.TextFrame.TextRange = "wipeb" Then
                Set wshps(i) = shp
                i = i + 1
                ReDim Preserve wshps(0 To i) As Shape
              End If
            End If
        End If
    Next shp
    For Each wshp In wshps
      On Error Resume Next
      'wshp.Fill.Transparency = 0.75
      'wshp.ZOrder msoBringToFront
      wshp.Fill.Transparency = 0
      wshp.ZOrder msoSendToBack
    Next wshp
  Next sld
End Sub