ExcelVBAのコード生成をするchatGPTのプロンプトのコツ

この記事は、noteの[こちらの有料記事：ExcelVBAコードを生成するプロンプトのコツと解説（全19項目）](https://note.com/keiri_info/n/na5da667e42cf)で紹介している内容のうち、無料部分の内容までをご紹介します。

最近では、Yahoo知恵袋などのプラットフォームでも、生成AIが自動で回答を提供することが増えています。そのため、実際に生成AIをコード作成に活用している方も多いのではないでしょうか。私もExcelVBAのコード作成時に、ChatGPTにプロンプト（命令文）を投げてコードの素案を作成してもらうことがよくあります。これまでに投げたプロンプトの数は、軽く1,000回以上にのぼります。

しかし、単に「～がしたい。」といったシンプルなプロンプトだけでは、自分の意図通りのコードが返ってくることは少ないです。また、単純作業以外では、実行しても期待通りに動作しないことも多々あります。これは、ExcelVBAでは技術的に実現が難しいことを要求しているケースもありますが、そうでない場合は、プロンプトの工夫次第で生成AIが提供するコードの修正にかかる時間を大幅に短縮できます。

そこで、書籍やインターネットの記事を参考にしたり、実際にプロンプトを使いながら、ExcelVBAに特化したプロンプトのテンプレートを作成しました。これからそのテンプレートをご紹介し、各プロンプト文の意図も併せて解説します。

プロンプトの全文はnoteの有料部分で全列挙していますが、ExcelVBAのコードを作成するためのプロンプトに入れるべき項目のうち、いくつかの文章について解説します。まずは下記の文章からプロンプトを始めます。

```
あなたは優秀なプログラマーです。下記の要件のExcel VBAのコードを書いて下さい。 
## 要件
- 
```
chatGPTのプロンプトのコツでも「立場や役割」明記する、とよく謡われています。（他の例でいえば、「あなたは教師です。」「あなたはライターです。」など）専門家になりきってもらうことで、回答の精度が上げることが可能です。
今回の場合は、ExcelVBAのコードを作成してもらいますので、「優秀なプログラマー」という立場で生成AIに回答してもらいます。
※なお、大げさな表現で「あなたは不可能を可能にするプログラミングの魔術師です。」みたいな役割を与えてプロンプトしてみたこともありますが、単に「優秀なプログラマー」と記載した場合と優位な差は感じませんでした笑

「## 要件」の部分は自分が作成したいコードの内容を具体的に記載してください。箇条書きでも複数の要件を記載して構いません。
例えば、下記のような形で記載します。

```
あなたは優秀なプログラマーです。下記の要件のExcel VBAのコードを書いて下さい。 
## 要件
- アクティブブックのアクティブシートに対して、手動で挿入した改ページを削除する。
```
ここで「アクティブブックのアクティブシート」に対してと記載しているのは、個人マクロブックに保存して、色々なブック（マクロ有効ブックに限らない）に対して実行するコードの作成を想定しているためです。
特に対象のブック等を指定しない場合は、「Thisworkbook」にコードがある前提でコードがかえ返ってくることが多いです。作成しようとしているのがマクロ有効ブックにコードを置く前提であればよいですが、そうでないなら、対象としているブック名やシート名等を要件に記載しましょう。
このとき実際のブック名やシート名を記載する必要はなく、仮の名称でも全然問題ありません。（仮の名称の場合は、コードを実行する際に自分で手直しする必要はありますが。）

:::note info
ちなみに、「## 要件」が##と半角スペースなのも、箇条書きが-（マイナス）と半角スペースからは始まっているのも意味があります。（箇条書きは-（マイナス）以外にも、+(プラス)か、*(アスタリスク)でも大丈夫です。）
これらは、Markdown記法のルールに基づいて記載しています。（#の個数も見出しの階層を意味しますので、一応、意味があります。）多少雰囲気で「###要件###（半角スペースを入れてない）」とか「・」で箇条書きする、でもOKですが、より精度の高い回答を期待するor指示命令（プロンプト）の生成AIへの伝わりやすさを重視するなら、厳密にMarkdown記法のルールに基づいて記載すると、より良い回答が得られると思います。
Markdown記法に興味がある方は、他の方のQiitaの記事に詳しい解説がありますので、ぜひ調べてみてください。（これは慣れてきたらで大丈夫です。）
:::

次に「## 制約」の部分です。例として３つの文の制約を記載しています。（有料部分ではさらに16項目（※今後追記の可能性あり）の制約を記載しています。）
```
あなたは優秀なプログラマーです。下記の要件のExcel VBAのコードを書いて下さい。 
## 要件
- 
## 制約
- VBAで実現が難しい内容であれば、コードの回答はせず「できません。」と回答すること
- すべての変数はDimステートメントで明示的に宣言すること
- 整数型の変数はLong型で統一すること（Integer型を使用しない）
```
最初の制約についての詳しく説明します。
```
1.VBAで実現が難しい内容であれば、コードの回答はせず「できません。」と回答すること
```
自分が行おうとしていることがExcelVBAでは難しい場合でも、生成AIでは『それっぽい』コードの回答が返ってくることが多々あります。もちろんそのコードをVBEに貼り付けして実行しても、想定通りに動作しません。
自分で手直ししても、chatGPTにプロンプトを再度投げて修正してもらっても、VBAで実現できないことはあるのです。
その場合に、コードの手直し等に費やした時間は無駄になります。（こういうことは「VBAでは実現できない。」ということを身をもって理解する経験にはなりますが…。）
そうした時間の浪費を防ぐためにも、「VBAで実現が難しい内容であれば、コードの回答はせず『できません。』と回答すること」という一文を、**通常は**プロンプトに入れておくことが無難です。
ただし、「VBAで実現が難しい内容であれば、コードの回答はせず『できません。』と回答すること」とすると、自分で少し頑張ったりアイディア次第でVBAで実現できる場合でも「できません。」と回答が返って来たりもするので、良し悪しもあります。そのため、基本的には、「VBAで実現が難しい内容であれば、コードの回答はせず『できません。』と回答すること」という一文を入れておいて、実際に「できません。」と回答が返って来たら、プロンプトからその一文を外してみて、回答内容が変わるか再度プロンプトしてみるのをおすすめします。
```
2.すべての変数はDimステートメントで明示的に宣言すること
```
この文を入れると変数宣言を強制化（「Option Explicit」）することを前提でコードを記載してくれます。この文がないと、変数宣言をせずに変数を使ってくることもあるので、必ず入れましょう。
```
3.整数型の変数はLong型で統一すること（Integer型を使用しない）
```
これは諸説あって、どちらも整数型なのですが、Long型の方が速いという方も多いですし、Integer型だとExcelの行数の関係で深刻なエラーの原因になったりするので、記載しておきましょう。結構、Integer型でコードが返ってくることも多いので、自分で手直しするよりも最初からプロンプトに入れておく方が無難です。

以上、noteの[こちらの有料記事：ExcelVBAコードを生成するプロンプトのコツと解説（全19項目）](https://note.com/keiri_info/n/na5da667e42cf)の無料部分になります。

価格は200円で、有料記事では、##制約に入れるべき内容とその解説をしています。ご興味のある方は、ぜひご購読ください。