過去の優秀な提案書を読み込ませ、自社特有の勝ちパターンを完全再現したPowerPointスライドを自動生成する実務ガイドの第2弾です。NotebookLMの強力な文章理解力と、レイアウト崩れを防ぐ検証済みの固定VBAコードを組み合わせることで、「中身が薄い」「デザインが単調」といったAI生成スライドの弱点を克服します。プログラミングの知識は一切不要です。記事内のコードをコピペするだけで、自社の過去資産を活用した説得力のある提案書を爆速で作成したい実務担当者必見の手法を解説します。

1.はじめに:なぜ「Part 1」のコードだけでは足りないのか

前回の記事(Part 1)では、GeminiとVBAを使って「ゼロからスライドを生み出す」手法を紹介しました。しかし、実務で使い込むうちに、読者の皆様から新たな課題が寄せられています。

「AIが作ったスライドは早いが、中身が薄い」

「毎回レイアウトが単調(箇条書きばかり)で、結局手直しが必要」

「毎回Geminiにコードを書かせると、エラーが出て安定しない」

2026年現在、NotebookLMの進化により「過去の提案書(自社の勝ちパターン)」をRAG(検索拡張生成)として参照することは容易になりました。しかし、それを単にテキストにするだけでは不十分です。

本記事(Part 2)では、NotebookLMで抽出した「濃い中身」を、指定した「レイアウト」通りにPowerPointに落とし込むための「改良版・固定VBAコード」を公開します。

【本記事で構築するシステムの強み】

再現性◎:毎回AIにコードを書かせず、「検証済みの固定コード」を使うためエラーが出ない。

デザイン◎:表紙・中扉・比較表など、「会社のテンプレート(スライドマスター)」を正確に適用できる。

中身◎:NotebookLMを使うため、「自社特有の言い回し」まで再現できる。

※画像挿入はAIによる自動化が難しいため、今回は「指示出し」までを自動化し、貼り付けは人間が行うフローを採用しています。

【重要:社内データの取り扱いについて】

NotebookLMに社外非情報(顧客名や売り上げ詳細など)をアップロードする際は、必ず自社のセキュリティガイドラインに従ってください。不安な場合は、固有名詞を伏せたデータを使用するか、まずは公開情報を使って動作検証を行うことを強く推奨します。

■ 推奨動作環境(動作確認済み)

OS: Windows 10 / 11

ソフト: PowerPoint (Microsoft 365, Office 2016 / 2019 / 2021 以降)

※重要: 本記事のコードはWindowsデスクトップ版専用です。Mac版/Web版ではVBAの仕様が異なるため動作しません。

2.システムの全体像:NotebookLMを「脳」にする

今回のワークフローは以下の通りです。

NoteBookLM×Gemini×VBAフロー図

NotebookLM:過去の優秀な提案書を読み込ませ、論理構成とキーワードを抽出する(脳)。

Gemini:抽出した情報を、VBAが読み取れる「構造化データ」に変換する(変換器)。

VBA(今回配布):構造化データを読み取り、レイアウトを切り替えながらスライドを生成する(手)。

■ コラム:なぜNotebookLM単体ではダメなのか?

「NotebookLMのチャット欄で、直接プロンプトを打てばいいのでは?」

そう思った方もいるかもしれません。しかし、あえてGemini(@NotebookLM)を経由することには、システムを安定させるための技術的な理由が2つあります。

理由①:VBA用データの「完全な整形」が必要

NotebookLMはその仕様上、回答の根拠を示すために引用番号([1]など)を強制的に付与します。人間が読むには便利ですが、この記号はVBAにとって「予期せぬノイズ」となり、データの読み込みエラーや列ズレの直接的な原因になります。

対してGeminiは「指示への従順さ(Instruction Following)」が高く、VBAが処理しやすい「引用番号を含まない、クリーンな構造化データ」を出力させるのに適しています。

理由②:「社内知識」×「一般常識」のハイブリッド

NotebookLMは原則として「ソース内の情報」に忠実です。しかし、魅力的な提案書には「市場の一般常識」や「時候の挨拶」、「心に響く言い回し」といった、ソース外の文脈も必要です。

Geminiを経由することで、「NotebookLMが持つ正確な社内知識」に、「Geminiが持つ豊かな表現力・一般知識」を掛け合わせることが可能になり、より質の高いスライドが生成できます。

また、NotebookLMやGemini Canvasの標準エクスポート機能は確かに便利ですが、『自社のスライドマスター(ロゴ配置やフォント)』を完全に無視した汎用デザインで出力されてしまいます。『会社の顔』を死守しつつ爆速でドラフトを作りたい現場では、現時点でこのVBA制御が最も現実的かつ確実な方法です。

また、Copilot for Microsoft 365は優秀ですが、「今すぐ」「追加コストなしで」「自社の独自ルール(VBA制御)」を適用したい場合、この手法には以下のメリットがあります。

コストゼロ:追加ライセンス不要。既存のOfficeライセンスで完結します。

過去資産の活用:NotebookLMの強力な文脈理解力を利用し、自社らしい言い回しを再現できます。

強力なルール適用:VBAでスライドマスターを直接指定するため、フォントや配置のルールをほぼ強制的に適用できます。

3.実践ステップ:プロンプトエンジニアリング

まず、Gemini(必ずNotebookLMをソースに指定)に対して、以下のプロンプトを投げます。

ここでのポイントは、「出力形式をパイプ(|)区切りの表形式にする」ことです。

まずは、後述するVBAの「手順②」のマクロ(CheckLayoutIDs)を実行して、自分の使いたいレイアウトの番号(ID)をメモしてください。

(例:表紙が1、目次が2、いつもの箇条書きスライドが7だった場合など)

次に、Geminiに以下のプロンプトを投げます。

「★」のついた3~4箇所だけ、あなたの番号に書き換えてからコピーしてください。

【入力プロンプト例】

あなたはプロのコンサルタントです。
ソース:@自社の勝ちパターン集(NotebookLMのノートブック名) を参照して、
B社向けの新規提案書の構成案を作成してください。

**【重要】出力フォーマットの厳格なルール:**
後続のプログラムで処理するため、以下の形式(パイプ区切り)を厳守してください。
これ以外の余計な解説や前置きは一切不要です。表データのみを出力してください。

1. **1スライド = 1行** で出力すること。
2. **【絶対厳守】** セル内の改行は、実際の改行(Enter)を使わず、必ず文字列「<br>」に置き換えること。
3. Markdownの装飾(ボールド)は不要です。**箇条書きの行頭記号(・や-)も不要です。**(PowerPoint側で自動付与されるため)
4. 各行は必ず「|」で始まり、「|」で終わること。

**■ レイアウト番号の定義:**
あなたが構成案を作る際、スライドの用途に合わせて以下の番号を「2列目」に入れてください。
(※自社の正確な「レイアウト番号」は、後述する「手順②」のマクロで簡単に確認できます。まずはこのまま読み進めてください。)
* 表紙スライド = 1
* 目次/アジェンダ = 2
* 通常のコンテンツ(箇条書きなど) = 2
* 比較/2列コンテンツ = 4

**■ 各列の定義(5列構成):**
1列目:スライド番号
2列目:レイアウト番号
3列目:スライドタイトル
4列目:本文(改行箇所には <br> を入れる)
5列目:画像/メモ指示

**■ 出力例:**
|1|1|DX推進のご提案|株式会社〇〇 御中|(空白)|
|2|2|現状の課題|社内ドキュメントが各所に散在し検索が困難<br>データ連携の遅れ|現場の作業風景画像|
|3|4|解決策の比較|A案:部分導入<br>B案:全面刷新|比較表のイメージ|

**出力をお願いします:**

4.【コピペOK】改良版VBAコード

今回は「レイアウト指定」を含むデータを処理するため、少し高度な処理を行っています。以下の手順通りに設定してください。

手順①:参照設定の追加(必須)

このコードはクリップボードを操作するため、以下の設定が必要です。

VBAエディタ(Alt+F11)を開く。

メニューの「ツール」→「参照設定」をクリック。

「Microsoft Forms 2.0 Object Library」 にチェックを入れて「OK」。

※見つからない場合:一度「挿入」→「ユーザーフォーム」を実行すると自動で追加されます(フォームはその後削除してOK)。

VBAエディタの参照設定画面

手順②:自分のレイアウト番号を調べる(神機能)

会社によって「箇条書きスライド」が何番目にあるかは異なります。まず、以下の短いコードを実行して、自分のPCでのレイアウト番号を確認してください。

Sub CheckLayoutIDs()

    ' 現在のスライドマスターに含まれるレイアウト名と番号を一覧表示します

    Dim i As Integer

    Dim msg As String

    Dim lay As CustomLayout

    

    msg = "【レイアウト番号一覧】" & vbCrLf

    For i = 1 To ActivePresentation.SlideMaster.CustomLayouts.Count

        Set lay = ActivePresentation.SlideMaster.CustomLayouts(i)

        msg = msg & i & ": " & lay.Name & vbCrLf

    Next i

    

    MsgBox msg, vbInformation, "この番号をGeminiに伝えてください"

    ' イミディエイトウィンドウにも出力

    Debug.Print msg

End Sub

[ここのマクロを実行し、表示された番号(例:「2: タイトルとコンテンツ」など)をGeminiへの指示に使います。

レイアウト番号一覧が表示されているMsgBox

手順③:本番用コード(スライド生成)

以下のコードを標準モジュールに貼り付けます。これが「検証済みの固定コード」です。毎回書き換える必要はありません。

★コードの特徴(v5.0 Final)

改行自動修正: Geminiが誤って改行してしまっても、自動的に結合して読み込みます。

クリップボード対策: コピーがうまくいかない場合、自動的に「スライド1のノート」から読み込む救済措置が発動します。

Mac/Unix対応: Webからコピーした際の改行コードの違いを自動吸収します。

Sub GenerateSlidesFromTable_v5()

    '-------------------------------------------------------

    ' NotebookLM/Geminiの出力からスライドを生成する(鉄壁版 v5.0)

    ' 機能1: 勝手な改行を自動結合

    ' 機能2: クリップボード取得失敗時の救済措置(ノート経由)

    ' 機能3: 改行コードの正規化(Mac/Unix対応)

    ' 必須:参照設定 Microsoft Forms 2.0 Object Library

    '-------------------------------------------------------

    Dim pptPres As Presentation

    Dim pptSlide As Slide

    Dim dataObj As New MSForms.DataObject

    Dim clipboardContent As String

    Dim rawLines() As String

    Dim mergedLines As Collection

    Dim currentLine As String

    Dim columns() As String

    Dim i As Long

    Dim layoutIndex As Integer

    Dim titleText As String

    Dim bodyText As String

    Dim noteText As String

    

    On Error GoTo ErrorHandler

    

    Set pptPres = ActivePresentation

    

    ' 0. スライドが1枚もない場合のケア(新規作成直後など)

    If pptPres.Slides.Count = 0 Then

        pptPres.Slides.AddSlide 1, pptPres.SlideMaster.CustomLayouts(1)

    End If

    

    ' 1. データ取得(クリップボード優先 → 失敗ならスライド1のノート)

    On Error Resume Next

    dataObj.GetFromClipboard

    clipboardContent = dataObj.GetText

    On Error GoTo ErrorHandler

    

    ' クリップボード失敗時の救済措置
If Trim(clipboardContent) = "" Or Len(clipboardContent) < 5 Then
Dim answer As Integer
Dim msgBoxText As String

' 文章を分けて結合(これならエラーになりません)
msgBoxText = "クリップボードからデータを取得できませんでした。" & vbCrLf
msgBoxText = msgBoxText & "【救済措置】" & vbCrLf
msgBoxText = msgBoxText & "スライド1枚目の「ノート欄」にGeminiの出力を貼り付けてありますか?" & vbCrLf
msgBoxText = msgBoxText & "「はい」を押すと、ノート欄から読み込みます。"

answer = MsgBox(msgBoxText, vbYesNo + vbQuestion, "データ取得エラー")

If answer = vbYes Then
If pptPres.Slides(1).HasNotesPage Then
clipboardContent = pptPres.Slides(1).NotesPage.Shapes.Placeholders(2).TextFrame.TextRange.Text
End If
Else
Exit Sub
End If
End If

    If Trim(clipboardContent) = "" Then

        MsgBox "データが見つかりませんでした。", vbExclamation

        Exit Sub

    End If

    

    ' 2. 改行コードの正規化(Browserからのコピー対策)

    ' vbCr, vbLf をすべて vbCrLf に統一してから分割する

    clipboardContent = Replace(clipboardContent, vbCrLf, vbLf) '一旦Lfに統一

    clipboardContent = Replace(clipboardContent, vbCr, vbLf)   'CrもLfに統一

    clipboardContent = Replace(clipboardContent, vbLf, vbCrLf) '全てCrLfに戻す

    

    ' 3. 行データを整理(Geminiが勝手に入れた改行を結合する処理)

    rawLines = Split(clipboardContent, vbCrLf)

    Set mergedLines = New Collection

    

    Dim buffer As String

    buffer = ""

    

    For i = LBound(rawLines) To UBound(rawLines)

        Dim lineStr As String

        lineStr = Trim(rawLines(i))

        

        If lineStr <> "" Then

            ' 行頭が "|" で始まる場合は「新しいスライドの開始」

            If Left(lineStr, 1) = "|" Then

                If buffer <> "" Then mergedLines.Add buffer

                buffer = lineStr

            Else

                ' "|" で始まらない場合は、前の行の続きとみなして結合

                buffer = buffer & "<br>" & lineStr '改行コードの代わりに<br>で繋ぐ

            End If

        End If

    Next i

    If buffer <> "" Then mergedLines.Add buffer

    

    ' 4. 整理されたデータでスライド生成

    For i = 1 To mergedLines.Count

        currentLine = mergedLines(i)

        

        ' 先頭・末尾の|を削除

        If Left(currentLine, 1) = "|" Then currentLine = Mid(currentLine, 2)

        If Right(currentLine, 1) = "|" Then currentLine = Left(currentLine, Len(currentLine) - 1)

        

        columns = Split(currentLine, "|")

        

        ' 列数チェック(最低限 タイトル(2番目)まであれば生成試行)

        If UBound(columns) >= 2 Then

            

            ' A. レイアウト番号

            layoutIndex = Val(Trim(columns(1)))

            If layoutIndex <= 0 Or layoutIndex > pptPres.SlideMaster.CustomLayouts.Count Then layoutIndex = 2

            

            ' B. スライド追加

            Set pptSlide = pptPres.Slides.AddSlide(pptPres.Slides.Count + 1, pptPres.SlideMaster.CustomLayouts(layoutIndex))

            

            ' C. タイトル

            If pptSlide.Shapes.HasTitle Then

                pptSlide.Shapes.Title.TextFrame.TextRange.Text = Trim(columns(2))

            End If

            

            ' D. 本文

            If UBound(columns) >= 3 Then

                bodyText = columns(3)

                bodyText = Replace(bodyText, "<br>", vbCrLf)

                

                If pptSlide.Shapes.Placeholders.Count >= 2 Then

                    On Error Resume Next

                    pptSlide.Shapes.Placeholders(2).TextFrame.TextRange.Text = bodyText

                    On Error GoTo ErrorHandler

                End If

            End If

            

            ' E. 画像指示

            If UBound(columns) >= 4 Then

                noteText = columns(4)

                If Trim(noteText) <> "" Then

                    If pptSlide.HasNotesPage Then

                        pptSlide.NotesPage.Shapes.Placeholders(2).TextFrame.TextRange.Text = "【画像指示】" & vbCrLf & noteText

                    End If

                End If

            End If

        End If

    Next i

    

    MsgBox "スライド生成完了!" & vbCrLf & "生成枚数: " & pptPres.Slides.Count & "枚", vbInformation

    Exit Sub


ErrorHandler:

    MsgBox "エラーが発生しました。" & vbCrLf & "内容: " & Err.Description, vbCritical

End Sub

※Windowsの環境によっては、VBAがクリップボードの中身をうまく読み取れないことがあります。その場合でも、『スライド1枚目のノート欄に貼り付けてから実行』すれば動くように、二重の安全装置(フェイルセーフ)を組み込みました。

スライド自動生成完了

※技術的な補足(上級者向け)

本記事のVBAコードは「誰でもコピペで動き、内容を理解しやすいこと」を最優先に設計しています。そのため、WindowsAPI等の複雑な処理は避け、シンプルな記述(Microsoft Forms 2.0等)を採用しています。社内システムへの正式導入や、より大規模な自動化を行なう場合は、本コードを参考にしつつ、社内のIT専門家へ相談することをお勧めします。

5.運用とセキュリティの注意点

Enterprise版の検討

無料版のGoogleアカウントを使用している場合、アップロードしたデータがAIの学習に使用される可能性があります。特に機密レベルが極めて高い情報(M&Aや未発表の人事情報など)を扱う場合は、固有名詞を『A社』『B氏』のように匿名化してからアップロードするか、必ず企業契約(Enterprise版)の環境下での利用を強く推奨します。

「最後は人間」の原則

このツールは「70点~80点」のドラフトを爆速で作るためのものです。

VBAは改行位置の微調整が苦手です。

「挨拶」や「情熱」はAIには書けません。

生成されたスライドのノート欄(画像指示)を見ながら、適切な画像を貼り付け、人間が微調整を行うことで、初めて「勝てる提案書」が完成します。

【NotebookLMが使えない環境の方へ(Gemini/ChatGPTなど単体での活用法)】

「会社でNotebookLMがブロックされている」

「参照したい資料が少ないので、わざわざNotebookLMを作るほどでもない」

そんな場合でも、本記事のVBAコードとプロンプトはそのまま使えます。

やり方は簡単です。

Gemini(またはChatGPT)のチャット欄に、参考にしたい資料のテキストを直接貼り付けます(またはファイルをアップロードします)。その直後に、本記事の「入力プロンプト」を貼り付けて実行してください。

※プロンプト冒頭の「ソース:@自社の勝ちパターン集…」の部分は削除して、「上記の内容をもとに…」と書き換えてください。

これだけで、NotebookLM経由と同じように「崩れないスライド」を生成できます。

「Part 2のVBAシステム」は、入力元を選ばない汎用的なツールとして設計されていますので、ぜひ柔軟に活用してください。

6.まとめ

Part 1の「自動化」に、Part 2の「構造化」を組み合わせることで、スライド作成の工数は劇的に削減できます。

まずは「手順②」のマクロで自社のレイアウト番号を調べ、それをGeminiに教えてあげてください。

そこから抽出したエッセンスを、このVBAコードで形にする体験は、まさに「自分専用の有能なアシスタント」を手に入れた感覚になるはずです。

[参考記事]

Part 1:Gemini × VBAで「デザインされた」プレゼン資料を自動生成する実務ガイド