chatGPTでVBAのツールを作ってもらった

プログラミング
スポンサーリンク

chatGPTとは

チャット形式で様々な質問に回答してくれるAIです。
日本語にも対応しており口語での質問にも回答ができます。文章の要約など自然言語の処理能力はかなり高いようです。

また、プログラムのソースコードも作成できます!

アカウント登録は必要ですが、今のところ無料で使えます。(2022/12/11時点)

Just a moment...

作ってもらうもの

情報漏洩してはいけないような業務に関わるものはよろしくないため、
ツールを作ってみてもらうことにしました。

 作ってもらうもの:フォルダ配下にある、Excelのシート名を一覧化するVBA
 用途:設計工程の品質評価における定量分析のために、レビュー対象規模を算出したい

実施経過

1回目

◆入力内容
指定したフォルダ配下にあるExcelのシート名を一覧化するVBAを作って

◆出力結果

Sub ListSheetNames()
    Dim path As String
    Dim fileName As String
    Dim sheet As Worksheet

    ' フォルダのパスを指定
    path = "C:\path\to\folder"

    ' フォルダ内のExcelファイルを一つずつ取り出す
    fileName = Dir(path & "\*.xlsx")
    Do While fileName <> ""
        ' Excelファイルを開く
        Workbooks.Open (path & "\" & fileName)

        ' シートを一つずつ取り出す
        For Each sheet In ActiveWorkbook.Sheets
            ' シート名を表示
            Debug.Print sheet.Name
        Next

        ' Excelファイルを閉じる
        ActiveWorkbook.Close

        ' 次のExcelファイルを取り出す
        fileName = Dir()
    Loop
End Sub

いろいろと説明をしてくれながら、生成してくれました。
インデントやコメントもちゃんとしているのでめちゃめちゃすごいですね!

気になる点があるので、修正してもらいます。

2回目

対話形式が可能なので、修正部分だけを指摘することでも直してもらえますが、
以下の理由により、箇条書きで指示することにしました。
 ・現在の指示内容をまとめたいこと
 ・翌日にまた直してほしい場合に再開しやすくしたい(再現性を確保)

◆入力内容
指定したフォルダ配下にあるExcelのシート名を一覧化するVBAを作って
 ・サブフォルダの中も再帰的に処理してほしい
 ・拡張子が”xlsm”も対象にしてほしい

◆出力結果

Sub ListSheetNames()
    Dim path As String
    Dim fileName As String
    Dim sheet As Worksheet
    Dim fs As Object
    Dim fld As Object

    ' フォルダのパスを指定
    path = "C:\path\to\folder"

    ' ファイルシステムオブジェクトを作成
    Set fs = CreateObject("Scripting.FileSystemObject")

    ' 指定したフォルダを取得
    Set fld = fs.GetFolder(path)

    ' サブフォルダも再帰的に処理する
    Call ListSheetNamesInFolder(fld)
End Sub

Private Sub ListSheetNamesInFolder(fld As Object)
    Dim file As Object
    Dim fileName As String
    Dim sheet As Worksheet

    ' フォルダ内のExcelファイルを一つずつ取り出す
    For Each file In fld.Files
        fileName = file.Name
        If Right(fileName, 5) = ".xlsx" Or Right(fileName, 5) = ".xlsm" Then
            ' Excelファイルを開く
            Workbooks.Open (file.Path)

            ' シートを一つずつ取り出す
            For Each sheet In ActiveWorkbook.Sheets
                ' シート名を表示
                Debug.Print sheet.Name
            Next

            ' Excelファイルを閉じる
            ActiveWorkbook.Close
        End If
    Next

    ' サブフォルダも再帰的に処理する
    For Each fld In fld.SubFolders
        Call ListSheetNamesInFolder(fld)
    Next
End Sub

3回目

ロジック的な機能としては十分でしたが、やりたいことを踏まえると、
エクセルに出力してほしかったので追加要求を入れました。

◆入力内容
指定したフォルダ配下にある、Excelのシート名を一覧化するVBAを作って
 ・サブフォルダの中も再帰的に処理してほしい
 ・拡張子が”xlsm”も対象にしてほしい
 ・エクセルシートにファイル名と合わせてシート名を出力してほしい

◆出力結果

Sub ListSheetNames()
    Dim path As String
    Dim fileName As String
    Dim sheet As Worksheet
    Dim fs As Object
    Dim fld As Object
    Dim ws As Worksheet

    ' 出力先のシートを設定
    Set ws = Worksheets("Sheet1")

    ' フォルダのパスを指定
    path = "C:\path\to\folder"

    ' ファイルシステムオブジェクトを作成
    Set fs = CreateObject("Scripting.FileSystemObject")

    ' 指定したフォルダを取得
    Set fld = fs.GetFolder(path)

    ' サブフォルダも再帰的に処理する
    Call ListSheetNamesInFolder(fld, ws)
End Sub

Private Sub ListSheetNamesInFolder(fld As Object, ws As Worksheet)
    Dim file As Object
    Dim fileName As String
    Dim sheet As Worksheet
    Dim row As Long

    row = 1
    ' フォルダ内のExcelファイルを一つずつ取り出す
    For Each file In fld.Files
        fileName = file.Name
        If Right(fileName, 5) = ".xlsx" Or Right(fileName, 5) = ".xlsm" Then
            ' Excelファイルを開く
            Workbooks.Open (file.Path)

            ' シートを一つずつ取り出す
            For Each sheet In ActiveWorkbook.Sheets
                ' シート名を出力
                ws.Cells(row, 1) = fileName
                ws.Cells(row, 2) = sheet.Name
                row = row + 1
            Next

            ' Excelファイルを閉じる
            ActiveWorkbook.Close
        End If
    Next

    ' サブフォルダも再帰的に処理する
    For Each fld In fld.SubFolders
        Call ListSheetNamesInFolder(fld, ws)
    Next
End Sub

意図したとおり修正してくれました。
実際に動かしてみても思った通りの動きをしてくれて、まさに衝撃を味わいました。

まとめ

総じて、すごいとしか言いようがないですが所感をまとめます。

良かった点

 ・プログラムの圧倒的生成速度
 ・コメント行、インデントがしっかりしており、可読性が高いプログラムを作ってくれる
 ・変数名誤りのようなヒューマンエラーが起きない

注意点

 ・やりたいことをある程度以上文章化できないと使えない
 ・同じ文字列で指示しても、毎回同じ結果を返してくれるわけではない
 ・ソースコードの誤りがないか確認は必要

インターネットで検索して、自分で実装するのとは比べ物にならない速度でできるという点が
一番の評価ポイントだと思います。

ただし、「再帰的に~」などある程度言語化できないと、そもそも欲しいものを指示できないので、
最低限のITリテラシーは必要だなと感じました。
また、意図と若干違うソースが生成されたこともあるので、Try&Errorは必要であり、
不足や誤りに気付ける必要もあります。

総括

 ・欲しい機能のたたき台を作成してもらうのに利用するのが良さそう
 ・最終的に自分で微修正したりする必要あり
 ・非エンジニアが使いこなすのはまだ難しそう

いつまで無料で使えるのかわからないため、皆様もぜひ今のうちに利用してみてください!

コメント

タイトルとURLをコピーしました