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