LibreOfficeのVBAのコードをChatGPTに書いてもらった話

LibreOffice の Calc でも、VBAを使用することが可能です。私は、自宅のパソコンには Excel がインストールされていません。そのため、無料で利用できるLibreOfficeを利用しています。
ChatGPTに、VBAのコードを書いてもらいました。
• プロンプト
ChatGPTに、以下のようなプロンプトを送ってみました。
以下のVBAのコードを記述してください。
•Sheet1 のA列には可変数の行が存在し、各行には氏名が記入されている。
•VBAはA1列から人数を計算し、上から順番に「List_X」(Xには数字が入る。)という名前のシートに振り分ける。
•List_Xに記入できる人数の上限は15人とする。
•各List_Xには、均等に人数を振り分ける。(例:合計人数が17人の場合は、List_1に9人、List_2に8人。)
---
コードを書いてくれたが
ChatGPTはコードを書いてくれました。しかし、そのコードを実行しても、うまくいきませんでした。そのため、プロンプトに「コードはLibreOfficeでも動作するようにしてください。また、エラー処理や例外処理は不要です。出来るだけシンプルなロジックで記述してください。」などという文言を追加するなどして、何度かコードを書き直してもらいました。
Sub DistributeNames()
Dim oSheet As Object
Dim oTargetSheet As Object
Dim oSheets As Object
Dim lastRow As Long
Dim totalNames As Long
Dim numLists As Long
Dim maxPerList As Long
Dim i As Long, j As Long, count As Long
' 初期設定
oSheet = ThisComponent.Sheets.getByName("Sheet1")
oSheets = ThisComponent.Sheets
maxPerList = 10 ' 各List_Xの上限人数
' A列の最終行を取得
lastRow = GetLastRow(oSheet, 0) ' 0はA列
totalNames = lastRow ' 合計人数
' 必要なList_Xの数を計算
numLists = Int((totalNames + maxPerList - 1) / maxPerList)
' 各List_Xシートを作成・初期化
For i = 1 To numLists
 Dim sheetName As String
 sheetName = "List_" & i
 If oSheets.hasByName(sheetName) Then
oTargetSheet = oSheets.getByName(sheetName)
 Else
oSheets.insertNewByName(sheetName, oSheets.getCount())
oTargetSheet = oSheets.getByName(sheetName)
 End If
 ' シート内容をクリア
 For j = 0 To maxPerList - 1
oTargetSheet.getCellByPosition(0, j).String = ""
 Next j
Next i
' 名前を均等に振り分け
count = 1
For i = 1 To totalNames
 Dim currentList As Long
 currentList = Int((count - 1) / maxPerList) + 1
 oTargetSheet = oSheets.getByName("List_" & currentList)
 j = (count - 1) Mod maxPerList
 oTargetSheet.getCellByPosition(0, j).String = oSheet.getCellByPosition(0, i - 1).String
 count = count + 1
Next i
MsgBox "振り分けが完了しました!", 64, "完了"
End Sub
Function GetLastRow(oSheet As Object, col As Long) As Long
Dim i As Long
Dim cell As Object
For i = 0 To 1048575 ' LibreOfficeの最大行数
 cell = oSheet.getCellByPosition(col, i)
 If cell.String = "" Then
GetLastRow = i
Exit Function
 End If
Next i
End Function
動作結果
Sheet1のA列には、17人分のデータがあります。
[ 画像1. Sheet1の元データ ]
この状態でコードを実行すると、List_1 と List_2 が作成されます。そして、List_1 には10名の、List_2 には7名の名前が記入されています。
[ 画像2. 実行結果 ]
期待通りの動作では、List_1 に9名、List_2 に8名となるはずです。そのため、実行結果は、人数を振り分ける動作が、期待とは異なっています。
期待通りの動作にするにはさらに修正が必要ですが、今回はここまでにします。
• まとめ
LibreOffice で動作するVBAのコードを ChatGPT に書いてもらいました。今回は、期待通りの動作をするコードは得られませんでした。それでも、ChatGPTにある程度コードの原形を書いてもらって、それをもとに修正を加えていくという方法は、ネットで調べながら自分でコードを書く方法よりも、効率が良いと思います。ChatGPTなどの生成AIは、プログラミングの補助ツールとして非常に有用です。