Я только начал использовать VBA несколько дней назад. Я заметил, что некоторые команды, похоже, не работают на моем компьютере, и мне было интересно, связано ли это с настройкой моего компьютера.
Я использую VBA в PowerPoint 2013 в Windows 7, запущенном через VMware Fusion (виртуальная машина) в MacOSX. Мне нужно создать динамическую ссылку на активный слайд, но несколько способов сделать это нарушили мой код:
Set oSl = Application.ActiveWindow.View.Slide
(как предлагается здесь)
Set oSl = ActivePresentation.Slides(ActiveWindow.View.Slide.SlideNumber)
(как предлагается здесь)
Set oSl = ActiveWindow.Selection.SlideRange.SlideIndex
(как предлагается здесь)
У меня ничего из этого не сработало. Поскольку я только начал использовать VBA, я просто вставлял окна сообщений после различных частей кода и смотрел, когда эти поля больше не срабатывают - в данном случае всегда после строки «oSl =», которую я заменил различными другими подходами, описанными выше. . Кроме того,
Set oSl = ActiveWindow.Selection.SlideRange(1)
также сломал мой код (как описано здесь)
То, что ДЕЙСТВИТЕЛЬНО работало до сих пор, было
Set oSl = ActivePresentation.SlideS(1)
Все вышеперечисленные методы, которые не работали (но должны) содержать ActiveWindow. Было бы здорово, если бы вы могли сообщить, есть ли ошибки в моем подходе к выбору активного слайда или проблема может заключаться в том, что VBA не может правильно получить доступ к «ActiveWindow», потому что мой PowerPoint работает на виртуальной машине. Если это так, есть ли другой способ выбрать текущий активный слайд без использования ActiveWindow?
РЕДАКТИРОВАТЬ: я пытаюсь применить это к следующему коду в PowerPoint. По сути, я хочу заменить строку «oSl = ActivePresentation.SlideS (1)» на строку кода, которая не всегда будет нацелена на слайд 1, а не на тот слайд, который активен в данный момент. Мой вопрос не столько в том, КАК это сделать - в Интернете есть множество инструкций, как это сделать. У меня вопрос: ПОЧЕМУ эти подходы у меня не работают.
Sub SelectionMacro()
Dim oSl As Slide
Dim oSh As Shape
Dim aArrayOfShapes() As Variant
Dim ShapeX As Shape
Dim N As Long
Dim Temp As Variant
Dim J As Long
Dim FadeEffect As Effect
Set oSl = ActivePresentation.SlideS(1)
'This section creates an array of all pictures on Slide1 called
'"aArrayOfShapes"
For Each oSh In oSl.Shapes
If oSh.Type = msoPicture Then
On Error Resume Next
Debug.Print UBound(aArrayOfShapes)
If Err.Number = 0 Then
ReDim Preserve aArrayOfShapes(1 To UBound(aArrayOfShapes) + 1)
Else
ReDim Preserve aArrayOfShapes(1 To 1)
End If
Set aArrayOfShapes(UBound(aArrayOfShapes)) = oSh
End If
Next
'This section creates a random index number within the bounds of the
'length of aArrayOfShapes and assigns the shape with that index number
'to the Shape object ShapeX
Randomize
NumberX = Int((UBound(aArrayOfShapes) - (LBound(aArrayOfShapes) - 1)) * Rnd) + LBound(aArrayOfShapes)
Set ShapeX = aArrayOfShapes(NumberX)
'This section shuffles aArrayOfShapes
For N = LBound(aArrayOfShapes) To UBound(aArrayOfShapes)
J = CLng(((UBound(aArrayOfShapes) - N) * Rnd) + N)
If N <> J Then
Set Temp = aArrayOfShapes(N)
Set aArrayOfShapes(N) = aArrayOfShapes(J)
Set aArrayOfShapes(J) = Temp
End If
Next N
'This section loops through all Shapes in aArrayOfShapes and
'fades them out one by one EXCEPT for ShapeX
For Each Shape In aArrayOfShapes
If ShapeX.Name <> Shape.Name Then
Set FadeEffect = oSl.TimeLine.MainSequence.AddEffect _
(Shape:=Shape, effectid:=msoAnimEffectFade, trigger:=msoAnimTriggerAfterPrevious)
With FadeEffect
.Timing.Duration = 0.5
.Exit = msoTrue
End With
End If
Next Shape
End Sub