Power Point (できれば2003) のスライドショー実行中に、

スライド画面に配置した「次のページに行く」ボタンを押す以外の操作では先のページに進まないようにするには、
どのようにVBAで制御すればいいですか?
たとえばクリックや右矢印ボタンでは先のページに進まないようにしたいのです。よろしくお願いいたします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2010/08/15 23:30:23
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:ken3memo No.1

回答回数317ベストアンサー獲得回数115

ポイント1000pt

質問を勝手に2つに分割してからチャレンジしてみました。

(それと バージョンが2007です)

1.クリックや右矢印ボタンでは先のページに進まないようにしたい

2.スライド画面に配置した「次のページに行く」ボタンを押すにコードを書く


1.クリックや右矢印ボタンでは先のページに進まないようにしたい

前、同じような質問

http://q.hatena.ne.jp/1278176601

[Powerpoint マクロ]

パワーポイントで、スライドショーを実行している間、特定の(例えば表示順が偶数番目の)スライドを表示したときに、外部の実行ファイルを動かしたいのですが、そのコードまたは、方法を記載しているWebページがあったら、教えていただけますでしょうか。Powerpointのバージョンは2002、WindowsXP上で動かします。

でコメントで答えたとき( http://q.hatena.ne.jp/1278176601#c181582 )

[PPT2000 アプリケーション レベルのイベント ハンドラーを作成します。

http://support.microsoft.com/kb/234184/ja

を参考にして、

Public WithEvents appevent As Application

なんて感じで、イベントを取得。

コイツを使ってみます。

こんな感じで、クラスモジュールを書く

[f:id:ken3memo:20100815223058j:image]

'下記は標準モジュールに(上記のClass1 の名前で作成したイベントを使う・結びつける)

Option Explicit

Dim myobject As New Class1  'イベント処理を記載したクラス(クラスモジュールに処理を記載)
Public nPage As Integer   'ページを動かしたくないので、現在ページを自分で管理

Sub スライドショーの開始()
    'イベントが取りたいので、Applicationとクラスモジュールの結びつけ
    Set myobject.appevent = Application
    
    ActivePresentation.SlideShowSettings.Run 'スライドショーの開始
End Sub
'クラスモジュールに書く Class1 の名前で作成
Option Explicit

' PPT2000 アプリケーション レベルのイベント ハンドラーを作成します。
' http://support.microsoft.com/kb/234184/ja を 参考にして WithEventsのテスト
Public WithEvents appevent As Application

Private Sub appevent_SlideShowBegin(ByVal Wn As SlideShowWindow)
'スライドショー開始時のイベント?
'ここで、いろいろと初期設定を行う?

    Debug.Print "_SlideShowBegin"
    nPage = 1  '初期化、1ページにする
End Sub

Private Sub appevent_SlideShowEnd(ByVal Pres As Presentation)
    MsgBox "end"
End Sub

Private Sub appevent_SlideShowNextClick(ByVal Wn As SlideShowWindow, ByVal nEffect As Effect)
    'MsgBox "SlideShowNextClick page=" & Wn.View.CurrentShowPosition
    Debug.Print "_SlideShowNextClick " & Wn.View.CurrentShowPosition 'ページ数
    
    'スライドショーのページを動かしたくないので、グローバル変数と比べる
    If nPage <> Wn.View.CurrentShowPosition Then 'ページが増えたり減ったりしたら
        Wn.View.GotoSlide nPage   '強制的に自分が管理しているページに戻す
    End If

End Sub

Private Sub appevent_SlideShowOnNext(ByVal Wn As SlideShowWindow)
    Debug.Print "_SlideShowOnNext " & Wn.View.CurrentShowPosition 'テストでページ数
End Sub

ポイントは・・

クラスモジュールに WithEvents を作り、イベント処理を書きます。

(イベントに対して、処理がかけます)

グローバル変数で nPage を作り、ページ数を自分で管理します。

スライドショーのページが変化したときのイベント

_SlideShowNextClick

内で、

現在ページと自分で管理したページを比べて、

'スライドショーのページを動かしたくないので、グローバル変数と比べる

If nPage <> Wn.View.CurrentShowPosition Then 'ページが増えたり減ったりしたら

Wn.View.GotoSlide nPage '強制的に自分が管理しているページに戻す

End If

なんて感じで、強引に元のページに戻してみました。

※少し、画面がちらついてしまいますが・・・

動作・テスト動画

http://www.youtube.com/watch?v=MzmQ_UntHjQ

(↑YouTubeの操作動画です、こんな感じでバカやって作成してました(笑))

2.スライド画面に配置した「次のページに行く」ボタンを押すにコードを書く

スライド画面に配置した「次のページに行く」ボタンを押す

を実現したかったので、

テキストボックスや図形を押したら、マクロを起動するようにしてみます。

テキストボックスには設定できなくて、

挿入 ―― 図形 ―― 動作設定ボタン で ボタンを配置してから、

ボタンを選択後・右クリックでマクロを結びつけます。

[f:id:ken3memo:20100815223057j:image]

ボタンが押されたら、

Sub pagenext()

    nPage = nPage + 1
    ActivePresentation.SlideShowWindow.View.Next

End Sub

が起動されます。

中身は、管理しているページを+1して(nPage = nPage + 1)

単純に、ActivePresentation.SlideShowWindow.View.Next で 次ページを表示します。

表示されると、

Private Sub appevent_SlideShowNextClick

が走りますが、

If nPage <> Wn.View.CurrentShowPosition Then

を比べても同じなので、そのまま通過します。

動作・テスト動画

http://www.youtube.com/watch?v=flY21okTKO8

(↑YouTubeの操作動画です、こんな感じでバカやって作成してました(笑))

終わりのあいさつ

少し、イヤ、かなり小細工 入ってますがこんな感じで、

クリックや右矢印 の 移動を殺して、設置したボタン(動作設定ボタン)で移動してみました。

PowerPoint2007ですが、2003に応用できるといいなぁ・・と思いつつ、失礼します。

んっ、こんな大がかりな仕掛けを作らなくても、スライドショーのパラメーター設定でできたりして、、

なんて少々不安だったり。※クリックで誤操作(意図しないで次に行く)の防止は なんとなく パワーポイントの機能でありそうな・・・そんな気もしつつ

id:lionfan

ken3memo様、ありがとうございます。

実に親切な図と開設で、たいへん助かりました。途中、2回ほどつまづいたのですが、キャプチャ図(ことに2番目の図と矢印)は助かりました。

おかげさまで、ばっちり動きました!! ありがとうございます!!

自分史上、最高のポイントをはずまさせていただきます!!

2010/08/15 23:29:33
  • id:ken3memo
    バージョン2003に応用できたみたいでよかったです。
    私も安心できました(もしかして、2007から使えるイベントや機能だったらと少し不安もあったし)
    ポイントは大切に使わせてもらいます。
    また、どこかでお会いした時は、よろしくお願いします。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません