This blog post contains a VBA macro macro that breaks each slide that has animation into multiple slides without preserving the original slides before the extended slides (as is the case with this answer ).
The problem that remains with this macro and another macro is that the contents of a text block with several animations are always displayed as a whole (for example, if each sentence of the same text block has a separate animation, all sentences will always be displayed together).
VBA Code :
Private AnimVisibilityTag As String Sub ExpandAnimations() AnimVisibilityTag = "AnimationExpandVisibility" Dim pres As Presentation Dim Slidenum As Integer Set pres = ActivePresentation Slidenum = 1 Do While Slidenum <= pres.Slides.Count Dim s As Slide Dim animationCount As Integer Set s = pres.Slides.Item(Slidenum) If s.TimeLine.MainSequence.Count > 0 Then Set s = pres.Slides.Item(Slidenum) PrepareSlideForAnimationExpansion s animationCount = expandAnimationsForSlide(pres, s) Else animationCount = 1 End If Slidenum = Slidenum + animationCount Loop End Sub Private Sub PrepareSlideForAnimationExpansion(s As Slide) ' Set visibility tags on all shapes For Each oShape In s.Shapes oShape.Tags.Add AnimVisibilityTag, "true" Next oShape ' Find initial visibility of each shape For animIdx = s.TimeLine.MainSequence.Count To 1 Step -1 Dim seq As Effect Set seq = s.TimeLine.MainSequence.Item(animIdx) On Error GoTo UnknownEffect For behaviourIdx = seq.Behaviors.Count To 1 Step -1 Dim behavior As AnimationBehavior Set behavior = seq.Behaviors.Item(behaviourIdx) If behavior.Type = msoAnimTypeSet Then If behavior.SetEffect.Property = msoAnimVisibility Then If behavior.SetEffect.To <> 0 Then seq.Shape.Tags.Delete AnimVisibilityTag seq.Shape.Tags.Add AnimVisibilityTag, "false" Else seq.Shape.Tags.Delete AnimVisibilityTag seq.Shape.Tags.Add AnimVisibilityTag, "true" End If End If End If Next behaviourIdx NextSequence: On Error GoTo 0 Next animIdx Exit Sub UnknownEffect: MsgBox ("Encountered an error while calculating object visibility: " + Err.Description) Resume NextSequence End Sub Private Function expandAnimationsForSlide(pres As Presentation, s As Slide) As Integer Dim numSlides As Integer numSlides = 1 ' Play the animation back to determine visibility Do While True ' Stop when animation is over or we hit a click trigger If s.TimeLine.MainSequence.Count <= 0 Then Exit Do Dim fx As Effect Set fx = s.TimeLine.MainSequence.Item(1) If fx.Timing.TriggerType = msoAnimTriggerOnPageClick Then Exit Do ' Play the animation PlayAnimationEffect fx fx.Delete Loop ' Make a copy of the slide and recurse If s.TimeLine.MainSequence.Count > 0 Then s.TimeLine.MainSequence.Item(1).Timing.TriggerType = msoAnimTriggerWithPrevious Dim nextSlide As Slide Set nextSlide = s.Duplicate.Item(1) numSlides = 1 + expandAnimationsForSlide(pres, nextSlide) End If ' Apply visibility rescan = True While rescan rescan = False For n = 1 To s.Shapes.Count If s.Shapes.Item(n).Tags.Item(AnimVisibilityTag) = "false" Then s.Shapes.Item(n).Delete rescan = True Exit For End If Next n Wend ' Clear all tags For Each oShape In s.Shapes oShape.Tags.Delete AnimVisibilityTag Next oShape ' Remove animation (since they've been expanded now) While s.TimeLine.MainSequence.Count > 0 s.TimeLine.MainSequence.Item(1).Delete Wend expandAnimationsForSlide = numSlides End Function Private Sub assignColor(ByRef varColor As ColorFormat, valueColor As ColorFormat) If valueColor.Type = msoColorTypeScheme Then varColor.SchemeColor = valueColor.SchemeColor Else varColor.RGB = valueColor.RGB End If End Sub Private Sub PlayAnimationEffect(fx As Effect) On Error GoTo UnknownEffect For n = 1 To fx.Behaviors.Count Dim behavior As AnimationBehavior Set behavior = fx.Behaviors.Item(n) Select Case behavior.Type Case msoAnimTypeSet ' Appear or disappear If behavior.SetEffect.Property = msoAnimVisibility Then If behavior.SetEffect.To <> 0 Then fx.Shape.Tags.Delete AnimVisibilityTag fx.Shape.Tags.Add AnimVisibilityTag, "true" Else fx.Shape.Tags.Delete AnimVisibilityTag fx.Shape.Tags.Add AnimVisibilityTag, "false" End If Else ' Log the problem End If Case msoAnimTypeColor ' Change color If fx.Shape.HasTextFrame Then Dim range As TextRange Set range = fx.Shape.TextFrame.TextRange assignColor range.Paragraphs(fx.Paragraph).Font.Color, behavior.ColorEffect.To End If Case Else ' Log the problem End Select Next n Exit Sub UnknownEffect: MsgBox ("Encountered an error expanding animations: " + Err.Description) Exit Sub End Sub
source share