見出し画像

ChatGPTを利用して、Excelのツールを作成してみた

はじめに 


 今流行りのChatGPTを利用して、業務で利用するEXCELなどをより便利に簡単に作成・アレンジできないかと思い使ってみました。
今回は、EXCELシート内に記載された日付が、対象の期間内に入っているかを確認するためのマクロを作ってみました。 
 
開発をしていくために以下の内容をExcelマクロで実装していきます。
・対象の期間(開始日と終了日)の入力画面を作成
・日付の入力値が正しいか確認
・エクセルシート内の記載されている範囲を取得
・対象のセルを取り出して、日付が含まれているか確認
・日付が含まれていた場合に、対象の日付が期間内か確認
自分で作るときには、各処理ごとに検索したり既存のマクロを参考に作成していました。今回は設計からコーディングまでChatGPTに手伝ってもらいます。


ChatGPTとは

以上、ChatGPTによるChatGPTの説明でした。
ChatGPT)https://openai.com/blog/chatgpt/

ChatGPTへの問い合わせ

まず初めにChatGPTへ実施内容を伝えて設計をしてもらいます。

サンプルコードも用意してくれましたが、このままでは使い勝手が悪いのでいくつかお願いを追加します。

追加した情報をもとに以下のコードを作ってくれました。

Sub ChangeCellColor()
    Dim startDate As Date
    Dim endDate As Date
    Dim dateRange As Range
    Dim cell As Range
    Dim sheet As Worksheet
    
    ' 期間の開始日と終了日を入力画面で指定
    startDate = InputBox("期間の開始日を入力してください(yyyy/mm/dd)", "開始日")
    endDate = InputBox("期間の終了日を入力してください(yyyy/mm/dd)", "終了日")
    
    ' 日付が含まれる範囲をすべてのシートから検索
    For Each sheet In ThisWorkbook.Worksheets
        Set dateRange = sheet.UsedRange
        For Each cell In dateRange
            ' セルの値が日付形式かどうかを確認
            If IsDate(cell.Value) Then
                ' 日付が期間内にある場合は、セルの背景色を赤色に変更
                If cell.Value >= startDate And cell.Value <= endDate Then
                    cell.Interior.Color = vbRed
                End If
            End If
        Next cell
    Next sheet
End Sub

では、実際にEXCELで動かしてみます。
サンプルとして日付を書いた列を用意して実行してみます。

お試し実行画面

開始日と終了日の入力

実行結果としては、正しく表示されました。
実行してみて気づいたのですが、範囲内を色付けたいのではなく、範囲外の時に色を付けたかったので、少し修正します。

判定方法の修正

他にもいくつか気になるところがあります。
 ・キャンセルを押したときの処理がない
 ・入力した日付が正しいかどうかの確認をする処理がない
 ・実行が終わったかどうかがわからない
使ってみて気づいた点を再度問い合わせてみます。

Sub ChangeCellColor()
    Dim startDate As Variant
    Dim endDate As Variant
    Dim dateRange As Range
    Dim cell As Range
    Dim sheet As Worksheet
    
    ' 期間の開始日と終了日を入力画面で指定
    startDate = InputBox("期間の開始日を入力してください(yyyy/mm/dd)", "開始日")
    If VarType(startDate) = vbBoolean Then
        MsgBox "処理をキャンセルしました"
        Exit Sub
    End If
    
    If Not IsDate(startDate) Then
        MsgBox "開始日は日付形式で入力してください(yyyy/mm/dd)"
        Exit Sub
    End If
    
    endDate = InputBox("期間の終了日を入力してください(yyyy/mm/dd)", "終了日")
    If VarType(endDate) = vbBoolean Then
        MsgBox "処理をキャンセルしました"
        Exit Sub
    End If
    
    If Not IsDate(endDate) Then
        MsgBox "終了日は日付形式で入力してください(yyyy/mm/dd)"
        Exit Sub
    End If
    
    ' 日付が含まれる範囲をすべてのシートから検索
    For Each sheet In ThisWorkbook.Worksheets
        Set dateRange = sheet.UsedRange
        For Each cell In dateRange
            ' セルの値が日付形式かどうかを確認
            If IsDate(cell.Value) Then
                ' 日付が期間内にある場合は、セルの背景色を赤色に変更
                If cell.Value >= startDate And cell.Value <= endDate Then
                    cell.Interior.Color = vbRed
                End If
            End If
        Next cell
    Next sheet
    
    ' 完了メッセージを表示
    MsgBox "処理が完了しました"
End Sub

このまま実行しましたが、キャンセルボタンを押すと以下のようなメッセージが表示されました。

本来であれば「処理をキャンセルしました」が表示される予定が、日付チェックのメッセージが表示されています。また、ダイアログの処理のためにstartDateとendDateの両方をVariantに変更したことで、日付のチェックがうまくいかないようになっていました。

いくつか修正をして再度実行してみます。

Sub ChangeCellColor()
    Dim startDate As Date
    Dim endDate As Date
    Dim dateRange As Range
    Dim inputStartDate As Variant
    Dim inputEndDate As Variant
    Dim cell As Range
    Dim sheet As Worksheet
    
    ' 期間の開始日と終了日を入力画面で指定
    inputStartDate = InputBox("期間の開始日を入力してください(yyyy/mm/dd)", "開始日")
    If inputStartDate = "" Then
        MsgBox "処理をキャンセルしました"
        Exit Sub
    End If
    
    If Not IsDate(inputStartDate) Then
        MsgBox "開始日は日付形式で入力してください(yyyy/mm/dd)"
        Exit Sub
    End If
    startDate = CDate(inputStartDate)
    
    inputEndDate = InputBox("期間の終了日を入力してください(yyyy/mm/dd)", "終了日")
    If inputEndDate = "" Then
        MsgBox "処理をキャンセルしました"
        Exit Sub
    End If
    
    If Not IsDate(inputEndDate) Then
        MsgBox "終了日は日付形式で入力してください(yyyy/mm/dd)"
        Exit Sub
    End If
    endDate = CDate(inputEndDate)
    
    ' 日付が含まれる範囲をすべてのシートから検索
    For Each sheet In ThisWorkbook.Worksheets
        Set dateRange = sheet.UsedRange
        For Each cell In dateRange
            ' セルの値が日付形式かどうかを確認
            If IsDate(cell.Value) Then
                ' 日付が期間外にある場合は、セルの背景色を赤色に変更
                If cell.Value < startDate Or cell.Value > endDate Then
                    cell.Interior.Color = vbRed
                End If
            End If
        Next cell
    Next sheet
    
    ' 完了メッセージを表示
    MsgBox "処理が完了しました"
End Sub

正常に動作しました。
InputBoxの判定方法と、Dateへの変換処理を追加しています。
今回のケースで行くと、InputBoxには二つのメソッドが用意されていることが原因でした。
  ①InputBoxメソッド
  ②ApplicationオブジェクトのInputBoxメソッド
EXCELでそのまま利用すると①のInputBoxが呼ばれていますが、最初にChatGPTが提案してくれたものは②の利用方法だったようです。
 ※②を利用する場合には、Application.InputBox(~)で実行する必要がありそうです

作ってみた感想

普段EXCELマクロを作成するときには、やりたいことを順番に検索したり、既存のマクロから使える部分を集めたりしていました。ChatGPTを利用することによりやりたいことを明確にして、サンプルコードを作ってくれることで実装までの時間を大幅に短縮することができました。
 ただ追加で要望を出した後に、既存処理が動かなくなったり、そのままでは動かない処理が見受けられました。実は他のプログラムをお願いしたときにも同じような経験があります。
 ChatGPTの情報がすべて正しいのではなくサンプルとして利用することが正しい付き合い方のように思います。とても便利で簡単にコードが書けるようになりましたが、コードを書いてもらうには、まだまだ精度の向上などが必要かもしれません。
(精度というよりは一度デバッグしてから教えて…は要望しすぎでしょうか。。。)


この記事が参加している募集