Chat GPTを活用したExcelマクロの作り方
最近の人工知能は性能が高く、適切に指示をすれば、プログラムを自動で生成することもできます。
そこで、今回はプログラム初心者の方が、Chat GPTを使用し、Excelマクロを作成する方法について、紹介したいと思います。
Excelマクロは、Excelの機能を自動化するためのツールです。
具体的には、VBA(Visual Basic for Applications)というプログラミング言語を使って、さまざまなことができます。
一例としては下記のようなことができます。
- データの自動入力(他のExcelから入力など)
- データの自動整形
- 計算の自動化
- 表の自動生成
- グラフの自動生成
- インターネットから情報を取得
今回作成するExcelマクロの機能
- 下のエクセルから果物の情報だけ抽出して集計用のExcelに転記
- 転記した情報を集計
- 転記した情報から表とグラフ作成
抽出元のエクセル

マクロ実行後

Excelマクロ作成のための事前設定
サンプルファイルのダウンロード
抽出元のExcelデータを準備しましたので、必要に応じてダウンロードください。
Excelの事前設定
まずはマクロが生成できるように、Excelの設定をします。
①ファイル

②オプションを選択(画面左下)

③リボンのユーザー設定

④開発に✓を入れ、OK

以下のように開発タブが追加されていれば、OKです。

Chat GPTへの指示方法
Chat GPTに指示するには下記サイトへ飛んで依頼をします。(無料版です。)
生成AIにマクロを作ってもらう際は以下のようなことを注意すると上手くプログラムを作ってくれます。
- 対象のシート名を記載する。 ➡ 今回は「Sheet1」
- セルの対象範囲を指定する。 ➡ 今回は省略
- 実行条件と動作内容を明確に記載する。
実際の指示例
指示例は以下のとおりです。
ワンクリックでコピーできるようにしていますので、是非試してみてください。
一回で上手くできなくても、大丈夫です。
良くなかったところをChat GPTに修正依頼することで、対応してくれます。
Excelマクロで、下記プログラムを作成して
・マクロ実行ファイルとは別のExcelファイルから情報を抽出します。
抽出対象のExcelファイルは人間が選択する形にしてください。
・抽出対象のExcelファイルのSheet1の情報を抽出し、マクロ実行ファイルのSheet1へ転記してください。
ただし、抽出対象は果物に関する情報のみとしてください。(もも、ぶどう、みかん)
・抽出したデータを元に出荷品ごとの合計金額、出荷年月ごとの合計金額を計算し、
それぞれ表にまとめてください。
・表はSheet2へ作成してください。Sheet2が無い場合は作成してください。
・表のタイトルセルは黄緑色で背景色を付けてください。
・表は格子状の枠を付けてください。
・その表(2つ)を元に折れ線グラフを作成してください。
抽出元の情報は下記のようなイメージです。
出荷品 出荷年月 単価
もも Apr-25 500
キャベツ Apr-25 150
ジャガイモ Apr-25 60
ぶどう Apr-25 600
トマト Apr-25 100
みかん Apr-25 300
玉ねぎ Apr-25 50
もも May-25 500
キャベツ May-25 150
★実際に作成してくれたプログラムは以下のとおりです。
Sub 抽出して集計とグラフ作成()
Dim 抽出元ブック As Workbook
Dim 抽出元シート As Worksheet
Dim 抽出先シート1 As Worksheet
Dim 抽出先シート2 As Worksheet
Dim ファイルパス As String
Dim 最終行 As Long
Dim i As Long, j As Long
Dim 転記行 As Long
Dim 出荷品 As Variant ' ← 修正ポイント
Dim 出荷年月 As Variant ' ← 修正ポイント
Dim 単価 As Double
Dim 集計Dict1 As Object ' 出荷品ごとの合計
Dim 集計Dict2 As Object ' 出荷年月ごとの合計
' 対象の果物リスト
Dim 果物リスト As Variant
果物リスト = Array("もも", "ぶどう", "みかん")
' ファイル選択ダイアログ
ファイルパス = Application.GetOpenFilename("Excelファイル (*.xlsx), *.xlsx")
If ファイルパス = "False" Then
MsgBox "ファイルが選択されませんでした。", vbExclamation
Exit Sub
End If
' ブックを開く
Set 抽出元ブック = Workbooks.Open(Filename:=ファイルパス)
Set 抽出元シート = 抽出元ブック.Sheets("Sheet1")
' 転記先シート(Sheet1)
Set 抽出先シート1 = ThisWorkbook.Sheets("Sheet1")
抽出先シート1.Cells.ClearContents
抽出先シート1.Range("A1").Value = "出荷品"
抽出先シート1.Range("B1").Value = "出荷年月"
抽出先シート1.Range("C1").Value = "単価"
転記行 = 2
' データの抽出
最終行 = 抽出元シート.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To 最終行
出荷品 = Trim(抽出元シート.Cells(i, 1).Value)
出荷年月 = Trim(抽出元シート.Cells(i, 2).Value)
単価 = 抽出元シート.Cells(i, 3).Value
For j = LBound(果物リスト) To UBound(果物リスト)
If 出荷品 = 果物リスト(j) Then
抽出先シート1.Cells(転記行, 1).Value = 出荷品
抽出先シート1.Cells(転記行, 2).Value = 出荷年月
抽出先シート1.Cells(転記行, 3).Value = 単価
転記行 = 転記行 + 1
Exit For
End If
Next j
Next i
抽出元ブック.Close SaveChanges:=False
' Sheet2の準備
On Error Resume Next
Set 抽出先シート2 = ThisWorkbook.Sheets("Sheet2")
If 抽出先シート2 Is Nothing Then
Set 抽出先シート2 = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
抽出先シート2.Name = "Sheet2"
End If
On Error GoTo 0
抽出先シート2.Cells.ClearContents
' Dictionary初期化
Set 集計Dict1 = CreateObject("Scripting.Dictionary")
Set 集計Dict2 = CreateObject("Scripting.Dictionary")
' 集計処理
For i = 2 To 抽出先シート1.Cells(Rows.Count, 1).End(xlUp).Row
出荷品 = 抽出先シート1.Cells(i, 1).Value
出荷年月 = 抽出先シート1.Cells(i, 2).Value
単価 = 抽出先シート1.Cells(i, 3).Value
' 出荷品ごと
If Not 集計Dict1.exists(出荷品) Then
集計Dict1(出荷品) = 0
End If
集計Dict1(出荷品) = 集計Dict1(出荷品) + 単価
' 出荷年月ごと
If Not 集計Dict2.exists(出荷年月) Then
集計Dict2(出荷年月) = 0
End If
集計Dict2(出荷年月) = 集計Dict2(出荷年月) + 単価
Next i
' 表1:出荷品ごとの合計
抽出先シート2.Range("A1").Value = "出荷品"
抽出先シート2.Range("B1").Value = "合計金額"
抽出先シート2.Range("A1:B1").Interior.Color = RGB(204, 255, 204) ' 黄緑
i = 2
For Each 出荷品 In 集計Dict1.Keys
抽出先シート2.Cells(i, 1).Value = 出荷品
抽出先シート2.Cells(i, 2).Value = 集計Dict1(出荷品)
i = i + 1
Next 出荷品
Dim 品目表範囲 As Range
Set 品目表範囲 = 抽出先シート2.Range("A1:B" & i - 1)
品目表範囲.Borders.LineStyle = xlContinuous
' 表2:出荷年月ごとの合計
抽出先シート2.Range("D1").Value = "出荷年月"
抽出先シート2.Range("E1").Value = "合計金額"
抽出先シート2.Range("D1:E1").Interior.Color = RGB(204, 255, 204) ' 黄緑
i = 2
For Each 出荷年月 In 集計Dict2.Keys
抽出先シート2.Cells(i, 4).Value = 出荷年月
抽出先シート2.Cells(i, 5).Value = 集計Dict2(出荷年月)
i = i + 1
Next 出荷年月
Dim 年月表範囲 As Range
Set 年月表範囲 = 抽出先シート2.Range("D1:E" & i - 1)
年月表範囲.Borders.LineStyle = xlContinuous
' グラフ作成
Dim グラフ1 As ChartObject
Dim グラフ2 As ChartObject
' グラフ1(品目別)
Set グラフ1 = 抽出先シート2.ChartObjects.Add(Left:=10, Top:=年月表範囲.Top + 年月表範囲.Height + 30, Width:=300, Height:=200)
With グラフ1.Chart
.SetSourceData Source:=品目表範囲
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Text = "出荷品ごとの合計金額"
End With
' グラフ2(年月別)
Set グラフ2 = 抽出先シート2.ChartObjects.Add(Left:=320, Top:=年月表範囲.Top + 年月表範囲.Height + 30, Width:=300, Height:=200)
With グラフ2.Chart
.SetSourceData Source:=年月表範囲
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Text = "出荷年月ごとの合計金額"
End With
MsgBox "データ抽出と集計が完了しました!", vbInformation
End Sub
コードの貼り付け方法
コードのSub 抽出して集計とグラフ作成()の部分に注目していただき、「抽出して集計とグラフ作成」をコピーします。(これがプログラムの名前になります。)
Sub 抽出して集計とグラフ作成()
Dim 抽出元ブック As Workbook
Dim 抽出元シート As Worksheet
Dim 抽出先シート1 As Worksheet
Dim 抽出先シート2 As Worksheet
Dim ファイルパス As String
Dim 最終行 As Long
Dim i As Long, j As Long
・・・
続いてエクセル側にコードを貼り付けます。
①開発タブ

②マクロを選択

③プログラム名「抽出して集計とグラフ作成」を貼り付けし、作成

以下のような画面が立ち上がるので、

④赤枠部分は重複するので、削除し、Chat GPTが作成したコードを貼り付けてください。
これだけでプログラムが完成します!
※保存後、再度編集したい場合は、以下の手順で再編集できます。
開発タブ → マクロ → 先ほどプログラム「抽出して集計とグラフ作成」を選択 → 編集
実行方法
実行方法は簡単です。
開発タブ → マクロ → プログラム名「抽出して集計とグラフ作成」を選択 → 実行
でプログラムが動きますので、確認してみてください。

今回は、人間がファイルを選択する仕様なので、下記のようにファイル選択画面が起動します。

ダウンロードしたExcelファイルを選択するとプログラムが処理をし、下記のような表とグラフが出来上がります。
保存時の注意
今回はExcelにマクロの機能を付けていますので、保存時はExcelマクロ有効ブック (*.xlsm)で保存していることを確認してください。
上記でないとせっかく作成したプログラムが消えてしましますので、注意してください。
失敗パターン
Chat GPTも万能ではないため、プログラムの作成ミスをすることがあります。
今回も実は下記のようなエラーを出しました。。。
そんなときは、エラーの内容を伝えて、修正してください。と伝えると上手く修正してくれます。
For Eachに指定する変数はバリアント型またはオブジェクト型でなければなりません。というエラーが出ます。 修正してください。出力は全文でお願いします。
失敗した時のコードです。
Sub 抽出して集計とグラフ作成()
Dim 抽出元ブック As Workbook
Dim 抽出元シート As Worksheet
Dim 抽出先シート1 As Worksheet
Dim 抽出先シート2 As Worksheet
Dim ファイルパス As String
Dim 最終行 As Long
Dim i As Long, j As Long
Dim 転記行 As Long
Dim 出荷品 As String
Dim 出荷年月 As String
Dim 単価 As Double
Dim 集計Dict1 As Object ' 出荷品ごとの合計
Dim 集計Dict2 As Object ' 出荷年月ごとの合計
' 対象の果物リスト
Dim 果物リスト As Variant
果物リスト = Array("もも", "ぶどう", "みかん")
' ファイル選択ダイアログ
ファイルパス = Application.GetOpenFilename("Excelファイル (*.xlsx), *.xlsx")
If ファイルパス = "False" Then
MsgBox "ファイルが選択されませんでした。", vbExclamation
Exit Sub
End If
' ブックを開く
Set 抽出元ブック = Workbooks.Open(Filename:=ファイルパス)
Set 抽出元シート = 抽出元ブック.Sheets("Sheet1")
' 転記先シート(Sheet1)
Set 抽出先シート1 = ThisWorkbook.Sheets("Sheet1")
抽出先シート1.Cells.ClearContents
抽出先シート1.Range("A1").Value = "出荷品"
抽出先シート1.Range("B1").Value = "出荷年月"
抽出先シート1.Range("C1").Value = "単価"
転記行 = 2
' データの抽出
最終行 = 抽出元シート.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To 最終行
出荷品 = Trim(抽出元シート.Cells(i, 1).Value)
出荷年月 = Trim(抽出元シート.Cells(i, 2).Value)
単価 = 抽出元シート.Cells(i, 3).Value
For j = LBound(果物リスト) To UBound(果物リスト)
If 出荷品 = 果物リスト(j) Then
抽出先シート1.Cells(転記行, 1).Value = 出荷品
抽出先シート1.Cells(転記行, 2).Value = 出荷年月
抽出先シート1.Cells(転記行, 3).Value = 単価
転記行 = 転記行 + 1
Exit For
End If
Next j
Next i
抽出元ブック.Close SaveChanges:=False
' Sheet2の準備
On Error Resume Next
Set 抽出先シート2 = ThisWorkbook.Sheets("Sheet2")
If 抽出先シート2 Is Nothing Then
Set 抽出先シート2 = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
抽出先シート2.Name = "Sheet2"
End If
On Error GoTo 0
抽出先シート2.Cells.ClearContents
' Dictionary初期化
Set 集計Dict1 = CreateObject("Scripting.Dictionary")
Set 集計Dict2 = CreateObject("Scripting.Dictionary")
' 集計処理
For i = 2 To 抽出先シート1.Cells(Rows.Count, 1).End(xlUp).Row
出荷品 = 抽出先シート1.Cells(i, 1).Value
出荷年月 = 抽出先シート1.Cells(i, 2).Value
単価 = 抽出先シート1.Cells(i, 3).Value
' 出荷品ごと
If Not 集計Dict1.exists(出荷品) Then
集計Dict1(出荷品) = 0
End If
集計Dict1(出荷品) = 集計Dict1(出荷品) + 単価
' 出荷年月ごと
If Not 集計Dict2.exists(出荷年月) Then
集計Dict2(出荷年月) = 0
End If
集計Dict2(出荷年月) = 集計Dict2(出荷年月) + 単価
Next i
' 表1:出荷品ごとの合計
抽出先シート2.Range("A1").Value = "出荷品"
抽出先シート2.Range("B1").Value = "合計金額"
抽出先シート2.Range("A1:B1").Interior.Color = RGB(204, 255, 204) ' 黄緑
i = 2
For Each 出荷品 In 集計Dict1.Keys
抽出先シート2.Cells(i, 1).Value = 出荷品
抽出先シート2.Cells(i, 2).Value = 集計Dict1(出荷品)
i = i + 1
Next 出荷品
Dim 品目表範囲 As Range
Set 品目表範囲 = 抽出先シート2.Range("A1:B" & i - 1)
品目表範囲.Borders.LineStyle = xlContinuous
' 表2:出荷年月ごとの合計
抽出先シート2.Range("D1").Value = "出荷年月"
抽出先シート2.Range("E1").Value = "合計金額"
抽出先シート2.Range("D1:E1").Interior.Color = RGB(204, 255, 204) ' 黄緑
i = 2
For Each 出荷年月 In 集計Dict2.Keys
抽出先シート2.Cells(i, 4).Value = 出荷年月
抽出先シート2.Cells(i, 5).Value = 集計Dict2(出荷年月)
i = i + 1
Next 出荷年月
Dim 年月表範囲 As Range
Set 年月表範囲 = 抽出先シート2.Range("D1:E" & i - 1)
年月表範囲.Borders.LineStyle = xlContinuous
' グラフ作成
Dim グラフ1 As ChartObject
Dim グラフ2 As ChartObject
' グラフ1(品目別)
Set グラフ1 = 抽出先シート2.ChartObjects.Add(Left:=10, Top:=年月表範囲.Top + 年月表範囲.Height + 30, Width:=300, Height:=200)
With グラフ1.Chart
.SetSourceData Source:=品目表範囲
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Text = "出荷品ごとの合計金額"
End With
' グラフ2(年月別)
Set グラフ2 = 抽出先シート2.ChartObjects.Add(Left:=320, Top:=年月表範囲.Top + 年月表範囲.Height + 30, Width:=300, Height:=200)
With グラフ2.Chart
.SetSourceData Source:=年月表範囲
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Text = "出荷年月ごとの合計金額"
End With
MsgBox "データ抽出と集計が完了しました!", vbInformation
End Sub
コメント