Chat GPTを活用したExcelマクロの作り方

このサイトはアフィリエイト広告を含みます
IT・ブログ

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に指示するには下記サイトへ飛んで依頼をします。(無料版です。)

Just a moment...

生成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

コメント

タイトルとURLをコピーしました