とことこプーレ

【第15回Excelマクロ】VBAとChatGPTの活用【ほぼfor/if文】

今回はChatGPTを使ってマクロを作ってみました。作るマクロは、以前に作成したものと同じデータを使って集計をしていきます。

【第9回Excelマクロ】複数条件のある集計【ほぼfor/if文】

ChatGPTのリンク先

まずは以下のリンクをクリックして、ChatGPTのページを開きましょう。

ChatGPT

ChatGPTの準備

リンク先を開くと、以下のページに飛びます。

【今すぐ始める】を選択しましょう。

まずは、【ログアウトしたまま】を選択してみます。

下の画面が表示されたら、【ChatGPTにメッセージを送信する】の入力ボックスに文字を入力して使えます。

入力ボックス内では、Shift+Enterで改行できます。

ログインせずに使ってみる1

お試しで、最終行と最終列を取得するコードを聞いてみましょう。

【VBAで1行目の最終行と最終列を取得するコード】と入力して送信してみます。

すると、以下のように返答がありました。

解説もついていて、コードの書き方を忘れたときにも便利ですね。

【コードをコピーする】をクリックすると簡単にコードのコピペもできます。

ログインせずに使ってみる2

表題のとおり、以下の表の集計をしてみます。

Excel上で表の一部をコピーして貼り付け、さらに

・性別の列をオス、メスに分けて集計

・HPの列を70以下、71〜80、81以上に分けて集計するVBAのコードを作成

とメッセージを入力してみます。

すると、以下のように返答がありました。

続いて、以下のコードが返ってきました。

Sub 集計()

    Dim ws As Worksheet
    Dim resultWs As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim male70 As Long, male71to80 As Long, male81 As Long
    Dim female70 As Long, female71to80 As Long, female81 As Long
    
    ' ワークシートの設定
    Set ws = ThisWorkbook.Sheets(1) ' 元データのシート名
    Set resultWs = ThisWorkbook.Sheets.Add ' 結果を新しいシートに表示
    
    ' データの最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 集計初期化
    male70 = 0: male71to80 = 0: male81 = 0
    female70 = 0: female71to80 = 0: female81 = 0
    
    ' データ集計
    For i = 2 To lastRow ' 1行目はヘッダのため2行目から
        Dim hp As Long
        Dim gender As String
        
        hp = ws.Cells(i, 2).Value ' HPの値を取得
        gender = ws.Cells(i, 5).Value ' 性別を取得
        
        ' HPの範囲に基づいて集計
        If hp <= 70 Then
            If gender = "オス" Then
                male70 = male70 + 1
            ElseIf gender = "メス" Then
                female70 = female70 + 1
            End If
        ElseIf hp >= 71 And hp <= 80 Then
            If gender = "オス" Then
                male71to80 = male71to80 + 1
            ElseIf gender = "メス" Then
                female71to80 = female71to80 + 1
            End If
        ElseIf hp >= 81 Then
            If gender = "オス" Then
                male81 = male81 + 1
            ElseIf gender = "メス" Then
                female81 = female81 + 1
            End If
        End If
    Next i
    
    ' 結果を新しいシートに書き込む
    resultWs.Cells(1, 1).Value = "性別"
    resultWs.Cells(1, 2).Value = "HP 70以下"
    resultWs.Cells(1, 3).Value = "HP 71~80"
    resultWs.Cells(1, 4).Value = "HP 81以上"
    
    resultWs.Cells(2, 1).Value = "オス"
    resultWs.Cells(2, 2).Value = male70
    resultWs.Cells(2, 3).Value = male71to80
    resultWs.Cells(2, 4).Value = male81
    
    resultWs.Cells(3, 1).Value = "メス"
    resultWs.Cells(3, 2).Value = female70
    resultWs.Cells(3, 3).Value = female71to80
    resultWs.Cells(3, 4).Value = female81
    
    ' 結果のシートを表示
    resultWs.Activate
    
End Sub

コードをコピペして使ってみると、集計された結果が別シートに出力されました。

ChatGPT4oについて

今度はログインして使ってみましょう。

使用に制限はありますが、ログインすることによって【ChatGPT4o】を無料で使えます。このChatGPT4oではファイルをアップロードすることでき、そのファイルのデータの解析までしてくれます。

ChatGPT4oを使ってみる

実際にChatGPT4oを使ってみましょう。

まずは、集計するデータを作ってみました。ファイルの構成は以下の通りです。

Excelファイルにシートが2つあり、

・【データ】シート→集計するデータ

・【集計結果】シート→集計結果を出力

となっています。

次にChatGPTにExcelファイルをドラッグ&ドロップします。さらに【データシートを集計し、集計結果の表に出力するマクロを作成】と入力してみます。

続いて、集計内容の提案が表示されたので【「データ」シートの集計結果を「集計結果」シートに出力するマクロを追加】と入力しました。

次に、以下の返答がありました。

コードも返ってきました。

Sub 集計処理()
    Dim wsData As Worksheet, wsResult As Worksheet
    Dim lastRow As Long
    Dim male70 As Long, male71_80 As Long, male80 As Long
    Dim female70 As Long, female71_80 As Long, female80 As Long
    Dim i As Long
    Dim HP As Double
    Dim gender As String
    
    ' シートの指定
    Set wsData = ThisWorkbook.Sheets("データ")
    Set wsResult = ThisWorkbook.Sheets("集計結果")
    
    ' データシートの最終行を取得
    lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
    
    ' カウントを初期化
    male70 = 0: male71_80 = 0: male80 = 0
    female70 = 0: female71_80 = 0: female80 = 0
    
    ' データをループして集計
    For i = 2 To lastRow
        HP = wsData.Cells(i, 2).Value ' HP列(2列目)
        gender = wsData.Cells(i, 5).Value ' 性別列(5列目)
        
        If gender = "オス" Then
            If HP <= 70 Then
                male70 = male70 + 1
            ElseIf HP > 70 And HP <= 80 Then
                male71_80 = male71_80 + 1
            ElseIf HP > 80 Then
                male80 = male80 + 1
            End If
        ElseIf gender = "メス" Then
            If HP <= 70 Then
                female70 = female70 + 1
            ElseIf HP > 70 And HP <= 80 Then
                female71_80 = female71_80 + 1
            ElseIf HP > 80 Then
                female80 = female80 + 1
            End If
        End If
    Next i
    
    ' 集計結果シートに出力
    wsResult.Cells(2, 2).Value = male70
    wsResult.Cells(2, 3).Value = male71_80
    wsResult.Cells(2, 4).Value = male80
    
    wsResult.Cells(3, 2).Value = female70
    wsResult.Cells(3, 3).Value = female71_80
    wsResult.Cells(3, 4).Value = female80
    
    MsgBox "集計が完了しました!", vbInformation
End Sub

コードを実行してみると、集計結果は正しいものの、下図のように出力がズレていました。

出力部分のコードを見てみると以下のようになっていたので、修正を加えます。

' 集計結果シートに出力
    wsResult.Cells(2, 2).Value = male70
    wsResult.Cells(2, 3).Value = male71_80
    wsResult.Cells(2, 4).Value = male80
    
    wsResult.Cells(3, 2).Value = female70
    wsResult.Cells(3, 3).Value = female71_80
    wsResult.Cells(3, 4).Value = female80

↓
' 集計結果シートに出力
    wsResult.Cells(3, 2).Value = male70
    wsResult.Cells(3, 3).Value = male71_80
    wsResult.Cells(3, 4).Value = male80
    
    wsResult.Cells(4, 2).Value = female70
    wsResult.Cells(4, 3).Value = female71_80
    wsResult.Cells(4, 4).Value = female80

集計結果シートも直した後、再度実行することで以下の通りになりました。

その後、ちょうどChatGPT4oの制限に達したようで以下の返答がありました。

それ以降はファイルをアップロードすることはできなくなりました。

最後に

初めてChatGPTを使ってみましたが、コードの書き方を忘れたときや、そもそもどういった処理をしたら良いか分からない…といったときにも使えてとても便利ですね。

ChatGPTが返してくれた集計のコードを見てみると、配列を使わずに変数を使って集計をしていますね。集計方法へのアプローチの仕方もこのChatGPTで勉強ができますね。

変数名を考えるのも苦手なので、名前のつけ方も参考になります。

また、日を改めて同様の内容を聞いてみると、集計結果がmsgboxで出力されるようになっていたり、今度は配列を使って集計をしてみたりと様々な返答がありました。一方で、コード自体が間違っていてエラーが起こることもありました。やはりコードのチェックも必要ですね。

実際に使ってみるとChatGPTの便利さがよりわかると思うので、ぜひ使ってみましょう。

モバイルバージョンを終了