
[code]

    With ActivePresentation.Slides(1).SlideShowTransition
        .Speed = ppTransitionSpeedFast
        .EntryEffect = ppEffectStripsDownLeft
        .SoundEffect.ImportFromFile "c:\sndsys\bass.wav"
        .AdvanceOnTime = True
        .AdvanceTime = 5
    End With
    
    ActivePresentation.SlideShowSettings.AdvanceMode = _
    ppSlideShowUseSlideTimings
        
    Next sld
    
    With ActivePresentation.Slides(2).SlideShowTransition
        .Speed = ppTransitionSpeedFast
        .EntryEffect = ppEffectStripsDownLeft
        .SoundEffect.ImportFromFile "c:\sndsys\bass.wav"
        .AdvanceOnTime = True
        .AdvanceTime = 10
    End With
    
    ActivePresentation.SlideShowSettings.AdvanceMode = _
    ppSlideShowUseSlideTimings
    
    Next sld
    
    With ActivePresentation.Slides(3).SlideShowTransition
        .Speed = ppTransitionSpeedFast
        .EntryEffect = ppEffectStripsDownLeft
        .SoundEffect.ImportFromFile "c:\sndsys\bass.wav"
        .AdvanceOnTime = True
        .AdvanceTime = 92
    End With
    
    ActivePresentation.SlideShowSettings.AdvanceMode = _
    ppSlideShowUseSlideTimings
        
    End Sub
    Sub 画面切り替え時間()
    
    End Sub
    
[/code]


CC BY-SA 4.0
2021-08-24T20:33:57.960
81024
2021-08-25T02:31:13.540
2021-08-24T23:58:24.670
3060
47839
question
vba powerpoint
コンパイル エラーです。: プロシージャの外では無効です。どこのエラーを修正すればよいのでしょうか？


  1. プロシージャの中に記述します。

プログラム特有の言い回しで、戻り値のない関数(=ひとまとまりの処理)のことをプロシージャ(procedure: 手続き)と呼ぶことがあります。  
また紛らわしいのですが、VBAではプロシージャのことを`Sub 画面切り替え時間()`のように`Sub`(Sub routineの略)から始まり`End
Sub`で終わるひとまとまりの処理として表現します。  
なので特定の処理を実行するにはプロシージャの中に記述することが通例です。  
(`Option Explicit`による宣言部などの例外もありますが、ややこしいので割愛します)

今回コンパイルエラーが発生する原因は、コメントにある通り下記のコードで「`Sub`がないのに`End Sub`がある」ことと「`Sub
画面切り替え時間()`の中に何も記述されていない」ことがエラーの原因ではないでしょうか。

[code]

    End Sub  '対応するSubがないのにEnd Subがある
    Sub 画面切り替え時間()
      '中に何もいませんよ
    End Sub
    
[/code]

  2. Next sldは不要です。

前回のご質問のサンプルコードを流用されたことと思いますが、`sld`はSlide型として宣言(Dimension)された変数です。  
下記のように`For Each`文で`sld`にスライドの各ページを代入して次のページに遷移する`For Each xxx ～ Next
xxx`の構文で表されるひとまとまりの処理は有効です。

[code]

    　Dim sld As Slide
    
    　For Each sld In ActivePresentation.Slides
        ' なにがしかの処理
      Next sld
    
[/code]

しかし`For Each`がないのに`Next sld`があると、「`Sub`がないのに`End Sub`がある」場合と同様にエラーとなります。

上記2点をふまえて下記のコードに書き換えるとコンパイルエラーを解消することができました。

[code]

    Sub 画面切り替え時間()
        With ActivePresentation.Slides(1).SlideShowTransition
            .Speed = ppTransitionSpeedFast
            .EntryEffect = ppEffectStripsDownLeft
            .SoundEffect.ImportFromFile "c:\sndsys\bass.wav" 
            .AdvanceOnTime = True
            .AdvanceTime = 5
        End With
    
        ActivePresentation.SlideShowSettings.AdvanceMode = _
        ppSlideShowUseSlideTimings
    
        With ActivePresentation.Slides(2).SlideShowTransition
            .Speed = ppTransitionSpeedFast
            .EntryEffect = ppEffectStripsDownLeft
            .SoundEffect.ImportFromFile "c:\sndsys\bass.wav" 
            .AdvanceOnTime = True
            .AdvanceTime = 10
        End With
    
        ActivePresentation.SlideShowSettings.AdvanceMode = _
        ppSlideShowUseSlideTimings
    
        With ActivePresentation.Slides(3).SlideShowTransition
            .Speed = ppTransitionSpeedFast
            .EntryEffect = ppEffectStripsDownLeft
            .SoundEffect.ImportFromFile "c:\sndsys\bass.wav" 
            .AdvanceOnTime = True
            .AdvanceTime = 92
        End With
    
        ActivePresentation.SlideShowSettings.AdvanceMode = _
        ppSlideShowUseSlideTimings
    
        'おまけ
        Call 引数で画面切り替え(4, 6)
        Call 引数で画面切り替え(5, 11)
        Call 引数で画面切り替え(6, 93)
    End Sub
    
    Sub 引数で画面切り替え(PageNo As Integer, AdvanceTime As Integer)
        With ActivePresentation.Slides(PageNo).SlideShowTransition
            .Speed = ppTransitionSpeedFast
            .EntryEffect = ppEffectStripsDownLeft
            .SoundEffect.ImportFromFile "c:\sndsys\bass.wav" 
            .AdvanceOnTime = True
            .AdvanceTime = AdvanceTime
        End With
    End Sub
    
[/code]

なお、おまけのように`Sub`関数は任意の場所から引数付きで呼び出すことができます。  
サンプルコードの 'おまけでは4ページ目から6ページ目にかけて6秒,11秒,93秒で画面切り替えのタイミングを指定しています。


CC BY-SA 4.0
2021-08-25T01:16:46.253
81027
2021-08-25T02:31:13.540
2021-08-25T02:31:13.540
9820
9820
81024
answer