伊田生活ブログのロゴ
HOME  >  勉強
カテゴリー : 勉強 - メモ
•ChatGPT •VBA •LibreOffice •プロンプト
公開日:

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


img_2
2025-01-24

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でも動作するようにしてください。また、エラー処理や例外処理は不要です。出来るだけシンプルなロジックで記述してください。」などという文言を追加するなどして、何度かコードを書き直してもらいました。


Option VBASupport 1

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人分のデータがあります。

image 1

[ 画像1. Sheet1の元データ ]

 

この状態でコードを実行すると、List_1 と List_2 が作成されます。そして、List_1 には10名の、List_2 には7名の名前が記入されています。

image 2

[ 画像2. 実行結果 ]

 

期待通りの動作では、List_1 に9名、List_2 に8名となるはずです。そのため、実行結果は、人数を振り分ける動作が、期待とは異なっています。

期待通りの動作にするにはさらに修正が必要ですが、今回はここまでにします。


LibreOffice で動作するVBAのコードを ChatGPT に書いてもらいました。今回は、期待通りの動作をするコードは得られませんでした。それでも、ChatGPTにある程度コードの原形を書いてもらって、それをもとに修正を加えていくという方法は、ネットで調べながら自分でコードを書く方法よりも、効率が良いと思います。ChatGPTなどの生成AIは、プログラミングの補助ツールとして非常に有用です。