残業を減らす!Officeテクニック
「ChatGPT」にパワポのマクロを書かせてみた ~スライドを分割してPDF化できるかな?
2023年5月15日 06:55
「ChatGPT」は「Visual Basic for Application」(以下VBA)のコードも記述できる。と言われますが、「ChatGPT」に質問するだけでマクロが組めるなら、かなりの時短効果が期待できますよね。では、何を自動化したいのかを改めて考えると、Excelのマクロは実行の準備が大変そうです。Wordのマクロは書式の取得などの地味な処理が多くて面白みがありません。
手軽に試せる例として、今回は『PowerPointのスライドを分割してPDFファイルとして保存する』処理を「ChatGPT」に聞いてみました。
結論としては、とりあえず動作するマクロは作成できる(時もある)。ただし、「ChatGPT」の回答が間違った方向に進むと、何度訂正してもバグが続出してはまります。単純にコピペで完結できるかは微妙ですが、下書きには使えると思います。
「ChatGPT」に質問するたびに回答のコードは変わりますが、手元のPowerPointのファイルひとつで試せるので、ご自分の環境でも試してみてください。
「マクロ有効プレゼンテーション」の準備
PowerPointのファイルを「マクロ有効プレゼンテーション」として保存しておきます。拡張子は「.pptm」になります。また、マクロを記述(コピペ)するための標準モジュールも追加します。
なお、[開発]タブは[PowerPointのオプション]-[リボンのユーザー設定]から[開発]にチェックを付けると表示されます。
「ChatGPT」の回答を利用する
マクロを記述する準備が整ったので、さっそく「ChatGPT」に質問してみます。ここでは『PowerPointの各スライドを分割して、別々のPDFファイルとして保存するマクロを記述してください』と質問しました。
コードはボックスで表示され、右上の[Copy code]でコピー可能です。先ほど準備した標準モジュールの画面にそのままコピペします。
以下は、「ChatGPT」から回答されたコードです。丁寧にコメントが挿入されていて驚きますね。なお、ここでは、GPT-3.5のモデルを利用していますが、GPT-4のほうがバグも少なく賢い印象です。
Sub SplitSlidesToPDFs()
Dim slide As Slide
Dim savePath As String
' プレゼンテーションの保存先を取得
savePath = ActivePresentation.Path
' 各スライドをPDFとして保存
For Each slide In ActivePresentation.Slides
slide.Export savePath & "\Slide" & slide.SlideIndex & ".pdf", "PDF"
Next slide
' 完了メッセージを表示
MsgBox "PDFファイルの保存が完了しました。"
End Sub
現在のファイルパスを取得して、スライドを分割・保存したPDFファイルを同じディレクトリに保存する処理のようです。完了時にメッセージボックスも表示する記述がありますね。
「ChatGPT」から回答されたコードを実行する
実際に動作するのか確認してみましょう。VBEの画面にある「実行」ボタンをクリックします。[マクロ]ダイアログボックスから、マクロ名(SplitSlidesToPDFs)を選択・実行しても構いません。
「ChatGPT」にコードを改善してもらう
意図通りに動作しましたが、「Slide1」「Slide2」……のファイル名が気になりますね。元のファイル名に枝番を続ける形式にできないかを質問してみます。回答されたコードをコピペして実行してみました。
以下は、「ChatGPT」からの回答です。元のファイル名から拡張子を除いて、保存するPDFファイルの名前に使う処理が追加されています。
Sub SplitSlidesToPDFs()
Dim slide As Slide
Dim savePath As String
Dim fileName As String
Dim fileExt As String
Dim slideIndex As Integer
' プレゼンテーションの保存先とファイル名を取得
savePath = ActivePresentation.Path
fileName = Left(ActivePresentation.Name, InStrRev(ActivePresentation.Name, ".") - 1)
fileExt = Right(ActivePresentation.Name, Len(ActivePresentation.Name) - InStrRev(ActivePresentation.Name, "."))
' 各スライドをPDFとして保存
For Each slide In ActivePresentation.Slides
slideIndex = slide.SlideIndex
slide.Export savePath & "\" & fileName & "_" & slideIndex & ".pdf", "PDF"
Next slide
' 完了メッセージを表示
MsgBox "PDFファイルの保存が完了しました。"
End Sub