我希望我在正确的SE中。我发现的帖子指示我在此处发布。
BLUF:我正在尝试使用if / else语句在PowerPoint中的特定对象上应用/删除脉冲动画。
背景:该代码存在于excel文档中,因为我将其用作简单的基本图形防火墙,以防止员工弄乱幻灯片。我需要一个实时更新的文档,该文档可将信息推送到正在运行的PowerPoint幻灯片中,并更新有关特定站点状态的状态(向上或向下)的文本。我做了一个简单的上/下按钮,该按钮仅在单元格中的UP / DN之间切换,并将其馈送到其他单元格中以确定如何处理数据。宏按钮将运行代码并更新PowerPoint上的文本。
好消息:除了动画之外,一切都很好。PowerPoint运行时,文本会更改(单词和颜色),并且锁定Excel文档可防止员工弄乱任何设置。
有问题的代码的主要部分:
For Each c In Sheet1.Range("a2:a" & Sheet1.Range("a" & Rows.Count).End(xlUp).Row)
shapeslide = Sheet1.Range("a" & c.Row)
shapename = Sheet1.Range("b" & c.Row)
shapetext = (Sheet1.Range("c" & c.Row).Text)
friendlyname = Sheet1.Range("d" & c.Row)
pPreso.Slides(shapeslide).Shapes(shapename).TextEffect.Text = shapetext
If (friendlyname = "DN") Then
pPreso.Slides(shapeslide).Shapes(shapename).TextFrame.TextRange.Font.Color.RGB = RGB(255, 0, 0)
'The porttion below worked, but it is not animation (not as cool)
'pPreso.Slides(shapeslide).Shapes(shapename).TextEffect.PresetTextEffect = 4
'pPreso.Slides(shapeslide).Shapes(shapename).TextEffectFormat = msoAnimEffectBoldFlash
Else
pPreso.Slides(shapeslide).Shapes(shapename).TextFrame.TextRange.Font.Color.RGB = RGB(0, 255, 0)
End If
Next c
for语句遍历单元格,在这些单元格中,我会调用特定的幻灯片,形状和形状文本。友好名称是运行IF / Else的重复名称。
如果将状态更改为DN,它会变成红色,如果将其更改为UP,它会变成绿色。
我可以使用If / Else中的以下代码来应用动画:
Dim oeff As Effect
Dim osld As Shape
Set osld = ppapp.ActivePresentation.Slides(shapeslide).Shapes(shapename)
With pPreso.Slides(shapeslide)
Set oeff = .TimeLine.MainSequence.AddEffect(Shape:=.Shapes(shapename),_ effectID:=msoAnimEffectBoldFlash, trigger:=msoAnimTriggerAfterPrevious)
With oeff
.Timing.RepeatDuration = 25
End With
End With
主要问题是(可以理解)它连续应用动画,因为显然没有检查是否在此代码中应用过。其次,当我尝试介绍oeff.delete时,它只是离开了动画,然后将非动画应用于PowerPoint动画窗格中标记为“ UP”的所有其他动画。
因此,有两件事:
是否可以应用脉冲动画?我在msoAnimEffect库区域中找不到它。
有人使用我创建的这种方法可以优雅地打开或关闭动画吗,还是我需要找出一种方法来设置标志,读取这些标志,然后以某种方式将其合并到If / Else语句中?
这是Excel Doc的图片:
与朋友商量后,我得以使事情顺利进行,并为自己添加了一些额外的香料。
这是使动画正常工作的代码:
'添加新的变量 Dim timestamptext Dim oeff作为PowerPoint.Effect Dim oshp作为PowerPoint.Shape Dim osld作为PowerPoint.Slide '添加效果 集oshp = pApp.ActivePresentation.Slides(shapeslide).Shapes(shapename) with pPreso.Slides(shapeslide) Set oeff = .TimeLine.MainSequence.AddEffect(Shape:= Shapes(shapename),effectID:_ = msoAnimEffectFlashBulb,trigger:= msoAnimTriggerWithPrevious) with oeff'Lasts for 60 second slide .Timing.RepeatDuration = 60 End With End With
然后是摆脱那些动画的部分(感谢CM!)
'删除效果 集osld = pPreso.Slides(shapeslide)'28 仅是因为我还有其他28个正在发生的动画, 如果osld.TimeLine.MainSequence.Count> 28则应保留,那么 对于i = osld.TimeLine.MainSequence.Count到29步骤-1 设置oeff = osld.TimeLine.MainSequence(i) 如果oeff.Shape.Name类似于shapename,则 oeff.Delete 结束如果 下一个i 结束,如果
希望这对那里的人们有所帮助。
另外,我在幻灯片上添加了时间戳,以便可以使用该代码查看状态的最后更新时间(对象是所有幻灯片上的文本框28,时间戳是Excel中的“ NOW()”函数)在单元格H25中):
注意:这在Main For循环内部,但在主要If / Else =“ DN”外部
timestamptext =(Sheet1.Range(“ H”&25).Text) pPreso.Slides(shapeslide).Shapes(“ Text Box 28”)。TextEffect.Text = timestamptext
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句