我希望我使用的是正确的 SE。我找到的帖子引导我在这里发帖。
BLUF:我正在尝试使用 if/else 语句在 PowerPoint 中的特定对象上应用/删除脉冲动画。
背景:代码位于 excel 文档中,因为我将其用作简单的基本比喻防火墙,以防止员工弄乱幻灯片。我想要一个实时更新的文档,将信息推送到正在运行的 PowerPoint 幻灯片中,并根据特定站点的状态(向上或向下)更新文本。我制作了一个简单的向上/向下按钮,该按钮仅在单元格中的向上/向下之间切换,并将其输入到其他单元格中以确定如何处理数据。然后,宏按钮运行代码并更新 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 语句贯穿我调出特定幻灯片、形状和形状文本的单元格。friendlyname 是重复运行 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 文档的图片:
答案1
在和朋友商量之后,我能够让事情顺利进行,而且我自己还添加了一些额外的趣味。
以下是使动画正常运行的代码:
'新变量 暗淡的时间戳文本 效果图 Dim oshp 作为 PowerPoint.Shape 视作 PowerPoint 幻灯片 '添加效果 设置 oshp = pApp.ActivePresentation.Slides(shapeslide).Shapes(shapename) 使用 pPreso.Slides(shapeslide) 设置 oeff = .TimeLine.MainSequence.AddEffect(Shape:=Shapes(shapename),effectID:_ =msoAnimEffectFlashBulb,触发器:=msoAnimTriggerWithPrevious) 使用 oeff '持续 60 秒幻灯片 .Timing.重复持续时间 = 60 结尾 结尾
然后是摆脱这些动画的部分(感谢 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 那么 删除 万一 接下来我 万一
希望这对一些人有所帮助。
作为奖励,我在幻灯片中添加了一个时间戳,以便我可以看到上次使用此代码更新状态的时间(对象是所有幻灯片上的文本框 28,时间戳是 Excel 中单元格 H25 中的“NOW()”函数):
注意:这是在主 For 循环内,但在主 If/Else ="DN" 之外
时间戳文本 = (Sheet1.Range(“H”&25)。文本) pPreso.Slides(shapeslide).Shapes("文本框 28").TextEffect.Text = timestamptext