Chat GPT × Excel VBA

 

今回も「Chat GPT」を使って、どんな感じで「Excel VBA」プログラムが作成できるか試していきたいと思います。

 

 

 「在庫表」を整える

 

前回、「在庫表」の「入力セル」の

「分類」

「商品番号」

「商品名」

の入力をリストにするVBAを作成しました。

 

今回は、「商品番号」が入力されると、残りのデータを「在庫表」テーブルより検索して自動で表示するVBAを作成していきます。

 

  「商品番号」を入力すると残りのデータを自動入力する

 

 

セルC8を入力するとその他の値を自動入力(不備あり?)

 

①ChatGPTに依頼。

「セルC8が入力された値と同じ「在庫表」テーブルの2列目の値を検索し、同じ行の1列目と3から8列目の値をセルB8とD8からI8に表示するVBAを作成してください。

また、対象のテーブルの行の背景色を薄い黄色にしてください」

 

上記だけでは、背景色を解除するコマンドが無かったので、

「VBA実行の最初にテーブルの背景色を解除するプログラムも追加する」

ように依頼しました。

 

②作成されたVBAをシートモジュールにコピペ。

 

③「入力セル」の「商品番号」(セルC8)の値を変更してみる。

下のように入力セルのその他の項目が入力され、テーブルの対象行の背景が黄色くなりました。

 

 

【実際のプログラム】

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim tbl As ListObject
    Dim searchValue As String
    Dim foundRow As Range
    Dim i As Long
    Dim row As Range
    
    ' 変更されたセルがC8でなければ終了
    If Target.Address <> "$C$8" Then Exit Sub
    
    ' 「在庫表」テーブルから入力された値を検索
    Set tbl = Me.ListObjects("在庫表")
    searchValue = Target.Value
    
    ' ハイライトを解除する
    tbl.DataBodyRange.Interior.ColorIndex = xlNone
    
    Set foundRow = Nothing
    
    For Each row In tbl.DataBodyRange.Rows
        If row.Cells(2).Value = searchValue Then
            Set foundRow = row
            Exit For
        End If
    Next row
    
    ' 該当する行が見つかった場合、1列目と3-8列目の値をセット
    If Not foundRow Is Nothing Then
        For i = 1 To 7 ' 列BからIまでの値をセット
            Me.Cells(8, i + 1).Value = foundRow.Cells(i).Value
        Next i
        ' 背景色を変更する
        foundRow.Interior.Color = RGB(255, 255, 153) ' 薄い黄色
    Else
        ' 該当する行が見つからなかった場合、セルをクリアしてハイライトも解除する
        Me.Range("B8:I8").ClearContents
    End If
End Sub

 

ただし、上記のVBAを実行するとなぜか処理に時間がかかり、古いPCを使用するとエクセルが再起動などしてしまいました。

 

セルC8を入力するとその他の項目を自動入力する(改善版)

 

①ChatGPTに依頼。

「上のVBAを処理を軽くするVBAに変更してください」

 

上の依頼で、新たなVBAの作成と、下のように修整箇所を教えてくれました。

 

ChatGPTの回答

 

この修正例では、以下のような改善点があります。

  • Scripting.Dictionary を使わず、ループで行を探す方法に変更しました。
  • Range.Value ではなく、 Range.Cells.Value で値を取得するように変更しました。
  • ループ内でオブジェクトの参照を減らすため、行ごとに tableRange.Rows(i) を使って、必要な行のみを参照するように変更しました。
  • データを取得する際に Offset メソッドを使わず、 Index 関数を使ってデータを取得するように変更しました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

②作成されたVBAを再度シートモジュールにコピペ。

 

③「入力セル」の「商品番号」(セルC8)の値を変更してみる。

こちらも問題なく処理ができました。

 

【実際のプログラム】

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim tbl As ListObject
    Dim searchValue As String
'    Dim foundRow As Range
'    Dim i As Long
    Dim row As Range


    ' 変更されたセルがC8でなければ終了
    If Target.Address <> "$C$8" Then Exit Sub

'    Dim searchValue As String
    Dim foundRow As Range
    Dim tableRange As Range
    Dim i As Long

    ' テーブルを取得する
    Set tableRange = Sheet1.ListObjects("在庫表").Range

    ' 検索値を取得する
    searchValue = Sheet1.Range("C8").Value

    ' 背景色を解除する
    tableRange.Interior.ColorIndex = xlNone

    ' テーブル内を検索する
    For i = 1 To tableRange.Rows.Count
        ' 2列目の値が検索値と一致する行を探す
        If tableRange.Cells(i, 2).Value = searchValue Then
            ' 背景色を変更する
            tableRange.Rows(i).Interior.Color = RGB(255, 255, 153) ' 薄い黄色

            ' データを表示する
            Sheet1.Range("B8").Value = tableRange.Cells(i, 1).Value ' 1列目
            Sheet1.Range("D8:I8").Value = Application.Index(tableRange.Cells(i, 3).Resize(1, 6).Value, 1, 0) ' 3から8列目
            Exit For
        End If
    Next i
End Sub


 

因みに上記2つのVBAに「Timer」を組み込んで処理時間を確認してみました。

【不備あり?プログラム】 処理時間:0.08秒

 

【改善版】 処理時間:0.16秒

 

なぜか、「Timer」を組み込んだりしているうちに、「不備あり?」プログラムも問題なく動作して、結果としては逆転した処理時間となってしまいました。

 

この件に関しては私は???です。

まだまだVBAのわからないところです。

 

あとがき

 

 

今回は、「商品番号」を入力することで、その他の項目が自動入力されるVBAを作成しました。

処理時間については???が残る結果ですが、ChatGPTでも「改善したプログラム」とのことなので、今後も「改善版」のVBAを使用していきます。

 

次回は、「在庫表」を整える4 データの連携

の続きで、「商品名」を入力したときでも残りのデータを自動入力するVBAを作成したいと思います。