見出し画像

VBAプログラミング with chatGPT

哲学カフェのオフトーク中、ある参加者がこんな話をしたことがあった。

「業務用のツールをchatGPTを利用して作ることがある」

ちょうどその頃、自分でもchatGPTでのプログラミングを試していた。といっても、具体的な業務で使うとかではなく、「C言語で九九の表を出力する処理を作れる?」というようなレベルの話である。

さて、最近、VBAを用いた効率化ツールを作る必要が生じた。VBAはMicrosoft Office、とくにExcelで使われることの多いプログラミング言語である。「マクロの作成」を使えば、手動でプログラミングせずとも、多少なり業務を自動化できる。

私の場合、VBAは以前業務で使ったことがあり、自力で作れないこともない。しかし、せっかくなので、chatGPTでの製作を試してみた。

その時の印象を以下に示しておこう。ただし、利用しているのがGPT-3.5であるので、GPT-4.0を使う場合とは異なる部分も多いであろうことを、ご理解願いたい。

①指示の出し方

最初からすべてを具体的に指し示すよりも、機能ごとに少しずつ分けて指示を出す方が正確な処理を作ってくれる。

例えば、在庫管理システムを作りたいとしよう。そのシステムにおいて、「在庫一覧」のシートに遷移する処理を作りたい。また、シート遷移後、在庫量(C列)が100以下のものがあれば、メッセージボックスに商品名(B列)を表示したいとしよう。

その場合の指示は、以下の2つの指示文みたいな形にすれば良い。
「"在庫一覧"というシートへ遷移する処理をVBAで作りたい。」
「シート遷移後、C列に登録した値を調べ、100以下のものがあれば、該当する行のB列の値をメッセージボックスに表示してほしい。」

先の1つ目の指示でchatGPTが作った処理は以下の通りである。関数名や変数名が日本語なのを修正したくなるくらいで、問題なく動作する。

Sub シート遷移()
    ' シート名を指定
    Dim シート名 As String
    シート名 = "在庫一覧"
    
    ' シートが存在するかチェック
    Dim シート存在 As Boolean
    シート存在 = False
    For Each シート In Worksheets
        If シート.Name = シート名 Then
            シート存在 = True
            Exit For
        End If
    Next シート
    
    ' シートが存在する場合、そのシートに遷移
    If シート存在 Then
        Worksheets(シート名).Activate
    Else
        MsgBox "指定されたシートは存在しません。"
    End If
End Sub

これだけでは、あくまでもシート遷移のみの処理に過ぎない。次に2つ目の指示を出す。
「シート遷移後、C列に登録した値を調べ、100以下のものがあれば、該当する行のB列の値をメッセージボックスに表示してほしい。」

この指示を出して、chatGPTが作ったのは以下の処理であった。在庫量が100以下のものがあったときのメッセージ表示は1件ずつしか表示されない。しかも、それが複数回表示される可能性がある。メッセージボックスに表示される内容(「C列が100以下の行のB列の値:・・・」だと、実用には耐えられない)と合わせて修正したくなる。

とはいえ、処理自体は問題なく動作する。1からコードを作る必要がなく、修正だけで済むのは大きい。

Sub シート遷移と値の調査()
    ' シート名を指定
    Dim シート名 As String
    シート名 = "在庫一覧"
    
    ' シートが存在するかチェック
    Dim シート存在 As Boolean
    シート存在 = False
    For Each シート In Worksheets
        If シート.Name = シート名 Then
            シート存在 = True
            Exit For
        End If
    Next シート
    
    ' シートが存在する場合、そのシートに遷移
    If シート存在 Then
        Worksheets(シート名).Activate
        
        ' シート内のデータを調査
        Dim 最終行 As Long
        最終行 = Cells(Rows.Count, "C").End(xlUp).Row
        
        Dim i As Long
        For i = 2 To 最終行 ' ヘッダー行をスキップ
            If Cells(i, "C").Value <= 100 Then
                MsgBox "C列が100以下の行のB列の値: " & Cells(i, "B").Value
            End If
        Next i
    Else
        MsgBox "指定されたシートは存在しません。"
    End If
End Sub

例では指示を分けて出した。1つの指示にまとめても問題なく作ってくれるが、細かく分ける方が、ミスコミュニケーションの可能性が下がる。

この発想は、人間相手に説明するときにも通じる。いきなり全容を説明するよりも、少しずつ共有していく方が、より確実に伝わる。それと同じことをAIにもやれば良い、という感覚であれば十分だろう。

もし、人間とAI(chatGPT)で違いがあるとすれば、AIには最初に概要を共有する必要がないことくらいだろうか。人間相手であれば、個別具体の説明をする前に、全体像のイメージを共有しておく必要があるが、AIにそれは不要である。

②プログラミング・開発言語に関する知識の必要性

結論から言ってしまえば、多少なりプログラミングの基礎知識が必要だろう、ということになる。

というのも、こちらの意図を正確に理解してくれるわけではない。あくまでも、自分が書いた文章の内容を機械的に読み取り、その文面に基づいた処理を作るに過ぎない。

簡単な処理であれば、正確に作ってくれるが、複雑になってくると、いくら細切れに指示を出していっても、どこかで綻びが生じてしまう。そこを修正するためには、どうしてもプログラミングの知識が多少なり必要になるのだ。

とはいえ、1からすべてをプログラミングする必要はないので、開発言語に対する深い理解、というよりは、特定の言語に関係なく、プログラミングにおける共通の約束事(引数、型など)を理解しておき、あとは必要に応じて、自分で調べながら修正していけば、まま何とかなる。

③プログラミングに要する時間

こちらの意図を正確に理解してくれた場合、つまり自分が正確な指示を出せた場合の処理作成時間は、chatGPTの応答時間と自分でソースコードを貼り付ける時間だけになる。その場合は、自分で1からプログラミングするときの1/10以下の時間で作れると言っても過言ではない。

chatGPTが作った処理を自分で修正する場合も、指示がよほどヘンテコでない限り、プログラミングに要する時間はかなり減る印象だ。半分以下と言っても差し支えないものも多くあった。

しかし、プログラムの読みやすさ(可読性)を高めるための修正を施していると、いくらか時間を要することがある。それでも、1から作るよりは圧倒的にマシである。

④最後に

特定の条件下において、自動でプログラミングしてくれるツールは以前にも使ったことがあった。chatGPTは、その制約がかなり小さい。

業務用のツールとなると、セキュリティ上の問題もあり、すべてを具体的に指示できないこともあるだろう。その場合でも、大まかな流れはchatGPTで作り、必要に応じて修正を加えていくなど、人の方で指示の出し方を工夫していけば、プログラム作成に要する時間は大幅に短縮できる。

使えば使うほど、こんな感覚を抱く。遅かれ早かれプログラミングは、かなりの程度をAIで代替できるようになり、人は設計と指示出しに特化していくのだろう、と。そして、それもいずれは…


この記事が気に入ったらサポートをしてみませんか?