3

VBAを使い始めて数日。いくつかのコマンドが自分のコンピューターで機能しないように見えることに気付きました。これはコンピューターのセットアップが原因ではないかと考えていました。

MacOSX 上の VMware Fusion (仮想マシン) 経由で実行される Windows 7 上の PowerPoint 2013 で VBA を使用しています。アクティブなスライドへの動的参照を作成する必要がありますが、いくつかの方法でコードが壊れました。

Set oSl = Application.ActiveWindow.View.Slide

(ここで提案されているように)

Set oSl = ActivePresentation.Slides(ActiveWindow.View.Slide.SlideNumber)

(ここで提案されているように)

Set oSl = ActiveWindow.Selection.SlideRange.SlideIndex

(ここで提案されているように)

これらのどれも私にとってはうまくいきませんでした。VBA を使い始めたばかりなので、コードのさまざまな部分の後にメッセージ ボックスを挿入し、ボックスがいつトリガーされなくなったかを調べました。 . さらに、

Set oSl = ActiveWindow.Selection.SlideRange(1)

私のコードも壊れました(ここで説明したように)

これまでのDIDの仕事は

Set oSl = ActivePresentation.SlideS(1)

上記のすべてのメソッドには、「ActiveWindow」が含まれている必要がありますが、機能しませんでした。アクティブなスライドを選択する私のアプローチにエラーがあるかどうか、または PowerPoint が仮想マシン上で実行されているために VBA が "ActiveWindow" に適切にアクセスできないことが問題であるかどうかについて、アドバイスをいただければ幸いです。その場合、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
4

1 に答える 1

4

同様の問題がありました。

置き換えてみてください:

ActiveWindow.View.Slide.SlideNumber 

と:

ActivePresentation.SlideShowWindow.View.Slide.SlideIndex 

それは私のプロジェクトで必要なものでした。多分それはあなたを助けるでしょう.

于 2015-08-25T08:45:00.073 に答える