Web、サーバ、ソフトウェア、バグ・脆弱性 などの情報を何人かで集まって書いていく IT/Web情報系ブログ

VBAを使ってパワポのスライドショーで「どこまで進んだか」を自動的に視覚化する

投稿日:   最終更新日:2017/08/08  投稿者:nk.

今年になってからというもの このブログも神記事量産体制に入ったようで、負けてられないという思いでクソ記事を書きます。

機会こそ多くないのですが、MSパワポ(Microsoft Office PowerPoint)を使って何らかの発表をするときがあります。
その際に最初に考えることは、いかに(発表の論旨の甘さをゴマカシつつ)印象に残らせるか。
そうなると、多少手の込んだ演出をしてみたくなるのが人のサガというものでしょう。
お堅い発表では使えない手ではありますが、少しぬるめの発表では使えそうなTipsを考えたので紹介したいと思います。

スライド内容を配布資料として配るとしても、できれば前を見てしっかり聴いてほしいですよね。配らないならなおさらです。
しかしまあヒトというものは生命の危険から解放されたせいかすぐ眠くなる生き物のようでして、人様が工夫して作ったスライド資料でもお構いなしに寝てしまうものです。
だからといって寝るなゴルァ!と怒鳴るわけにもいかないですし、それはしゃーない。寝られてしまうことはあきらめましょう。
むしろ問題は、つい寝てしまって目が覚めたときにどこまで発表が進んだかの把握に手間取られてしまうことではないでしょうか。
あれえ、いまどこまで進んだんだっけ?という経験は誰でもあるでしょう。
まあそういう体験の有無はともかく、そういったことで聴衆の認知資源をすり減らしたくない。100ミリ秒でも多く発表内容に注意を向けてほしい。

というわけで、発表がどこまで進んだかを視覚的にわかりやすくすることを今回の目的とします。
また、スライドを後から追加したり入れ替えたりしても手間がかからないよう、自動的に行われるようにします。
私自身、パワポにはそこまで詳しくないのでもっと効率的な手段があるかと思いますが、そこはご了承ください。

スポンサーリンク

パワポでVBA有効化

自動的に何かをさせるとなるとVBAを使うことになります。
デフォルトではパワポでVBAを使う準備ができていないため、使えるようにします。
デフォルトでは下のように、リボンと呼ばれる緑色で囲った部分に「開発」がないかと思います。
パワポ リボン未開発
「開発」を表示させるには、リボン左端の「ファイル」をクリックし、「オプション」を選択します。そして、「リボンのユーザー設定」で「開発」のチェックを入れ、「OK」をクリックするとリボンに「開発」が表示されます。
パワポ オプション画面
これでパワポでVBAを使う準備ができました。

スライドマスターに画像を埋め込む

基本的にすべてのスライドで発表の進捗状況を表示したいため、スライドマスターという機能を使います。
これはデザインのテンプレートのようなものです。たぶん。
スライドマスターの編集を行うには、リボンの「表示」をクリックして、「スライドマスター」をクリックします。
パワポ スライドマスター表示
スライドマスターの画面になりましたら、左のリストにあるなかで一番上のスライドを選択します。
そしてスライド上に画像ファイルをドラッグ&ドロップし、位置を調整します。今回は発表が進むにつれて右にネズミが進むようにしたい(つまり、横の位置は勝手に決まる)ので、とりあえず縦の位置だけ調整します。
今回は、犬のイラスト【フリー素材・今日もわんパグ】無料イラストの中から、絶妙なちょこまか具合を発揮しているネズミを使うことにしました。
パワポ スライドマスター編集
これまでの画像ではすでに「オブジェクトの選択と表示」がONになっていました。もし右カラムの「選択」が表示されていない場合、埋め込んだ画像を選択すると出てくる「図ツール」のリボンをクリックし、「オブジェクトの選択と表示」をONにします。
その後、該当の画像の名前を適当に決めます。今回はf7にしました。この名前はあとで使います。
パワポ 画像の名前入力
何もない上をネズミが歩いていたら何かの新興宗教よろしくなってしまうので、地面的な感じで動かない画像として芝を同様に埋め込み、名前を入力します。f8としました。
また、現在何ページ目か等を表示させるための吹き出しも追加しました。吹き出しは、「挿入」リボンの「図形」の中にあります。こちらの名前はt1としました。
これで必要な画像等の埋め込みは終わりです。

VBAコード入力

さていよいよ肝心のVBAコード入力です。
「開発」リボンの「Visual Basic」を選択し、VBA編集画面を起動します。
そして以下のコードを入力しましょう。

Sub OnSlideShowPageChange(ByVal ss As SlideShowWindow)
    Dim Image1 As String
    Dim Image2 As String
    Dim CText As String
    Image1 = "f7"
    Image2 = "f8"
    CText = "t1"
    
    If ActivePresentation.Slides(ss.View.CurrentShowPosition).Layout <> 1 Then
        Dim MaxS As Integer
        Dim Nps As Integer
        Dim MaxW As Integer
        
        MaxS = ActivePresentation.Slides.Count - 2
        Nps = ss.View.CurrentShowPosition - 2
        MaxW = ss.Presentation.PageSetup.SlideWidth - ss.Presentation.SlideMaster.Shapes(Image1).Width
        
        With ss.Presentation.SlideMaster
            .Shapes(Image1).Visible = msoCTrue
            .Shapes(Image1).Left = MaxW * Nps / MaxS
            .Shapes(Image2).Visible = msoCTrue
            .Shapes(CText).Visible = msoCTrue
            .Shapes(CText).Left = MaxW * Nps / MaxS
            .Shapes(CText).TextFrame.TextRange = Nps + 1 & " / " & MaxS + 1
        End With
    Else
        With ss.Presentation.SlideMaster
            .Shapes(Image1).Visible = msoFalse
            .Shapes(Image2).Visible = msoFalse
            .Shapes(CText).Visible = msoFalse
        End With
    End If
End Sub

コードの解説はしません。というかVBAはそこまでよくわかってないので解説できません。
まあぐぐればいろいろ出てきます。自分も気合でこんだけ書けたのでなんとかなるでしょう。なんとかしてください。

いくつか重要なところだけ抑えておきます。

「OnSlideShowPageChange」というのはスライドを切り替えた際に自動的に実行されるプロシージャです。

14行目でMaxSに代入する際に-2しているのは、先頭の発表タイトルスライドではネズミを表示させないようにするための-1と、そもそもこのCountプロパティの値は「スライド枚数」であり後の演算で調整するためにさらに-1する必要があるからです。

Image1やらImage2に代入する値は、つまりそういうことです。

この状態で適当にスライドを何枚か追加して再生すれば、ネズミがいま何枚目なのかを口走りつつ、スライドが進むごとに右に移動していくのが確認できるでしょう。

パワポ起動直後でも反映させたい

ただしこれでは不十分です。
パワポ起動直後(というか「開発」リボンから「Visual Basic」を起動させるまで)では、このOnSlideShowPageChangeが自動的には有効になっていません。
自動的に有効にするために、1枚目のスライドの表示領域外にActiveXコントロールを入れる必要があります。
パワポ コマンドボタン挿入
これで、ファイルを開くときにいきなりスライドショーを選択しても反映されます。

セクション名を表示させながら移動させたい

いま何ページ目なのかの代わりに、現在のセクション名を口走らせるには、以下のコードに変更します。

Sub OnSlideShowPageChange(ByVal ss As SlideShowWindow)
    Dim Image1 As String
    Dim Image2 As String
    Dim CText As String
    Image1 = "f7"
    Image2 = "f8"
    CText = "t1"
    
    If ActivePresentation.Slides(ss.View.CurrentShowPosition).Layout <> 1 Then
        Dim MaxS As Integer
        Dim Nps As Integer
        Dim MaxW As Integer
        Dim secName As String
        
        MaxS = ActivePresentation.Slides.Count - 2
        Nps = ss.View.CurrentShowPosition - 2
        MaxW = ss.Presentation.PageSetup.SlideWidth - ss.Presentation.SlideMaster.Shapes(Image1).Width
        
        secName = ActivePresentation.SectionProperties.Name(ActivePresentation.Slides(ss.View.CurrentShowPosition).sectionIndex)
        
        With ss.Presentation.SlideMaster
            .Shapes(Image1).Visible = msoCTrue
            .Shapes(Image1).Left = MaxW * Nps / MaxS
            .Shapes(Image2).Visible = msoCTrue
            .Shapes(CText).Visible = msoCTrue
            .Shapes(CText).Left = MaxW * Nps / MaxS
            .Shapes(CText).TextFrame.TextRange = secName
        End With
    Else
        With ss.Presentation.SlideMaster
            .Shapes(Image1).Visible = msoFalse
            .Shapes(Image2).Visible = msoFalse
            .Shapes(CText).Visible = msoFalse
        End With
    End If
End Sub

こちらのほうが実用的かもしれません。

問題点

スライド切り替え時に多少重くなります。
一部の画像をふんだんに使ったデザイン(例えば「回路」)だと見てわかるぐらい重くなります。
これはスライド切り替え時に動的に場所を移動させているせいでしょう。
スライド切り替え時にスライドマスター上の画像等を動かすのではなく、スライド追加時に画像等を追加し、その位置が自動的に調整されるようにすればこの問題は解決されるかと思います。
ただスライド枚数がかなり多い場合、スライド追加時に調整しようとするとその時にかなり重くなることが予想されます。
一長一短があるので使い分けできればよいでしょうね。
スライド追加時に云々するやり方はわからないので追々調べようかなと思っています。
それでは今日はここまで。

- VBA ,

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

関連記事はありませんでした