VBAをChatGPTを使用して作成する

※この記事は2023/05/04時点の情報で記載しています。

ChatGPTはプログラマなら絶対活用するべきだと思う

最近、ChatGPTが凄いというのがよく話題にあがるので自分も使用してみました。

https://chat.openai.com/

使用してみた感想としては…

  • 調べ物をする場合は、割とミスが多いので素直に検索エンジンから検索した方が良い場合が多い
  • 計算やプログラム作成などは正確に行ってくれることが多い(少なくともコンパイルエラーなどはなさそう)
  • ちょっとした雑用にも便利

最後の「ちょっとした雑用」というのは例えば以下のような作業です。

こういった変換作業はプログラム書いているときに結構必要になるのでめっちゃ助かる。

また、機械的にプログラミングしなければいけないようなところも指示を出した方が早い。

こうなってくるともはやプログラマーいらないんじゃないかと思ってきますねw実際に結構難しいプログラムでも書いてくれます。

当ブログはVBA、Excelに関するブログなのでVBAでも使い物になるか色々試してみました。

VBAでは細かく関数を作ってもらうのがいいのでは

VBAをChatGPTに書かせてみた結果ですが、結論から言うとめちゃくちゃ使えます。

英語で入力すると正確性が上がるという情報もありましたが、日本語で入力するとコメントも日本語で入れてくれるので、基本的に日本語で対応しています。

ただ複雑な処理を一気に書かせると文字数がオーバーしてしまったり、間違ったコードが出てきやすいです。

また一気に作成させると汎用的ではないコードが出てくることも多いです。例えば「文字列の一部を赤くしたい」という場合に、2~3文字目固定で赤くするコードが出てきたりします。

そこで現時点での使い方としては、関数単位で色々作成してもらい、メイン関数は自分で作るのがいい方法なのではないかなと思いました。

具体的に試してみたいと思います。


実際に試してみた

最終的に作りたいプログラムの仕様は以下のような形とします。

  • 郵便番号検索API(https://zip-cloud.appspot.com/doc/api)からJSONデータをダウンロードする
  • 取得したデータをもとに、ワークシート上に「郵便番号、都道府県名、市区町村名」を書き出す

外部データにアクセスしてデータ変換も行うのでそこそこ面倒そうです。そこでキーになる関数部分をChatGPTに任せてみます。

方針としては…

  • APIにアクセスする
  • APIからの戻り値(JSON)をデシリアライズしてオブジェクトに格納する
  • ワークシートのデータ部を書き出す

以上の3つの関数を作ってもらうようにします。そのあとのメイン関数作成は自分で対応する。

自分は関数を作ってもらうときは以下のテンプレートを使用しています。

VBA 以下のprivate functionを作成する

引数1 -> URL
引数2 -> URLパラメータ

処理内容
引数で与えられたURL、URLパラメータをもとにWebリクエストを送る
リクエストはJSON形式で返却される前提
URLにアクセスした結果のレスポンスを文字列で返却する

変数と関数名はハンガリアン記法
関数名の最初の文字は小文字

なぜかVBAを作ってもらうと関数名の最初が大文字だったりするので、そこは是正してもらっています。

functionではなくsubを作りたいときは「VBA 以下のprivate subを作成する」と書いています。

作成してもらった関数は以下の通り。

APIにアクセスする

VBA 以下のprivate functionを作成する

引数1 -> URL
引数2 -> URLパラメータ

処理内容
引数で与えられたURL、URLパラメータをもとにWebリクエストを送る
リクエストはJSON形式で返却される前提
URLにアクセスした結果のレスポンスを文字列で返却する

変数と関数名はハンガリアン記法
関数名の最初の文字は小文字

Private Function webRequest(ByVal url As String, ByVal urlParam As String) As String
    Dim xmlHttp As Object 'Webリクエストを送るためのオブジェクト
    
    'Webリクエスト用オブジェクトを作成
    Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
    
    'リクエストを送信するためのURLを作成
    Dim requestUrl As String
    requestUrl = url & "?" & urlParam
    
    'リクエストを送信してレスポンスを取得
    xmlHttp.Open "GET", requestUrl, False
    xmlHttp.Send
    webRequest = xmlHttp.responseText 'レスポンスを文字列で返す
    
    'オブジェクトを解放
    Set xmlHttp = Nothing
End Function

APIからの戻り値(JSON)をデシリアライズしてオブジェクトに格納する

VBA 以下のprivate functionを作成する

引数1 -> 以下の形式のJSON文字列
{
	"message": null,
	"results": [
		{
			"address1": "高知県",
			"address2": "南国市",
			"address3": "蛍が丘",
			"kana1": "コウチケン",
			"kana2": "ナンコクシ",
			"kana3": "ホタルガオカ",
			"prefcode": "39",
			"zipcode": "7830060"
		}
	],
	"status": 200
}

処理内容
resultsの値をオブジェクトに格納して返却してください

変数と関数名はハンガリアン記法
関数名の最初の文字は小文字

Private Function parseJson(jsonString As String) As Object
    Dim jsonObj As Object
    Set jsonObj = JsonConverter.parseJson(jsonString)
    Set parseJson = jsonObj("results")(1)
End Function

急にライブラリを使い始めたが、どう頑張っても手書きでJsonをパースしてくれそうにないのでここは従う。まあ複雑すぎるから無理ってことだよなあ。

ワークシートのデータ部を書き出す

VBA 以下のprivate subを作成する

引数1 -> 以下のキーを持っているdictionary
zipcode
address1
address2
引数2 -> シート名

処理内容
シートの内容をクリアする
シートのA1に郵便番号と書き出す
シートのB1に都道府県と書き出す
シートのC1に市町村と書き出す
シートのA2に引数のオブジェクトからzipcodeを取り出して書き出し
シートのB2に引数のオブジェクトからaddress1を取り出して書き出し
シートのC2に引数のオブジェクトからaddress2を取り出して書き出し

変数と関数名はハンガリアン記法
関数名の最初の文字は小文字

Private Sub writeAddressToSheet(ByVal addressDict As Object, ByVal sheetName As String)
    
    Dim targetSheet As Worksheet
    Set targetSheet = ThisWorkbook.Sheets(sheetName)
    
    ' シートの内容をクリアする
    targetSheet.Cells.ClearContents
    
    ' 郵便番号、都道府県、市町村を書き出す
    targetSheet.Range("A1").Value = "郵便番号"
    targetSheet.Range("B1").Value = "都道府県"
    targetSheet.Range("C1").Value = "市町村"
    
    ' オブジェクトから値を取り出して書き出す
    targetSheet.Range("A2").Value = addressDict("zipcode")
    targetSheet.Range("B2").Value = addressDict("address1")
    targetSheet.Range("C2").Value = addressDict("address2")
    
End Sub

チャットに記載している内容が長いので、自分でコードを書いた方が早い気もしますが、プログラム書くより頭使わないので圧倒的に楽です。

ここまでの関数を使うメイン関数を自作します。

Sub test()
    Dim url As String
    url = "https://zipcloud.ibsnet.co.jp/api/search"
    Dim urlParam As String
    urlParam = "zipcode=7830060"
    Dim response As String
    response = webRequest(url, urlParam)
    Dim obj As Object
    Set obj = parseJson(response)
    Call writeAddressToSheet(obj, "Sheet1")

End Sub

実行結果

10分くらいで希望する動作のプログラムを作成することができました。0から作ると1時間はかかりそうな気がするので、大幅な効率アップです!!

これからChatGPTが賢くなってくればさらに効率アップしていきそうですね。


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)