ChatGPTが日本語からVBAのコードを生成できてたまげる
最近噂のChatGPT。大学受験問題も解ける賢いAIだとか。そこで私も試してみました。
指示は、「単価、数量、金額の列を持つExcelのテーブルを一行ずつ読み、金額を計算して更新するVBAを作りなさい。ListObjectとFor eachを用いなさい」です。
結果は次の通り正しく回答されました。
マジかと思いました。
自然言語からコードが生成されるだけで驚きですが、金額を計算しなさいと言っただけで、単価と数量を乗算しています。
試しに実行
上の画面のテキストをコピペしたものです。
ExcelのVBAでは、ListObjectを用いることで、Excelシート上のテーブルを操作することができます。以下は、単価、数量、金額の列を持つExcelのテーブルを一行ずつ読み、金額を計算して更新するVBAの例です。
Sub UpdateTable()Dim tbl As ListObjectDim row As ListRow' テーブルを取得しますSet tbl = ActiveSheet.ListObjects("Table1")' テーブルの各行を取得しますFor Each row In tbl.ListRows' 単価と数量から金額を計算しますDim unitPrice As DoubleDim quantity As IntegerunitPrice = row.Range(1, 1).Valuequantity = row.Range(1, 2).Valuerow.Range(1, 3).Value = unitPrice * quantityNext rowEnd Sub上記のVBAを実行すると、単価と数量から金額を計算し、テーブル内の金額の列が更新されます。 ListObjectを用いることで、Excelシート上のテーブルを簡単に操作することができるようになります。また、For Eachステートメントを用いることで、テーブルの各行を順番に取得し、処理を行うことができます。
できています。実際にテーブルを作って実行してみました。
実行結果
ちなみに、quantityのデータ型がintegerで最大値が小さい事について指摘をしたところ、ChatGPTはデータ型をdoubleに変更しました。
数値演算誤差
doubleのような浮動小数点数のデータ型を用いると演算誤差が生じます。そのため、誤差を許容できない会計システムでは、decimalやcurrencyを用います。試しにそれについて指摘をしてみました。
(笑)時間をおいて再度トライさせたところ、次の結果が得られました。
途中で止まってはいるけれど、素晴らしい。
追記: 投稿した後で考えたら、この計算の場合、外貨でもない限り小数の計算は生じないので、doubleでも問題ありませんでした。
円周計算
A1セルに書かれた半径を読み取り、B1セルに円周を書き込むプロシージャーを作りなさい、と指示してみました。結果は次の通りでした。
ExcelのVBAでは、「Range」オブジェクトを用いることで、セルやセル範囲を操作することができます。以下は、A1セルに書かれた半径を読み取り、B1セルに円周を書き込むプロシージャーの例です。Sub WriteCircumference()Dim radius As Double' A1セルから半径を読み取りますradius = Range("A1").Value' 円周を計算し、B1セルに書き込みますRange("B1").Value = 2 * 3.14 * radiusEnd Sub上記のプロシージャーを実行すると、A1セルに書かれた半径を読み取り、円周を計算してB1セルに書き込むことができます。「Range」オブジェクトを用いることで、Excelシート上のセルやセル範囲を操作することができるようになります。また、半径を「Double」データ型として定義することで、膨大な値の範囲を扱うことができます。
こちらでも自動的に円周を求める公式を適用しています。落下速度を求める関数を作らせたらこちらも同様でした。
ChatGPTの実用性と将来
ChatGPTの回答は完全ではないため、このままどう実用化するのか疑問です。
とはいえ、自然言語でこれだけスムーズに会話ができるのは驚異的です。
ちなみに、HAL9000が発狂した理由や、シンギュラリティーについての意見を求めたりして遊んでいます。
ChatGPtのサイト
ChatGPTへのリンク。リンク先ページでTRY CHATGPT をクリックすればアカウント登録できます。
https://openai.com/blog/chatgpt/
アカウント登録はシンプルです。
Discordは登録しなくても使えます。私はうっかり登録してしまいましたが不要でした。
コメント
コメントを投稿