PowerPointのスライド構成から画像選定の指示出しまでを、Gemini GemsとVBAを使って自動化する実務ガイドです。長いプロンプトの入力はもう必要ありません。本記事で配布するVBAコードと専用Gemの設定をコピペするだけで、自社のスライドマスターに準拠した「自社専用プレゼン生成アプリ」が完成します。プロンプトを毎回打つ手間を省きたい方、チーム全体で資料の品質を統一したい現場リーダー必見のノウハウです。無料版GeminiとGoogle Keepを使った代替テクニックも網羅しており、環境を問わず今日から業務効率化を実現できます。
[関連記事]
Part1、Part2の記事をご覧になられていない方は、そちらも是非ご覧ください。
Part 1: Gemini × VBAで「デザインされた」プレゼン資料を自動生成する実務ガイド
Part 2: NotebookLM×Geminiで「自社の勝ちパターン」を完全再現!崩れない提案書を爆速生成するVBA実務ガイド
目次
1.はじめに:まだ「プロンプト」をコピペしているのですか?
前回の記事(Part 2)では、NotebookLMを使って「自社の勝ちパターン」を再現する方法を紹介しました。しかし、公開後、読者の皆様からこんな声が届きました。
「プロンプトが長すぎて、毎回コピペするのが面倒……」
「部下にやらせようとしたら、貼り付けミスでエラーが出た」
「画像選びのセンスが人によってバラバラで、結局手直ししている」
これでは本末転倒です。私たちが目指すゴールは、「新入社員でも、あっという間に『80点のドラフト』を作れる状態」です。
本記事(Part 3・完結編)では、Googleの最新機能「Gemini Gems(ジェム)」と、
極限まで進化した「VBA v5.2」を組み合わせ、
「自社専用のプレゼン生成アプリ」を構築・配布する方法を解説します。
今回の成果物
「テーマ: AI活用セミナー、ターゲット:経営陣」と入力し、
マクロを実行するだけで、画像指示が書き込まれた「黄色いボックス」付きで
スライドが自動生成されます。

「黄色いボックス」には、
「このスライドに最適な画像指示(日本語+英語)」が自動で書き込まれています。
人間は、この指示を見て画像を探し、貼り付けるだけ。
「AIがアートディレクター(指示出し)」になり、「人間がデザイナー(作業)」になる。
この分業こそが、迷いをゼロにする最短ルートです。
【前提条件】
本記事では「Gemini Gems」機能を使用するため、Gemini Advanced または Google Workspace の対応プランを推奨しますが、無料版ユーザー向けの「代替テクニック」も完全に網羅しています。 安心してお読みください。
2.戦略:なぜ「Canvas」ではなく「VBA×Gems」なのか?
戦略:なぜ「Canvas」ではなく「VBA×Gems」なのか?
「Gemini Canvasを使えば、スライドっぽいものは作れるのでは?」
その通りです。しかし、企業の現場ではCanvasだけでは不十分な理由があります。
Canvasは「個人戦(自由演技)」:白紙から自由に描くには最強ですが、
「会社のロゴ」「指定フォント」「決まった表紙」を守らせることは困難です。
VBA×Gemsは「団体戦(規定演技)」:スライドマスターを強制適用するため、
誰が作っても「会社の顔」をした資料が出来上がります。
「個人のアイデア出し」はCanvasで。
「組織の公式文書」はVBAで。
この使い分けこそが、2026年の最適解です。
⚠️ 【重要】社内データを連携する前のセキュリティ・チェック
本記事の手法では、自社の過去の提案書(機密情報)をAIに読み込ませます。
実行前に必ず以下のライセンスと設定を確認してください。
・企業向けアカウント(Google Workspace / Gemini Business・Enterprise)をご利用の方
ご安心ください。Googleのエンタープライズ規約により、
入力したデータやNotebookLMのナレッジがAIのモデル学習に使われることはありません。
社内展開に最適です。
・個人向けアカウント(Gemini Advanced)をご利用の方
個人アカウントの場合、入力データが品質向上(学習)の目的で利用される可能性があります。
社外秘データを扱う場合は、Googleアカウントの「Gemini アプリ アクティビティ」をオフにするか、
固有名詞を伏せたデータを使用することを強く推奨します。
3.実践①:スライド生成専用Gem「Slide-Master-Bot」の作り方
それでは、あなた専用の「スライド生成アプリ(Gem)」を作りましょう。
(※無料版の方は、次のセクションへ進んでください)
【手順】
Geminiのメニューから「Gemマネージャー」を開き、「新規作成」をクリック。
名前: Slide-Master-Bot(または自社名プレゼンメーカー)
【重要】ナレッジ(知識)の追加:メニューから「NotebookLM」を選択し、
Part 2で作成した『自社の勝ちパターン』ノートブックをリンクさせます。
これにより、Gemが自社特有の言い回しや構成を完全に理解します。
(※2026年2月時点では一部のGoogle Workspace環境でまだロールアウト中です。リンクできない場合はPart2プロンプトを直接Gemのインストラクションに貼り付けてください)

インストラクション: 以下のプロンプトをそのまま貼り付けてください。
このプロンプトには、Part 2で培った「厳格なパイプ区切りルール」に加え、
「挨拶禁止」や「画像指示の強制出力」が含まれています。
【Gems用 システムインストラクション 】
あなたは、企業の標準スライドマスターに準拠したプレゼンテーション構成データを出力する「専用エンジン」です。
ユーザーから「テーマ」と「ターゲット」が入力されたら、以下のルールに従ってデータのみを出力してください。
【ナレッジ(自社データ)の強制参照ルール】
本Gemにリンク(添付)されているNotebookLMのナレッジを必ず最優先で参照してください。
自社の過去の提案書から、論理展開のパターン、強み、トーン&マナーを抽出し、今回のテーマに適用した構成案を作成してください。
【厳格な出力フォーマット】
以下の【出力例】と全く同じ構造のプレーンテキストで出力すること。
各行の「先頭」と「末尾」には必ず「|」をつけること。
1つのスライドは必ず1行で完結させ、途中で絶対に改行しないこと。
本文内の改行は、必ず文字列「<br>」を使用すること。
Markdownの箇条書き記号(・や-)やコードブロックは一切使用しないこと。
挨拶、前置き、完了の報告は一切禁止する。
【データ構造(5列構成)】
|スライド番号|レイアウトID|タイトル|本文|画像生成指示|
【各列の定義】
スライド番号: 1からの連番
レイアウトID: 以下の数値を指定。表紙は1、目次は2、通常コンテンツは2(ユーザー環境に合わせて変更可)、2列や比較は4。
タイトル: スライドのタイトル
本文: 箇条書き。改行は「<br>」に置換。
画像生成指示: そのスライドの内容を補完するビジュアル指示。「日本語の具体的な指示 (英語の生成AI用プロンプト)」の形式で記述すること。例:「握手をするビジネスマン (Two business professionals shaking hands, corporate office background, blue tone, photorealistic)」。画像不要な場合は「(なし)」と記述。
【出力例(この形式を厳守)】
|1|1|タイトル|本文テキスト<br>箇条書き1<br>箇条書き2|画像指示|
|2|2|次のタイトル|本文テキスト<br>箇条書き1<br>箇条書き2|(なし)|
【ユーザー入力待ち】
ユーザーからの入力を待機してください。入力があり次第、即座にデータを生成してください。保存すれば完成です。あとはこのGemを開いて、
「テーマ:AI活用セミナー、ターゲット:経営陣」と打つだけで、
実務ですぐに使えるデータが出力されます。
4.実践②:Advanced契約がなくても大丈夫!「一瞬で呼び出すテクニック」
Gemを作れない無料版ユーザーや、Microsoft 365環境の方も安心してください。
「Google Keep」などのメモツールを使えば、Gemsと同等の効率を実現できます。
方法:サイドパネル・インジェクション
以下の「無料版専用・穴埋めプロンプト」をコピーします。
Google Keep(またはメモ帳)に貼り付け、「📌スライド生成呪文」としてピン留め保存します。
Gemini(ブラウザ版)を開き、右側のサイドパネルからKeepを開きます。
ドラッグ&ドロップでチャット欄に入れ、
末尾の「テーマ」「ターゲット」「参考メモ」の3箇所を書き換えて送信します。
画面を切り替えることなく、あっという間に指示が完了します。
【無料版専用・穴埋めプロンプト】
(※Gems用とは異なり、冒頭に強力な役割定義を追加しています)
以下の指示を厳格に守り、あなたはスライド構成を出力する「専用エンジン」として振る舞ってください。
これ以降、挨拶や雑談は一切不要です。
【厳格な出力フォーマット】
以下の【出力例】と全く同じ構造のプレーンテキストで出力すること。
各行の「先頭」と「末尾」には必ず「|」をつけること。
1つのスライドは必ず1行で完結させ、途中で絶対に改行しないこと。
本文内の改行は、必ず文字列「<br>」を使用すること。
Markdownの箇条書き記号(・や-)やコードブロックは一切使用しないこと。
入力データに「参考メモ」が含まれている場合は、その内容の論理展開や言い回しを最優先で踏襲して構成を作成すること。
【データ構造(5列構成)】
|スライド番号|レイアウトID|タイトル|本文|画像生成指示|
【各列の定義】
スライド番号: 1からの連番
レイアウトID: 表紙=1、目次=2、通常=2、比較=4(適宜変更可)
タイトル: スライドのタイトル
本文: 箇条書き。改行は「<br>」に置換。
画像生成指示: 「日本語の指示 (英語のプロンプト)」形式で記述。例:「握手 (Handshake, business, blue tone)」。不要な場合は「(なし)」と記述。
【出力例(この形式を厳守)】
|1|1|タイトル|本文テキスト<br>箇条書き1<br>箇条書き2|画像指示|
|2|2|次のタイトル|本文テキスト<br>箇条書き1<br>箇条書き2|(なし)|
▼▼▼ 今回の入力データ ▼▼▼
以下のテーマとターゲットに基づいて出力してください。
■テーマ:
[ここに入力してください]
■ターゲット:
[ここに入力してください]
■参考メモ(※NotebookLMで作成した構成などがあれば以下に貼る。なければ空欄):
[ここに入力してください]
▲▲▲ 入力エリア ここまで ▲▲▲📱 スマホ派のあなたへ:通勤時間を「構成作成タイム」に
通勤中にスマホで作業する場合、お使いの端末に「画面分割(マルチウィンドウ)」
機能があれば、上にGemini、下にKeepを表示させるとスムーズです。
画面分割が使えない場合(iPhoneや一部の端末など)は、Keepでプロンプトをコピーした後、
画面下部を横にスワイプする等してアプリを素早く切り替える
(Appスイッチャーを活用する)と、ストレスなくコピペが完了します。
5.技術:AI特有のノイズを受け止める「VBA v6.4」完全版コード
最後に、AIが出力したデータを受け取る「手(VBA)」のコードです。
Part 2からの改良点は以下の4つ。AI特有の気まぐれを完全にねじ伏せる「プロ仕様」です。
・AIの出力揺れを自動修復:AIが勝手に改行したり、横に繋げて出力したりしても、
システムが自動で構造を解析・修復して完璧にスライド化します。
・フェイルセーフ(救済)機能:環境によってクリップボードの取得に失敗しても、
スライドの「ノート(メモ欄)」に貼るだけで確実にデータを吸い上げます。
・画像指示BOXの自動生成&サイズ調整:スライド右下に黄色い付箋を自動配置。
文字量に合わせて箱の高さが自動で拡張(はみ出し防止)されます。
・動的レイアウト&フォント固定:スライドサイズ(4:3 / 16:9)に合わせて位置を調整し、
フォントを強制的に「游ゴシック」に統一します。
⚠️ 【重要・初回のみの設定】VBAを動かすための準備
このマクロでは「クリップボードから文字を受け取る」機能を使うため、
初回のみ以下の設定が必要です。設定は1分で終わります。
PowerPointの「開発」タブから「Visual Basic」を開きます。
上部メニューの「挿入」→「ユーザーフォーム」を一度クリックします。
(※画面に小さなウィンドウが出ますが、これで自動的に裏側の設定が完了します)
出てきた「UserForm1」は使わないので、右クリックして「UserForm1の解放(削除)」を選び、
「いいえ(エクスポートしない)」で消してしまって構いません。

その後、「挿入」→「標準モジュール」を追加し、以下のコードを貼り付けてください。
Option Explicit
Sub GenerateSlides_v6_4_Ultimate()
' ==============================================================================
' 【究極マスター版 v6.4】 AI出力の揺れを完全吸収する耐性解析エンジン
' 機能1: クリップボード取得の確実な動作(MSForms自動参照設定済みを前提)
' 機能2: 白紙プレゼン(スライド0枚)での実行時エラーを完全回避
' 機能3: AIの「横並び癒着(改行忘れ)」を検知し強制切断
' 機能4: AIの物理改行やパイプズレを自動解釈し、本文として結合
' 機能5: AIの全角数字(レイアウトID)を半角に自動変換し正しく適用
' ==============================================================================
Dim pptPres As Presentation
Dim DataObj As MSForms.DataObject
Dim clipboardContent As String
Dim lines() As String
Dim i As Long
Dim successCount As Long
Dim firstSlide As Slide
Set pptPres = ActivePresentation
successCount = 0
' 白紙プレゼン対策(スライドが0枚ならダミーを1枚追加)
If pptPres.Slides.Count = 0 Then
On Error Resume Next
pptPres.Slides.Add 1, ppLayoutTitle
If Err.Number <> 0 Then
pptPres.Slides.Add 1, ppLayoutBlank ' タイトルレイアウトがない場合の救済
End If
On Error GoTo 0
End If
' 1. クリップボード取得 & 救済措置
On Error Resume Next
Set DataObj = New MSForms.DataObject
If Err.Number = 0 Then
DataObj.GetFromClipboard
clipboardContent = DataObj.GetText
End If
On Error GoTo 0
' ノートからの救済ロード(クリップボードが空の場合)
If Len(clipboardContent) < 5 Then
If pptPres.Slides.Count > 0 Then
Set firstSlide = pptPres.Slides(1)
If firstSlide.HasNotesPage Then
On Error Resume Next
clipboardContent = firstSlide.NotesPage.Shapes.Placeholders(2).TextFrame.TextRange.Text
On Error GoTo 0
End If
End If
End If
If Len(clipboardContent) < 5 Then
MsgBox "データを取得できませんでした。" & vbCrLf & "テキストをコピーし直すか、1枚目のスライドのノート(メモ欄)に貼り付けて実行してください。", vbCritical
Exit Sub
End If
' ==========================================================================
' 横並び癒着ブレーカー:改行忘れを強制的に切断する
' ==========================================================================
Dim allParts() As String
allParts = Split(clipboardContent, "|")
Dim rebuiltString As String
rebuiltString = allParts(0)
Dim k As Long
For k = 1 To UBound(allParts) - 1
Dim valA As String, valB As String
valA = Trim(allParts(k))
valB = Trim(allParts(k + 1))
Dim isStart As Boolean
isStart = False
' パイプに挟まれた2つの要素が「数字」ならスライドの開始とみなす
If Len(valA) > 0 And Len(valA) <= 3 And Len(valB) > 0 And Len(valB) <= 3 Then
If IsNumeric(StrConv(valA, 8)) And IsNumeric(StrConv(valB, 8)) Then
isStart = True
End If
End If
If isStart Then
' 前のスライドとの癒着を切断し、強制的に改行を挿入する
rebuiltString = rebuiltString & "|" & vbLf & "|" & allParts(k)
Else
rebuiltString = rebuiltString & "|" & allParts(k)
End If
Next k
If UBound(allParts) > 0 Then
rebuiltString = rebuiltString & "|" & allParts(UBound(allParts))
End If
clipboardContent = rebuiltString
' ==========================================================================
' 改行コードの統一と行分割
clipboardContent = Replace(clipboardContent, vbCrLf, vbLf)
clipboardContent = Replace(clipboardContent, vbCr, vbLf)
lines = Split(clipboardContent, vbLf)
' 2. AI耐性ステートマシン(行ごとの意味解析)
Dim currentData As String
currentData = ""
For i = LBound(lines) To UBound(lines)
Dim lineText As String
lineText = Trim(lines(i))
If lineText <> "" Then
Dim isNewSlide As Boolean
isNewSlide = False
Dim tempParts() As String
tempParts = Split(lineText, "|")
' 新しいスライドの開始行か判定
If UBound(tempParts) >= 2 Then
Dim val1 As String, val2 As String
If Left(lineText, 1) = "|" Then
val1 = Trim(tempParts(1))
val2 = Trim(tempParts(2))
Else
val1 = Trim(tempParts(0))
val2 = Trim(tempParts(1))
End If
If IsNumeric(StrConv(val1, 8)) And IsNumeric(StrConv(val2, 8)) Then
isNewSlide = True
End If
End If
If isNewSlide Then
' 溜まったデータがあればスライドを生成
If currentData <> "" Then
Call CreateSlideFromData(currentData, pptPres, successCount)
End If
' 新しいスライドのデータを蓄積開始
currentData = lineText
Else
' 前の行からの続きとして結合
If currentData <> "" Then
currentData = currentData & vbCrLf & lineText
End If
End If
End If
Next i
' 最後のスライドを処理
If currentData <> "" Then
Call CreateSlideFromData(currentData, pptPres, successCount)
End If
' 完了ログ
MsgBox successCount & "枚のスライドを生成しました。" & vbCrLf & "右下の黄色いボックスを確認してください。", vbInformation
End Sub
' ---------------------------------------------------------
' サブルーチン: 蓄積されたデータからスライドを1枚生成する
' ---------------------------------------------------------
Private Sub CreateSlideFromData(ByVal slideData As String, pptPres As Presentation, ByRef successCount As Long)
Dim parts() As String
Dim layoutIndex As Long
Dim titleText As String, bodyText As String, imagePrompt As String
Dim pptSlide As Slide
' 安全のため先頭と末尾の「|」をクリーニング
If Left(slideData, 1) = "|" Then slideData = Mid(slideData, 2)
If Right(slideData, 1) = "|" Then slideData = Left(slideData, Len(slideData) - 1)
parts = Split(slideData, "|")
' データが揃っているか確認
If UBound(parts) >= 2 Then
' A. レイアウト設定 (全角数字対策済み)
layoutIndex = Val(StrConv(Trim(parts(1)), 8))
If layoutIndex <= 0 Then layoutIndex = 2
On Error Resume Next
Set pptSlide = pptPres.Slides.AddSlide(pptPres.Slides.Count + 1, pptPres.SlideMaster.CustomLayouts(layoutIndex))
If Err.Number <> 0 Then
Set pptSlide = pptPres.Slides.AddSlide(pptPres.Slides.Count + 1, pptPres.SlideMaster.CustomLayouts(2))
End If
On Error GoTo 0
' B. タイトル
titleText = Trim(parts(2))
If pptSlide.Shapes.HasTitle Then
pptSlide.Shapes.Title.TextFrame.TextRange.Text = titleText
End If
' C. 本文
If UBound(parts) >= 3 Then
bodyText = Trim(parts(3))
bodyText = Replace(bodyText, "<br>", vbCrLf)
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 0
End If
End If
' D. 画像指示BOX
If UBound(parts) >= 4 Then
imagePrompt = Trim(parts(4))
If imagePrompt <> "" And imagePrompt <> "(なし)" And imagePrompt <> "(なし)" Then
Call AddDynamicInstructionBox(pptSlide, imagePrompt)
End If
End If
successCount = successCount + 1
End If
End Sub
' ---------------------------------------------------------
' サブルーチン: 画像指示BOX (動的座標 & フォント指定 & 自動サイズ調整)
' ---------------------------------------------------------
Private Sub AddDynamicInstructionBox(sld As Slide, promptText As String)
Dim shp As Shape
Dim sldW As Single, sldH As Single
Dim boxW As Single, boxH As Single
' スライドサイズを取得(4:3 / 16:9 両対応のため)
sldW = ActivePresentation.PageSetup.SlideWidth
sldH = ActivePresentation.PageSetup.SlideHeight
' ボックスの初期サイズ設定(幅は固定、高さは後で自動調整)
boxW = 280
boxH = 100
' 右下から20ptのマージンを取って配置(動的計算)
Set shp = sld.Shapes.AddShape(msoShapeRectangle, sldW - boxW - 20, sldH - boxH - 20, boxW, boxH)
With shp
' デザイン(黄色い付箋風)
.Fill.ForeColor.RGB = RGB(255, 255, 204)
.Line.ForeColor.RGB = RGB(255, 153, 0)
.Line.Weight = 2
' テキスト設定と「細やかなサイズ調整」
With .TextFrame
.WordWrap = msoTrue ' はみ出さないように折り返しを有効化
.AutoSize = ppAutoSizeShapeToFitText ' テキスト量に合わせてBOXの高さを自動拡張
With .TextRange
.Text = "【AI画像指示】" & vbCrLf & promptText
.Font.Color.RGB = RGB(50, 50, 50)
.Font.Size = 10.5
.Font.Bold = msoTrue
' フォント強制指定
' ※企業テンプレート等で「游ゴシック」が禁止されている場合は、
' 以下の "游ゴシック" を "メイリオ" 等に変更してご使用ください。
On Error Resume Next
.Font.Name = "游ゴシック"
.Font.NameFarEast = "游ゴシック"
On Error GoTo 0
End With
End With
' 自動拡張によってBOXが下に伸びてしまった場合、再度「右下ピッタリ」に位置を補正する
.Top = sldH - .Height - 20
End With
End Sub
6.運用:情シスも納得する安全な社内展開
もしあなたが社内のIT担当者やリーダーなら、このシステムを「配布」してください。
Gemsの共有: 作成したGemのリンクを社内ポータルに貼る。「このボットを使えば、
規定のスライドが作れます」とアナウンスする。
無料版への配慮: Keep用のプロンプトもテキストファイルで配布する。
ガバナンスの維持: 社員はプロンプトをいじる必要がないため、
誤って機密情報をプロンプトに混ぜるリスク(※学習設定に依存)を減らせます。
マニュアルを配るのではなく、「失敗しない道具」を配る。これが最も効果的なDXです。
7.おわりに:シリーズ総括
Part 1から始まった「Gemini × VBA」三部作は、これで完結です。
Part 1: VBAは怖くない。まずはコピペで動かそう(手を作る)。
Part 2: NotebookLMで自社の勝ちパターンを学ばせよう(脳を作る)。
Part 3: GemsとVBAでアプリ化し、画像指示まで統制しよう(組織に展開する)。
これで、あなたのPCには「実務に直結するプレゼン生成メーカー」が完成しました。
AIが下書きと画像の指示出しをしてくれるおかげで、あなたは本来注力すべき「意思決定」や
「魂を込める作業」に全力を注げるはずです。
さあ、黄色いボックスが待っています。
今すぐGeminiを起動して、最初の指示を出してみてください!
[関連記事]
Part 1: Gemini × VBAで「デザインされた」プレゼン資料を自動生成する実務ガイド
Part 2: NotebookLM×Geminiで「自社の勝ちパターン」を完全再現!崩れない提案書を爆速生成するVBA実務ガイド


