最近は、企業の事務所内にも大きなモニターを利用したデジタルサイネージを見るようになりました。その目的の殆どは総務部による一方的な情報提供に終始してる部分もありますが、イントラネットやグループウェアでは伝わらないような情報提供にあります。

そんなデジタルサイネージシステムには、BrightSignデジサインのようなものが多いですが、正直価格は高いです(モニターはAmazonで調達するのが安いです)。

しかし、高価なこれらデジタルサイネージなど使わずとも、手元にあるものでこれらよりもずっと優れた作品を作る手段があります。それが、PowerPoint。動画もイケて自動で紙芝居も可能。けれど一歩踏み込んでPowerPoint VBAで仕込めばより高度でデータ処理も自動化できるサイネージが作れます。

今回使用するファイルや資料

事前準備

ワイド画面対応にする

通常、PowerPointでファイルを作成すると昔のアニメのように4:3で作成されてしまいます。しかし、最近のモニターは16:9で構成されていることが多く、そのままでは画面の両端に黒い帯が出来てしまい、格好が悪い。まずは作り始める前にPowerPointのスライドサイズを16:9のワイド画面対応にしましょう。

  1. デザインタブを開く
  2. スライドのサイズを開く
  3. ワイド画面(16:9)を選択する

図:16:9を使うようにしましょう

VBAを有効にしたpptmファイルにする

今回は動きのある動的なデジタルサイネージコンテンツとするため、ただの紙芝居ではなくVBAを利用するため、今回のファイルはpptx形式ではなく、pptm形式で保存してあげる(でないと、VBAコードを書いても排除されてしまいます)。

  1. ファイルタブを開く
  2. 名前を付けて保存を選択する
  3. 参照をクリックして保存先を選択
  4. その際のファイルの種類について「マクロ有効プレゼンテーション」を選ぶ
  5. 保存ボタンを押す

起動時にセキュリティ警告が出ることがありますが、コンテンツの有効化をクリックしてもらえれば問題ありません。

配置したテキストボックスの名前を調べる

VBAで動的にテキストボックスの値を書き換えたりするのが今回の目的の1つですが、PowerPoint上の各種パーツには表向きプロパティが見えません。しかし、これらのコントロール名が分からなければ、書き換えようがありません。実は表向き見えないだけで、各パーツ類にはきちんと自動でコントロール名が与えられている。

このコントロール名を以下のVBAで事前に調べておき、VBA内で指定して内容を書き換えます。ちなみにこのコントロール名はスライド単位であり、スライドをコピーするとコントロール名も同じ名前のままです。ファイル内では同じコントロール名のボックスがあることになりますが、スライド単位で指定するので、問題なくアクセスが可能です。

  1. 対象のパーツをクリックする
  2. 以下のコマンドを実行する。
  3. パーツの名前とIDが返ってくるので、控えておく。

OnSlideShowPageChangeのバグ対策

PowerPoint VBAを利用する上でぶつかる問題の1つに「スライド変更時にVBAを実行させる」特別なイベントにコードを書いても動かない事がある点です。2013の頃からあるバグで、OnSlideShowPageChangeという関数名で作るとそれが実行可能になっています。スライドの何枚目に来たら実行するのがポピュラーな使い方です。

VBAが実行されない理由はVBAプロジェクト画面にて、標準モジュールしかなく、対象のスライドが見えないというPowerPoint特有の問題があります。この問題の簡単な解決法はどのスライドでも良いので、適当にフォームコントロールを入れてあげること。こうする事でOnSlideShowPageChangeのメソッドがきちんと働くようになります。

  1. 適当なスライドを選択する
  2. 開発タブを開く(表示されていない場合には表示しておきましょう)
  3. ラベルコントロールなどの適当なコントロールを張り付ける
  4. Visual Basicを開く
  5. プロジェクトにSlide〇〇があればOKです。上書き保存しましょう。

図:プロジェクトにSlideがいるのを確認しましょう。

HDMIエクステンダーを準備する

今回は、VBAを利用した動的なデジタルサイネージをPowerPointで作成します。そのため、PCが必要になります。しかし、モニターに有線でPCをつなげて再生では、場所的な制約が出来てしまいます。そこで、PCは離れた場所から無線を使って表示内容を飛ばしてあげる仕組みを用意するとグッドです。

其のためのハードウェアがこのHDMIエクステンダー。自分が試してみた所、壁越しでもそこそこイケて、およそ30mはHDMIを無線化してもきちんと届きました。反応速度もMiracastやらAirPlayのようなWiFiベースよりずっと高速です。モニタ側にはHDMIエクステンダーのレシーバーとHDMIポートを接続。

PC側は送信用のHDMIトランスミッターをHDMIポートと接続します。二点間はペアリングして置きます。たったこれだけ。ClickShareのようなUSB出力ベースでも良いでしょう。中華製の安い品GUANYEEのHDMIエクステンダーですが、価格の割に結構使えています。

図:1PCで2画面に送れるスグレモノ

一歩踏み込んだ使い方

Excelのデータやグラフを流用する

Excelなどであらかじめデータの塊を準備しておき、それらをPowerPointに持ってくることで再利用することが可能です。またこの時、Excel側のデータを修正した場合には、リンクの更新(VBAであればPresentation.UpdateLinks)をすることで反映する事が可能です。Excel側のグラフをPowerPoint側に張り付ける手順は以下の通りです。

  1. Excel側のグラフをコピーする
  2. PowerPoint側の張り付けたいスライドに移動
  3. ホームタブの張り付けボタンの下の▼をクリック
  4. 形式を選択して貼り付けを選ぶ
  5. ダイアログでは、リンク貼り付けを選び、Excelグラフオブジェクトになっていることを確認
  6. OKを押すとリンク貼り付けがなされ、起動するたびに更新データを取りに行くか?聞くようになる。
  7. この時、グラフの背景色などはExcel側のものが反映されるので、透過したい場合などはそちらで設定を変更しておくこと。

図:PowerPoint側はあくまでも土台

Google NewsのRSSからニュースフラッシュを作る

データを蓄積するExcel側に於いて、RSSデータを取得するコードを記述しておきます。ただし、VBAでRSSの解析をさせるのは凄く面倒臭いので、今回はRSS解析結果を返す、Google Apps Scriptを補助的に利用しています。

Google News RSS解析スクリプトのURL

上記のURLに於いて、param1に検索ワードを繋げれば、そのキーワードのニュースを取得し、RSSで返します。帰ってきたデータをExcelに蓄積しておきます。PowerPoint側はこの蓄積されてるデータを1枚のスライド内で、順番に書き換えてニュースフラッシュを実現します。

Google News RSSを取得するコード

下記のコードは、Excel側に記述しているコードです。

タイマーでスライドのテキストを書き換える

数分毎にデータを更新させる

デジタルサイネージの場合、どうしてもその内容が静的なものになりがち。その為、内容がリアルタイムではなく更新する為に都度手動で作業を行わなければなりません。今回、データ蓄積場所としてExcelシートを利用していますが、データの更新および再度PowerPointで再リンクを行う作業を、Timerを利用して動的に出来たら、動的なサイネージコンテンツを作れます。

但し、Timerの為に常にVBAが稼働した状況になるので、解除する為のコマンドを用意してあげないと、PowerPointを終了出来なくなるので、必ず装備しましょう。Custom UI Editorを利用すればPowerPointにもリボンを装備可能です。

Excel側のコード

5分毎に指定のコードを実行するように予約するコードです。

  • realtimegetterが5分毎に実行するコード。自分自身の起動を5分後に予約しています。次に実行されると、改めて5分後の予約が実行される仕組みです。
  • realtimestopperが予約を解除するコード。これがないと、VBAが動き続けてしまいます。

PowerPoint側のコード

PowerPoint側に上記のコードを記述しない理由は、データの塊はやはりExcelでやらせたほうが効率的であるのと、プレゼンテーション中はOnSlideShowPageChangeで動かすので、これだと複数の予約が毎回入ってしまう為。PowerPoint側はデータが更新の有無を問わず、同じフォルダ内にあるExcelファイルに接続して、データを処理する部分を用意してあげればオッケーです。

関連リンク

共有してみる: