過去の優秀な提案書を読み込ませ、自社特有の勝ちパターンを完全再現した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が読み取れる「構造化データ」に変換する(変換器)。
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)。

手順②:自分のレイアウト番号を調べる(神機能)
会社によって「箇条書きスライド」が何番目にあるかは異なります。まず、以下の短いコードを実行して、自分の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への指示に使います。

手順③:本番用コード(スライド生成)
以下のコードを標準モジュールに貼り付けます。これが「検証済みの固定コード」です。毎回書き換える必要はありません。
★コードの特徴(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コードで形にする体験は、まさに「自分専用の有能なアシスタント」を手に入れた感覚になるはずです。
[参考記事]


