chatGPTとは
チャット形式で様々な質問に回答してくれるAIです。
日本語にも対応しており口語での質問にも回答ができます。文章の要約など自然言語の処理能力はかなり高いようです。
また、プログラムのソースコードも作成できます!
アカウント登録は必要ですが、今のところ無料で使えます。(2022/12/11時点)
作ってもらうもの
情報漏洩してはいけないような業務に関わるものはよろしくないため、
ツールを作ってみてもらうことにしました。
作ってもらうもの:フォルダ配下にある、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は必要であり、
不足や誤りに気付ける必要もあります。
・欲しい機能のたたき台を作成してもらうのに利用するのが良さそう
・最終的に自分で微修正したりする必要あり
・非エンジニアが使いこなすのはまだ難しそう
いつまで無料で使えるのかわからないため、皆様もぜひ今のうちに利用してみてください!
コメント