残業を減らす!Officeテクニック

「ChatGPT」にパワポのマクロを書かせてみた ~スライドを分割してPDF化できるかな?

マクロ(VBAのコード)も記述できたが……

 「ChatGPT」は「Visual Basic for Application」(以下VBA)のコードも記述できる。と言われますが、「ChatGPT」に質問するだけでマクロが組めるなら、かなりの時短効果が期待できますよね。では、何を自動化したいのかを改めて考えると、Excelのマクロは実行の準備が大変そうです。Wordのマクロは書式の取得などの地味な処理が多くて面白みがありません。

 手軽に試せる例として、今回は『PowerPointのスライドを分割してPDFファイルとして保存する』処理を「ChatGPT」に聞いてみました。

「ChatGPT」に『スライドを分割してPDFファイルとして保存する』処理を回答してもらった

 結論としては、とりあえず動作するマクロは作成できる(時もある)。ただし、「ChatGPT」の回答が間違った方向に進むと、何度訂正してもバグが続出してはまります。単純にコピペで完結できるかは微妙ですが、下書きには使えると思います。

 「ChatGPT」に質問するたびに回答のコードは変わりますが、手元のPowerPointのファイルひとつで試せるので、ご自分の環境でも試してみてください。

「マクロ有効プレゼンテーション」の準備

 PowerPointのファイルを「マクロ有効プレゼンテーション」として保存しておきます。拡張子は「.pptm」になります。また、マクロを記述(コピペ)するための標準モジュールも追加します。

 なお、[開発]タブは[PowerPointのオプション]-[リボンのユーザー設定]から[開発]にチェックを付けると表示されます。

「マクロ有効プレゼンテーション」(.pptm)として保存しておく
[開発]タブにある[マクロの記録]をクリックする。[開発]タブが表示されていない場合は[ファイル]タブにある[オプション]をクリックして[PowerPointのオプション]表示、[リボンのユーザー設定]で[開発]にチェックを付けておこう
「Visual Basic Editor」(以下、VBE)の画面が表示される。[挿入]-[標準モジュール]の順に選択する
標準モジュールが追加された。ここにマクロを記述(コピペ)する

「ChatGPT」の回答を利用する

 マクロを記述する準備が整ったので、さっそく「ChatGPT」に質問してみます。ここでは『PowerPointの各スライドを分割して、別々のPDFファイルとして保存するマクロを記述してください』と質問しました。

 コードはボックスで表示され、右上の[Copy code]でコピー可能です。先ほど準備した標準モジュールの画面にそのままコピペします。

『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)を選択・実行しても構いません。

[Sub/ユーザーフォームの実行]をクリックする
処理完了のメッセージが表示された。[OK]をクリックする
PowerPointのファイルと同じディレクトリを確認すると、PDFファイルが生成されている
各スライドが分割されている(1枚目)
2枚目のスライド。3枚目以降も分割されていた

「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

間違い続けることもある

 今回は動作するコードが回答されましたが、間違いはじめると質問を繰り返しても改善しないこともよくあります。しかし、記述する処理のヒントにはなります。回答されたコードの不具合箇所を調べることで、ゼロの状態から記述するよりは効率がいいのではないかと思います。

「ChatGPT」からのコードで発生したエラーの例1
「ChatGPT」からのコードで発生したエラーの例2