PowerPointのVBAについて調べてみると、スライド全体をそれぞれ画像として出力するマクロは、多く紹介されています。
しかし、各スライド上のオブジェクトを全選択し、それを画像として保存するマクロについては情報が見当たりませんでした。
そこで今回は、チャットAI(リートン)の力を借りて、VBA素人の筆者が「スライド上のオブジェクトを全選択して画像として保存するマクロ」についてご紹介します。
実施環境
■PowerPointのバージョン情報
- Microsoft® PowerPoint® 2021 MSO (バージョン 2401 ビルド 16.0.17231.20236) 64 ビット
■使用したPC
- ASUS Zenbook 14(UM425QA-KIR915WS)
- OS:Windows 11 Home 64bit
スペックの詳細はこちらの記事に書いています。
前提として
私はブログに掲載する画像の編集にPowerPointを使用しています。
そのときに、スライド上のオブジェクトを全選択し、それを「図として保存」することで画像として出力しています。
その際に、画像の数が多くなってくると、毎回同じ作業を繰り返すのが面倒だと思ったので、それをマクロで自動化したいと考えました。
しかし、スライド全体を画像として出力する方法は見つかりましたが、スライド上のオブジェクト(図やテキストボックス、画像)を全選択して、それを図として出力する方法は見つかりませんでした。
ただ、私はVBAを一度も触ったことがない素人なので、自力でマクロを作るのは少し難しいと思われます。
そこで今回は、チャットAI(リートン)の情報を頼りにして、スライド上の全てのオブジェクトを選択して画像として保存するマクロを作成してみました。
PowerPoint VBAを始める準備
PowerPointでVBAを始める準備として、以下のサイト様の情報が役に立ちました。
初めてVBAを触るという方は、最初にご覧になっておくことをオススメします。
とりあえずチャットAIに聞いてみる
VBAには以前から興味があったので、本を買ってじっくり勉強してもよかったのですが、せっかくなのでいま流行りの「チャットAI」を使ってみることにしました。
チャットAIとしては「ChatGPT」が有名ですが、今回は筆者が密かに推している「リートン(wrtn)」を使用しました。
リートンは、「GPT-4」を無料・無制限で使うことができ、最近では「WRTN Search」という最新のWeb検索結果を基に回答してくれる機能が追加され、より一層使い勝手が良くなりました。
とりあえず、リートンの「GPT-3.5」に次のように質問してみました。
VBAを使用して、全てのスライドにあるオブジェクトを全て選択し、1つの画像として保存するマクロを教えてください。
以下は、VBAを使用してPowerPointの全てのスライドにあるオブジェクトを選択し、1つの画像として保存するマクロの例です。
手始めにテキトーな質問を投げかけてみましたが、それっぽいVBAのコードが返ってきました。
しかし、このコードを実行してもエラーが出てうまく動かず、コードの内容もこれじゃない感があったので、次は質問する相手を「WRTN Search」に変えて聞いてみることにしました。
スライド全体ではなく、スライド上のオブジェクトを全て選択してpng形式で保存したい場合はどうすればいいですか?
スライド上のオブジェクトを全て選択してPNG形式で保存する方法については、以下の手順で行うことができます。
- スライド上のオブジェクトを全て選択する。
- 選択したオブジェクトをグルーピングする。
- グループ化されたオブジェクトをExportメソッドを使用してPNG形式で保存する。
以下にVBAのサンプルコードを示します。
それっぽい感じのコードが提案されました。
このコードをそのまま実行してもうまく動作しませんでしたが、以下の「AIがおすすめする、一緒に見ると良い情報」のページが大変参考になりました。
提案された参考ページ
・vba – Save all Shapes of slide into single JPG image – Stack Overflow
・Export selected shape as picture in VBA – Microsoft Community
・Excel VBA to save PPT shapes as PNG images | MrExcel Message Board
事前の調査では、日本語で検索しただけだったので参考になるページはあまり見つかりませんでしたが、英語検索という手があることを忘れていました。
結果として、参考ページのVBAコードを自分用に改良することで、きちんと動くコードを書くことができました。
VBAコードとマクロの実行
以下のVBAコードは、スライド上の全てのオブジェクトを選択してPNG画像として保存するマクロです。
Sub PrintShapesToPng()
Dim ap As Presentation: Set ap = ActivePresentation
Dim fileName As String
Dim sld As Slide
Dim shpRange As ShapeRange
'ファイル名の取得
fileName = Left(ap.Name, InStrRev(ap.Name, ".") - 1)
'スライド上のオブジェクトを全選択し、PNG形式で出力
For Each sld In ap.Slides
ActiveWindow.View.GotoSlide (sld.SlideIndex)
sld.Shapes.SelectAll
Set shpRange = ActiveWindow.Selection.ShapeRange
Call shpRange.Export(ap.Path & "\" & fileName & sld.SlideIndex & ".png", ppShapeFormatPNG)
Next
End Sub
- 出力されたPNG画像は、pptファイルが存在するフォルダに保存される
- 出力されたPNG画像の名前は、「ファイル名+スライド番号.png」となる
- ex. 「ファイル名1.png」など
上のマクロを実行すると、次のようになります。
まず、Visual Basic Editorを開いて上のコードをコピペします。
そして、マクロを実行します。
すると、以下のように各スライドのオブジェクトがPNG画像として出力されました。
VBAコードの解説
上のVBAコードの解説を書いていきます。
あくまでVBA素人による説明なので、誤りがありましたらご指定いただけますと幸いです。
変数の宣言
Dim ap As Presentation: Set ap = ActivePresentation
Dim fileName As String
Dim sld As Slide
Dim shpRange As ShapeRange
3行目に、Presentation型の変数として「ap」を宣言し、アクティブな(現在開いている)プレゼンテーションを格納します。
4行目に、String型(文字列型)の変数として「fileName」を宣言しています。
5行目に、Slide型の変数として「sld」を宣言しています。
6行目に、ShapeRange型の変数として「shpRange」を宣言しています。ShapeRangeオブジェクトは、複数のShape オブジェクト(図形、テキストボックス、画像など)の集合を表し、これらを一括操作するときに使用されます。
ファイル名の取得
'ファイル名の取得
fileName = Left(ap.Name, InStrRev(ap.Name, ".") - 1)
アクティブなプレゼンテーションのファイル名を取得し、変数fileNameに格納するコードです。
Left関数は、文字列の左端から指定された文字数の文字を取り出す関数です。Left(文字列, 文字数)のように使用されます。
InStrRev関数は、文字列の最後の位置から検索し、指定した文字列が見つかった位置を返します。今回の場合は、ap.Nameの文字列の中で最後に「.」が出現する位置を検索します(拡張子「.pptx」の前のドット)。
Left関数の引数である文字数を「InStrRev(ap.Name, “.”) – 1」と指定することで、拡張子付きのファイル名から「.」以降を除いた名前を取得することができます。
参考
・PowerPoint VBA 指定ピクセルに変換して図として保存するマクロ | PPDTP
・VBA Left関数について ~関数の解説と使用例~
スライド上のオブジェクトを全選択し、PNG形式で出力
'スライド上のオブジェクトを全選択し、PNG形式で出力
For Each sld In ap.Slides
ActiveWindow.View.GotoSlide (sld.SlideIndex)
sld.Shapes.SelectAll
Set shpRange = ActiveWindow.Selection.ShapeRange
Call shpRange.Export(ap.Path & "\" & fileName & sld.SlideIndex & ".png", ppShapeFormatPNG)
Next
For Each文によって、現在のプレゼンテーションの各スライドに繰り返し処理を行います。
13行目の「ActiveWindow.View.GotoSlide (sld.SlideIndex)」では、View.GotoSlide メソッドを用いて、現在ループの対象となっているスライドに移動します。
14行目の「sld.Shapes.SelectAll」では、Shapes.SelectAll メソッドを用いて、スライド上のオブジェクトを全選択します。
15行目の「ActiveWindow.Selection.ShapeRange」は、現在アクティブなウィンドウ内で選択されているオブジェクト群を表し、これを変数「shpRange」に格納します。
全選択したオブジェクトを「ShapeRangeオブジェクト」とすることで、一度に複数のオブジェクト(shapeオブジェクト)を扱うことができます。
16行目では、「ShapeRange.Export メソッド」を呼び出し、全選択したオブジェクトをPNG形式で保存します。
保存先は、現在のpptファイルが存在するディレクトリと同じ場所に指定しています。PNG形式で出力するため、引数に「ppShapeFormatPNG」と指定します。
参考
・VBAで図として保存する:パワーポイントマクロ・PowerPoint VBAの使い方/画像
・Shape.Export メソッド (PowerPoint) | Microsoft Learn
まとめ
今回は、PowerPointのVBAを用いて、スライド上のオブジェクトを全選択して画像として保存するマクロをご紹介しました。
筆者はVBAについては素人でしたので、コードも不細工な感じになってしまいましたが、とりあえず動いたので今回は良しとします。
また、チャットAIに質問するときは今回のようなテキトーな内容ではなく、もっと具体的に簡潔に伝えるべきです。
そして、「WRTN Search」を使用して参考ページを求めるときは、英語のサイトを指定するとより良いソースに出会えるかもしれません。
もし本記事の内容で誤りがありましたら、お気軽にご指摘いただけますと幸いです。よろしくお願いいたします。
最後まで読んでくださり、ありがとうございました!
(ご質問・ご感想はこちらからどうぞ)