自動記録がない!? Powerpoint VBA お役立ちTips

最終更新日

仕事の依頼で、10年以上ぶりにPowerPointのマクロ・VBAを作成しました。

そこで、ものすごく驚いたことが1つ。

マクロの自動記録機能がない!

どうやら2007で隠しコマンド的になって、
2010からは完全に消えてしまったみたい…。

えー!!! どうすんのさ!

今ならググればいいと思うよ!

10年前は検索してもあまりヒットしなくて苦労しました。
今はたくさんのサイトにサンプルのコードがおいてあるので、自動記録機能がなくなってもなんとかカバーできそうです。

誰かの一助になればこれ幸い、ということで、今回VBAを書くにあたって使ったコードをまとめておきたいと思います。

昔がんばって作ったマクロのパスワードがわからなくなって
開けないから、コードが見られなくて参考にできない、
なんてことにならないようにね!

すみません、本当にすみません。

前提条件

Excel から PowerPoint をいじる VBA を作成しました。

ですので、以下は Excel の VBE 画面に記述する PowerPoint のコードです。

まずはじめに

Excel から PowerPoint を操作するためには、はじめに参照設定を行う必要があります。

VBE 画面の上部のメニューから 『ツール』 → 『参照設定』を選択。

出てきた『参照設定』のウィンドウで、『参照可能なライブラリファイル』から『Microsoft PowerPoint XX.X Object Library』を探してチェック。
『XX.X』は、Officeのバージョンによって異なります。

量が多いので、どれでもいいから1個選択した後にキーボードの『M』を押すと、頭文字が『M』で始まるところまで連れて行ってくれます。

チェックしたら『OK』で閉じて、コードの記述開始です。

Dim PPT As New PowerPoint.Application
Dim PRS As PowerPoint.Presentation
Dim SLD As PowerPoint.Slide

PowerPoint に関する宣言はだいたい上記の3つでしょうか。
以下は、これらの宣言をして、これ以下の『Set』を記入した上でのコードになります。

PowerPoint のファイルを開く

    Set PPT = CreateObject("PowerPoint.Application")
    PPT.Presentations.Open Cells(1, 1), ReadOnly:=True

現在アクティブのシートの Cells(1, 1) に記載してあるアドレスにあるPowerPoint のファイルを開きます。
読み取り専用(ReadOnly)でなくていい場合は、

    PPT.Presentations.Open Cells(1, 1)

のようにカンマ以下を消去するか、

    PPT.Presentations.Open Cells(1, 1), ReadOnly:=False

のように『ReadOnly』を『False』にします。

すでに開いているPowerPoint をいじりたい場合は、

    Set PPT = CreateObject("PowerPoint.Application")

の代わりに

    Set PPT = GetObject(, "Powerpoint.Application")

です。

知らなかったね! なぜか両方書いていたね!

うん、だって誰も教えてくれなかったから…。

Open で開いた PowerPoint ですが、

    PPT.WindowState = ppWindowMinimized

で最小化できます。
画面を見せたくない場合は追加するといいですね。
画面の最大化は

    PPT.WindowState = ppWindowMaximized

です。

スライドの選択

    Set PRS = PPT.ActivePresentation
    PRS.Slides(1).Select

で、特定の番号のスライド、この場合は1枚目のスライドへ移動。

    PPT.ActiveWindow.View.GotoSlide 1

でもOKです。

PowerPoint の設定でスライド開始番号を『1』以外にしていたとしても、『1』と指定すれば1枚目のスライドに移動します。

スライドのコピー

    PPT.ActiveWindow.Selection.SlideRange.Duplicate.MoveTo _
        toPos:=ActivePresentation.Slides.Count + 1

現在表示しているスライドのコピーを作る方法です。
『ActivePresentation.Slides.Count』で現在のスライドの枚数がわかります。
それよりも1枚あと、要するに、今あるスライドの一番最後にコピーを作成します。

画像として PowerPoint に貼り付ける

せっかく上で『SLD』を宣言したので、一応セットしておくと、

    Set SLD = PRS.Slides(1)

です。

あらかじめ Excel のセルの範囲などをコピーしておきます。
そのあとで

    SLD.Select
    SLD.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile, Link:=msoTrue

で PowerPoint に貼り付けができます。

DataType については以下の通りです。

  • ppPasteDefault デフォルトの形式
  • ppPasteBitmap BMP画像
  • ppPasteEnhancedMetafile 拡張メタファイル
  • ppPasteMetafilePicture メタファイル
  • ppPasteGIF GIF画像
  • ppPasteJPG JPG画像
  • ppPastePNG PNG画像
  • ppPasteText テキスト
  • ppPasteHTML HTML
  • ppPasteRTF RTF(リッチテキストファイル)
  • ppPasteOLEOb​​ject OLEオブジェクト
  • ppPasteShape 図形として

『Link』はリンク貼り付けについてです。
画像として PowerPoint に貼り付けたあと、ダブルクリックしたら該当の Excel に戻りますし、 Excel の方を修正したら PowerPoint に反映されます。
反面、 Excel のファイルと PowerPoint のファイルを一緒に置いていないとエラーが表示されたりしてちょっぴり厄介です。

  • msoTrue リンク貼り付けする
  • msoFalse リンク貼り付けしない(こっちが既定値)

作業に待ち時間を作る

PowerPoint のだけのVBAではありませんが、たくさんのシートに対して実行しているとエラーになることがあります。
移動の速度と処理が釣り合っていない場合などです。
そういう場合は『待ち』の時間を入れてあげるとエラーにならなかったりします。

   Application.Wait Now + TimeValue("0:00:01")

『Now』で現在の時間、『TimeValue(“0:00:01”)』が1秒です。
現在の時間 + 1秒後まで何もしない、となります。
『(“0:00:01”)』のところを変更すれば長さを変えられます。
1~3秒が妥当かな、と。
今回作成したものは300シートに対して同じ動作を行ったため、実行に必ず300秒以上かかるものになってしまいました。
ただ、これを入れないとエラーになってデバッグの画面になってしまうので、仕方ないですね。

1つ上の見出しで紹介した、『貼り付け』のあとなどに入れると効果的です。

貼り付けた画像を移動させる

   SLD.Shapes(SLD.Shapes.Count).Top = 230

スライドの一番最後のオブジェクトの上からの位置を『230』に移動します。

貼り付けたばかりのオブジェクトの番号は、そのスライド内のオブジェクトの中で一番最後になります。
なので、『SLD.Shapes.Count』でスライド内のオブジェクトの数を数えて、オブジェクトでその数を指定すれば、さっき貼り付けたばかりのオブジェクトを指定することになるわけです。

オブジェクトの位置などを調べる

上記の上からの位置『230』は…何の数なんでしょうか?
mmとかそういうのじゃなくて、なんかあるんでしょうね。

調べないんかい。

単位が何なのか調べるより、
置きたい場所に配置したあとで実際の高さを調べたほうが
実用的だと思いまして…。

調べ方ですが、 PowerPoint のVBE画面の『イミディエイトウィンドウ』を使います。
出ていない場合は、上のメニューの『表示』 → 『イミディエイトウィンドウ』で出します。

イミディエイトウィンドウに

?ActivePresentation.Slides(1).Shapes(1).Top

と入力して『Enter』を押せば、1枚目のスライドの1個目のオブジェクトの上からの位置が表示されます。
『?』ハテナを忘れずに。

ちなみに、『.Top』のところを変更すれば他のことがわかります。

  • .Top 上からの位置
  • .Left 左からの位置
  • .Width オブジェクトの幅
  • .Height オブジェクトの高さ

知りたいことがわかったら、コードに反映させましょう。

あと、

?ActivePresentation.PageSetup.SlideWidth
?ActivePresentation.PageSetup.SlideHeight

でスライド自体の幅と高さがわかります。

スライドの幅と高さがわかれば、

『.Top』 に ( スライドの幅 – オブジェクトの幅 ) / 2
『.Left』に ( スライドの高さ – オブジェクトの高さ ) / 2

を指定すると上下・左右でセンタリングされます。
センタリングの方法は他にもあるみたいなんですが、うまくできなかったのでこれで済ませました。

また調べないんかーい。

すみません、本当にすみません。(2回目)

スライド内のオブジェクトの番号を確認する方法

ちなみに、スライド内でのオブジェクトの番号を確認する簡単な方法は、

  1. スライドを表示する
  2. 余白などをクリックして、何も選択していない状態にする
  3. キーボードの『Tab』ボタンを押す

すると、スライド内の1番のオブジェクトから順番に次々選択されます。
知りたいオブジェクトが何番目に選択するか数えればいいわけです。

テキストボックスに文字を入力する

スライドに配置したテキストボックスに文字を入れる場合は、

    SLD.Shapes(1).TextFrame.TextRange.Text = "あいうえお"

です。
スライドの1個目のオブジェクトに『あいうえお』が入力されます。

スライドの1個目のオブジェクトが、テキストを入力できる状態のオブジェクトでない場合は、エラーになります。

『テキストを入力できる状態のオブジェクト』って何さ。

右クリックしたときに『テキストの編集』っていうメニューが出るオブジェクトかな…。

『あいうえお』の部分は、もちろん Excel のセルの内容を入れることもできます。
セルの番地を指定してあげてください。

他の画像を貼り付ける

先程は Excel の特定の範囲を画像として PowerPoint に貼り付けましたが、
今度は別で保存してある JPG の画像などを貼り付ける方法です。

    SLD.Shapes.AddPicture Cells(1, 1), msoFalse, msoTrue, 0, 160

今回は Excel のVBE 画面に書いているというていです。
アクティブシートの Cells(1, 1) に書いてあるパスの画像ファイルを貼り付けます。

その後の『msoFalse』はリンク貼り付けにするかどうかです。
しないので『msoFalse』にしています。

次の『msoTrue』は、リンク貼り付けにした場合に図を保存するかどうかだそうです。
前のリンク貼り付けを『msoTrue』にした場合に考えてください。
今回の場合はしていないので、その場合は『msoTrue』にするしかありません。

次の『0』は左からの位置である『Left』です。
貼り付けをしてから上に書いたセンタリングの方法で位置を決めたので、とりあえずめいっぱい左の『0』で貼り付けました。

次の『160』は上からの位置である『Top』です。
高さを調べて160で指定しました。

ここまでが必須で書かなければいけないことです。
この他に『Width』と『Height』がありますが、必須ではないので書いていません。

終わりに

今回の仕事で使った PowerPoint に関するコードを載せました。
ダラダラと長く書いてしまいましたが、誰かの助けになれれば幸いです。

さちこ

シェアする

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


コメントする