構造化思考(SCoT)の導入
これまでのステップでは、AIに対して「日本語の変数」を使わせたり、「処理手順を箇条書き」にしたりといったテクニックを学んできました。今回は、それらをさらに発展させた、AIコード生成における最先端のプロンプト技術である「Structured Chain-of-Thought(SCoT:構造化思考の連鎖)」を導入します。これは、AIに対して漫然とコードを書かせるのではなく、プログラミングの基本となる「順次」「分岐」「反復」という3つの構造を明示した中間的な思考プロセスを経由させることで、生成されるコードの精度を劇的に向上させる手法です。
人間がマクロを作成する際、頭の中で「まずデータを読み込んで(順次)、もしデータが空なら終了して(分岐)、データがあるなら1行ずつ計算する(反復)」というロジックを組み立てます。SCoTは、このプログラマーの脳内にあるロジックの骨組みを、そのままプロンプトとしてAIに提示する技術です。本記事では、この構造化思考を駆使し、複雑な要件であっても一発で正確なVBAコードを引き出すための「開発者」としての核心的なスキルを12の視点から徹底解説します。
SCoT(Structured Chain-of-Thought)とは何か:AIの思考をコードに近づける革新的手法
近年、大規模言語モデル(LLM)の推論能力を高める手法として「Chain-of-Thought(CoT:思考の連鎖)」が注目されています。これは、AIにいきなり答えを出させるのではなく、「まずAについて考え、次にBを計算し…」というように、段階的な思考の過程(中間推論ステップ)を出力させることで、正答率を高めるテクニックです。しかし、自然言語による通常のCoTは、文章生成や数学の問題には有効でも、厳密な構文ルールを持つプログラミングコードの生成においては、精度向上に限界があることが指摘されていました。
そこで登場したのが「Structured Chain-of-Thought(SCoT)」です。これは、思考の連鎖そのものに、ソースコード特有の構造を取り入れるというアプローチです。具体的には、あらゆるプログラムを構成する要素である「順次構造(Sequence)」「分岐構造(Branch)」「反復構造(Loop)」という3つの概念を用いて、解決プロセスを記述させます。従来のCoTが「リストを順番に見ていって、もし条件に合えばそれを足していく」といった自然言語の散文で思考していたのに対し、SCoTでは「1. リストを反復(Loop)、2. 条件判定(Branch)、3. 加算処理(Sequence)」というように、プログラミング言語の構造に近い形式で思考を整理します。
この手法の最大の利点は、AIがコードを生成する前に、論理的な整合性を確保できる点にあります。自然言語の曖昧さを排除し、プログラムとしての骨格を確定させてから、実際のVBAコード(If文やFor文)への翻訳を行うため、論理破綻や構文エラーが激減します。研究結果によれば、SCoTを用いたプロンプトエンジニアリングは、従来のCoTと比較して、コード生成の正答率(Pass@1)を最大で約13.8%も向上させることが報告されています,,。開発者であるあなたがSCoTをマスターすることは、AIの潜在能力を限界まで引き出し、実務で使える堅牢なマクロを生み出すための最強の武器を手に入れることを意味します。
プログラミングの基本3構造「順次・分岐・反復」:AIと共有すべき共通言語
SCoTを実践するためには、プログラミングを構成する3つの基本構造を深く理解し、それをAIとの共通言語として使いこなす必要があります。これらはVBAに限らず、PythonやJavaなどあらゆる手続き型言語に共通する普遍的なロジックです。
一つ目は「順次構造(Sequence)」です。これは、処理を上から下へと順番に実行していく最も基本的な流れです。「ファイルを開く」「データをコピーする」「シートに貼り付ける」といった一連の動作がこれに当たります。AIへの指示においては、これらのステップを番号付きリストで明確に順序立てて記述することが求められます。順序が入れ替わるだけでプログラムは意図しない動作をするため、開発者は時間の流れを意識して指示を構成しなければなりません,。
二つ目は「分岐構造(Branch)」です。これは、特定の条件によって処理のルートを分ける構造です。「もしAならBをする、そうでなければCをする」という論理です。VBAでは If...Then...Else 構文などがこれに該当します。SCoTにおいては、単に「条件によって分ける」とするのではなく、「条件:セルの値が空欄の場合 → 処理:行を削除する」といったように、条件とそれに対応するアクションを明確に紐付けて定義します。
三つ目は「反復構造(Loop)」です。これは、同じ処理を指定回数、または特定の条件が満たされるまで繰り返す構造です。「1行目から最終行まで繰り返す」「ファイルがある限り繰り返す」といった処理です。VBAでは For...Next や Do...Loop が使われます。AIに対しては、繰り返しの「開始点」「終了条件」「繰り返す内容」の3点を明確に伝えることで、無限ループなどのバグを防ぎ、効率的なコードを生成させることができます。これら3つの構造を意識してプロンプトを組み立てることが、SCoTの実践における第一歩です。
自然言語の曖昧さを排除する:「なんとなく」の指示がバグを生む理由
私たちが普段使う自然言語は、非常に便利ですが、プログラミングの指示としては致命的な欠陥を持っています。それは「曖昧さ」です。例えば、「データを整理して」という指示には、並べ替え、削除、書式設定など無数の解釈が含まれ得ます。「A列を見て重複があったら削除して」という指示一つとっても、「上から見ていくのか下からか」「最初のデータを残すのか最後を残すのか」「空白は重複とみなすのか」といった詳細が不明確です。
AIは確率的に「最もありそうな解釈」を選んでコードを生成しますが、それがあなたの意図と一致するとは限りません。従来のCoTプロンプトでは、自然言語で思考させるため、この曖昧さが残ったままコード生成プロセスに進んでしまうことがありました。その結果、一見正しそうなコードでも、特定の条件下でエラーになったり、意図しないデータを消してしまったりする「論理エラー」を含んだプログラムが生成されることが多々ありました,。
SCoTは、この曖昧さを強制的に排除するフィルターとして機能します。「重複を削除する」という曖昧な願望を、「1. データの最終行を取得する(順次)」「2. 1行目から最終行までループする(反復)」「3. もし現在のセルの値が辞書オブジェクトに存在すれば(分岐)」「4. その行を削除する(順次)」という構造化されたロジックに変換します。このように、自然言語の段階でプログラムの構造レベルまで解像度を高めることで、AIは解釈の余地なく、指示された通りの厳密なコードを実装できるようになります。開発者として、「なんとなく」の言葉を捨て、構造化された論理で語る習慣を身につけましょう。
入力と出力(I/O)の明確化:SCoTプロンプトの出発点
SCoTプロンプトを作成する際、最も最初に定義すべきなのが「入力(Input)」と「出力(Output)」の構造です。あらゆるプログラムは、何らかの入力を受け取り、処理を行い、何らかの結果を出力する装置と見なせます。このI/O構造を明確に定義することは、プログラムの「入り口」と「出口」を定めることであり、AIが要件を正しく理解するための道しるべとなります,。
プロンプトの冒頭で、以下のように定義します。 【入力データ】 ・対象シート名:「売上データ」 ・データ範囲:A列(日付)、B列(商品名)、C列(金額) ・データ型:A列は日付型、C列は数値型(通貨) 【期待する出力】 ・出力先:「集計結果」シートのA1セル ・出力内容:月ごとの商品別売上合計表 ・形式:ピボットテーブルまたは集計表形式
このように入力データの構造(シート名、列の構成、データ型)と、期待される出力の形式を明示することで、AIは「どの変数を使い、どのような型の値を返す必要があるか」を正確に把握できます。研究では、このI/O構造をプロンプトに含めるだけで、AIのコード生成精度が向上することが示されています。特にVBAの場合、対象となるオブジェクト(シートやセル)が曖昧だとエラーの温床となるため、この定義は必須です。処理の中身(How)を考える前に、まず何が入り(Input)、何が出る(Output)のかを確定させる。これが構造化思考のスタートラインです。
「順次(Sequence)」の記述法:処理の流れを一本の線でつなぐ技術
「順次構造」はプログラムの基本ですが、AIに指示する際には、その「粒度」と「依存関係」に注意を払う必要があります。単に「AをしてBをして」と繋げるのではなく、一つの処理が一つのVBAステートメント(命令文)に対応するくらいの粒度まで分解し、箇条書きにすることが理想的です。
例えば、「請求書を作成してPDFで保存する」という業務をSCoTで記述する場合、以下のようになります。
1. 「請求書テンプレート」シートをコピーし、新しいシートを作成する。
2. 新しいシートの名前を、取引先名に変更する。
3. 取引先データから、宛名、日付、金額を新しいシートの所定セルに転記する。
4. シートの印刷範囲を設定する。
5. シートをPDF形式でエクスポートし、指定フォルダに保存する。
このようにステップを分解することで、AIは各工程に必要なVBAのメソッド(Copy, Name, Value, PageSetup, ExportAsFixedFormat)を迷わず選択できます。また、「1の処理が終わらないと2ができない」という依存関係も明確になります。もしこれを「請求書を作って保存して」と一行で指示してしまうと、AIはシートのコピーを忘れたり、名前の変更タイミングを間違えたりする可能性があります。開発者は、業務プロセスを映画のコマ送りのように分解し、一つ一つの動作を正確に言語化する能力が求められます。
「分岐(Branch)」の記述法:条件判定のロジックを構造化する
業務自動化において最も複雑になりがちなのが「条件分岐」です。実務では「AかつBの場合」や「AだけどCの場合は除く」といった複合的な条件が頻出します。これをAIに正確に伝えるには、If...ElseIf...Else の構造を模した形式で記述するのが効果的です。
SCoTプロンプトにおける記述例: ・【分岐処理】各行のデータについて、以下の条件で判定を行う。 – 条件1:D列の値が「完了」の場合 → 処理:その行の背景色をグレーにする。 – 条件2:D列の値が「保留」かつ、E列の日付が今日以前の場合 → 処理:その行の文字色を赤にし、F列に「要確認」と入力する。 – 条件3:それ以外の場合 → 処理:何もしない。
このように、条件と処理をペアにしてインデント(字下げ)を使って階層構造を表現することで、AIはそのままVBAの If 文のブロックとして認識します。また、「それ以外(Else)」の処理を明記することも重要です。これがないと、予期せぬデータが来た時にマクロがどう振る舞うかが不定となり、バグの原因になります。論理の漏れをなくし、あらゆるパターンのデータを想定して条件を網羅する。これが堅牢なシステムを作るための思考法です。
「反復(Loop)」の記述法:繰り返しの範囲と終了条件を支配する
大量のデータを一括処理できるのがVBAの醍醐味ですが、そのためには「反復構造」を正しく設計する必要があります。AIにループ処理を指示する際は、「何を」「どこからどこまで」「どうやって」繰り返すのかを定義します。
SCoTプロンプトにおける記述例: ・【反復処理】「売上データ」シートの2行目から、A列のデータが入っている最終行まで、以下の処理を繰り返す(Forループを使用)。 1. 変数 i をカウンタとして使用する。 2. A列の i 行目の値を取得する。 3. (取得した値に対する処理…) 4. 次の行へ進む。
ここで重要なのは、「最終行の取得方法」をAIに意識させることです。「データがある最後まで」という指示に対して、AIは UsedRange を使うか、End(xlUp) を使うかを判断します。「A列の最終行」と具体的に指定することで、途中に空白行があっても正しく最終行まで処理するコード(Cells(Rows.Count, "A").End(xlUp).Row)を引き出すことができます。また、ループの中で条件分岐を行う場合も、この反復構造の中に分岐構造を入れ子(ネスト)にして記述することで、複雑なロジックを正確に伝えることができます。
SCoTプロンプトの実践テンプレート:コピペで使える最強の型
これまでの要素を統合した、SCoTを用いたVBA生成用のプロンプトテンプレートを紹介します。これをベースに要件を埋めることで、誰でも高品質なコードを生成できます。
# 役割
あなたは熟練したExcel VBA開発者です。以下の要件に基づき、論理的に構造化されたVBAコードを作成してください。
# 目的
[ここにおおまかな目的を記述:例:売上リストから請求書を一括作成する]
# 入出力構造(I/O)
【入力】
・シート名:[シート名]
・データ範囲:[セル範囲]
・条件:[データの前提条件]
【出力】
・出力先:[シート名またはファイルパス]
・結果:[期待される結果]
# 処理ロジック(Structured Chain-of-Thought)
以下の構造で処理を実装してください。
1. **初期化(Sequence)**:
- 必要な変数を日本語で宣言する。
- 画面更新を停止する。
2. **データ取得(Sequence)**:
- 対象シートの最終行を取得する。
3. **繰り返し処理(Loop)**:
- 2行目から最終行までループする。
- **条件判定(Branch)**:
- もし[条件A]ならば:
- [処理内容1]を実行する。
- そうでなければ:
- [処理内容2]を実行する。
4. **終了処理(Sequence)**:
- 画面更新を再開する。
- 完了メッセージを表示する。
# 制約条件
・変数名は分かりやすい日本語を使用してください。
・各ブロックには処理内容を説明するコメントを入れてください。
・エラー処理(On Error Resume Next等ではなく、適切なハンドリング)を含めてください。
このテンプレートは、SCoTの概念(I/O、3つの基本構造)をそのままプロンプトの形式に落とし込んだものです,。この型に従って埋めていくだけで、自然と構造化思考ができるようになり、AIへの指示精度が飛躍的に向上します。
事例研究:SCoTなし vs SCoTありでの生成コード比較
実際に、SCoTを使った場合と使わなかった場合で、生成されるコードにどのような違いが出るかを見てみましょう。 課題:「リストの中の数値を合計するが、途中に文字列があったらスキップし、合計が1000を超えたらそこで終了する」
【SCoTなし(自然言語のみ)】 指示:「リストを合計して。文字は無視して。1000超えたら終わり。」 結果:AIは Sum 関数を使おうとしたり、ループの終了条件(Exit For)を書き忘れたり、文字列の判定(IsNumeric)が漏れたりする可能性があります。曖昧な指示は、曖昧なコードを生みます。
【SCoTあり】 指示:
1. 合計変数を0で初期化。
2. リストをループ。
3. 【分岐】もし値が数値なら:合計に加算。
4. 【分岐】もし合計 > 1000なら:ループを抜ける。 結果:
Dim 合計 As Long
合計 = 0
For Each セル In 範囲
If IsNumeric(セル.Value) Then
合計 = 合計 + セル.Value
If 合計 > 1000 Then Exit For
End If
Next
SCoTを用いることで、IsNumeric による数値判定や、Exit For によるループ脱出といった詳細なロジックが確実に実装されます,。構造化された指示は、AIにとっての明確な設計図となり、迷いのないコーディングを可能にします
思考の可視化によるデバッグ:AIの「勘違い」を未然に防ぐ
SCoTのもう一つのメリットは、コードを書かせる前に「AIの思考プロセスを確認できる」点です。いきなりコードを出力させるのではなく、「まずSCoT(処理の手順)を作成して」と指示し、AIが出力したロジックを人間がレビューします。
例えば、AIが「3. データを削除する」というステップを出力したとします。もしそれが意図しない処理であれば、コードが書かれる前に「削除ではなく、非表示にして」と修正指示を出すことができます。コードになってからバグを見つけるよりも、日本語のロジックの段階で修正する方がはるかに容易で効率的です。 また、エラーが発生した際も、SCoTのどのステップでつまづいているかを照らし合わせることで、原因特定がスムーズになります。「手順2のデータの取得で失敗しているな」と当たりをつけることができるからです。SCoTは、開発者とAIの間で認識をすり合わせるための「合意形成ツール」としても機能します。
複雑なネスト構造への対応:入れ子になったロジックを分解する
実務レベルのマクロでは、「フォルダ内の全ブックを開き(ループ1)、その中の全シートを確認し(ループ2)、特定のセルが条件を満たせば(分岐1)、データを転記する(順次)」といった、多重のネスト構造が登場します。これを文章で説明しようとすると非常に複雑になりますが、SCoTを使えばインデントによる階層構造でスッキリと表現できます。
1. フォルダ内のファイルを取得(Loop)
1.1. ファイルを開く
1.2. ブック内の全シートをループ(Loop)
1.2.1. シート名が「対象」か判定(Branch)
- True:データを転記(Sequence)
- False:次のシートへ
1.3. ブックを閉じる
このように視覚的に構造化することで、AIは For 文や If 文の開始と終了(Next, End If)の対応関係を正しく認識し、構文エラーのないコードを生成します。複雑な業務フローほど、SCoTによる分解と構造化が威力を発揮します。
開発者としての論理的思考力:AIを通じて自らの設計力を高める
SCoTを導入することは、単にAIへの指示出しテクニックを学ぶだけではありません。それは、あなた自身の「論理的思考力(プログラミング的思考)」を鍛えるトレーニングでもあります。 「この業務を自動化するには、どういう順序で、どんな条件判断が必要か?」を常に考え、構造化して言語化する習慣は、VBAに限らずあらゆる業務改善やシステム設計に通じる普遍的なスキルです。
AIはあなたの思考を映す鏡です。あなたの思考が構造化されていれば、AIは完璧なコードを返します。SCoTを通じてAIと対話することは、あなたを「単なる作業者」から、業務プロセスを設計しコントロールする真の「開発者」へと成長させてくれるでしょう。
の導入-「順次」「分岐(If)」「繰り返し(Loop)」の3つの構造を意識-scaled.jpg)