为宏生成的PPT幻灯片添加音效导致动画随机异常变更
问题:添加音效后PPT宏生成的动画序列异常
我正在制作一款游戏配套的演示文稿,用于展示玩家需达成的阶段(游戏本身无关)。每张幻灯片包含一个环形计时器(空心圆环),会在CycleTime时长内完成扫动,同时展示对应阶段的图片。由于存在诸多细节差异(如计时参数),幻灯片通过VBA宏自动生成。
未添加音效时,宏运行完全正常;但只要为任意动画效果添加音效,整个动画序列就会出现严重异常:
- 原本设置为**“与上一动画同时”的触发方式被自动改为“上一动画之后”**
- 动画时长被错误修改
- 淡入淡出效果丢失
我尝试过调整效果属性的赋值顺序、添加虚拟形状并为其绑定音效,均无法解决问题。
以下简化代码可复现该问题:同一子过程会在桌面生成两个单幻灯片演示文稿,二者本应仅音效存在差异,但实际动画表现完全不同。
Const CycleTime = 10 ' CycleTime = 环形计时器扫动完成的总秒数; ' 第一个形状在前半段周期显示,随后淡出并被第二个形状替换。 Dim fn$ Public Sub MakeTestPresentations() fn$ = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "Test@" & Format(Now(), "hhmmss") Call MakeASlide(UsingSound:=False) Call MakeASlide(UsingSound:=True) Exit Sub End Sub Sub MakeASlide(ByVal UsingSound As Boolean) Dim sldThis As Slide, swp As Shape, shp1 As Shape, shp2 As Shape ' 创建新的空白演示文稿 Set pptSource = Presentations.Add ' 添加空白幻灯片 Set sldThis = pptSource.Slides.Add(Index:=1, Layout:=ppLayoutBlank) ' 添加环形计时器形状,设置为CycleTime秒内完成扫动 Set swp = sldThis.Shapes.AddShape(msoShapeDonut, 525, 83, 369, 369) swp.Fill.ForeColor.RGB = RGB(0, 0, 128) sldThis.TimeLine.MainSequence.AddEffect(Shape:=swp, effectId:=msoAnimEffectWheel, Trigger:=msoAnimTriggerWithPrevious).Timing.Duration = CycleTime ' 添加第一个形状:前半段周期显示,带淡入淡出效果 Set shp1 = sldThis.Shapes.AddShape(msoShapeCloud, 83, 83, 369, 369) shp1.Fill.ForeColor.RGB = RGB(0, 255, 0) With sldThis.TimeLine.MainSequence.AddEffect(Shape:=shp1, effectId:=msoAnimEffectFade, Trigger:=msoAnimTriggerWithPrevious) .Timing.TriggerDelayTime = 0 .Timing.Duration = CycleTime / 2 If UsingSound Then .EffectInformation.SoundEffect.Name = "Laser" End With With sldThis.TimeLine.MainSequence.AddEffect(Shape:=shp1, effectId:=msoAnimEffectFade, Trigger:=msoAnimTriggerWithPrevious) .Timing.TriggerDelayTime = CycleTime / 2 .Exit = True End With ' 添加第二个形状:后半段周期显示,带淡入淡出效果 Set shp2 = sldThis.Shapes.AddShape(msoShape16pointStar, 83, 83, 369, 369) shp2.Fill.ForeColor.RGB = RGB(255, 0, 0) With sldThis.TimeLine.MainSequence.AddEffect(Shape:=shp2, effectId:=msoAnimEffectFade, Trigger:=msoAnimTriggerWithPrevious) .Timing.TriggerDelayTime = CycleTime / 2 .Timing.Duration = CycleTime / 2 If UsingSound Then .EffectInformation.SoundEffect.Name = "Drum Roll" End With With sldThis.TimeLine.MainSequence.AddEffect(Shape:=shp2, effectId:=msoAnimEffectFade, Trigger:=msoAnimTriggerWithPrevious) .Timing.TriggerDelayTime = CycleTime .Exit = True End With ' 保存演示文稿 pptSource.SaveCopyAs fn$ & IIf(UsingSound, " (带音效)", " (无音效)"), ppSaveAsDefault pptSource.Close Exit Sub End Sub
内容的提问来源于stack exchange,提问作者Laminator
相关产品推荐
相关产品推荐

