Команды ActiveWindow VBA для доступа к активному слайду не работают в PowerPoint 2013, запущенном на виртуальной машине

Я только начал использовать 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

person Phil    schedule 05.05.2015    source источник
comment
Трудно предложить какую-либо значимую помощь, когда все, что у нас есть, - это отдельные строки кода, вырванные из контекста, и никакое объяснение того, что вы имеете в виду, не работает. Пожалуйста, объясните, что вы пытаетесь сделать, нужно ли вам это делать в режиме слайд-шоу или в обычном режиме (или в другом представлении), опубликуйте больше кода или создайте рабочий образец кода и полностью процитируйте все сообщения об ошибках.   -  person Steve Rindsberg    schedule 05.05.2015
comment
@SteveRindsberg Спасибо за ваш ответ. Я пытаюсь применить это к коду, с которым вы мне помогли ранее. Я добавил код и еще несколько примеров выше.   -  person Phil    schedule 06.05.2015
comment
опять же, слайд-шоу или нормальный вид (это имеет большое значение)? Цитируйте любые сообщения об ошибках, что означает неработоспособность? Ничего не произошло? Что-то происходит, но это не то, чего вы ожидали? Дым идет из задней части компьютера ...? ;-)   -  person Steve Rindsberg    schedule 06.05.2015


Ответы (1)


У меня была аналогичная проблема.

Попробуйте заменить:

ActiveWindow.View.Slide.SlideNumber 

с участием:

ActivePresentation.SlideShowWindow.View.Slide.SlideIndex 

Это было то, что мне было нужно в моем проекте, может быть, это поможет вам.

person Cae Guen    schedule 25.08.2015