こんにちは。GMOあおぞらネット銀行で人事を担当しているKMです。今回は、非エンジニアの私がChatGPTを活用して、VBAプログラムを作った話をします。
非エンジニアのジレンマからの脱却を目指す
業務をしている中で、毎月発生する作業や膨大なデータで、同じ作業を繰り返すことがあります。そんな時、私のような非エンジニアは「誰かこの作業を自動化してくれないかな」と他力本願になりながら、最終的には“仕方なく”人力で何とかしてきました。(多分こういう方は多いはず。)
過去に独学でのVBAプログラミングにトライしましたが、構造などが理解できず途中で挫折していました。そんな私が、ChatGPTを活用して、実際にVBAを動かすことに成功しました!
今回のチャレンジをまとめると以下の3つとなります。順を追って説明していきます。
- プロセスを明確にして(ここがめっちゃ重要!)やりたいことをChatGPTに指示すれば、ちゃんと動く
- 細かいところを設定するためには、VBAの構造的な理解が必要(ここが難しい・・)
- 例外なく、ChatGPTを使うのにも慣れが必要
要件定義
約200のExcelファイルを一つのExcelデータにまとめてマスターデータを作るという処理を行いました。
人力で乗り切ろうとすると、以下の工程が発生します。
- 約200のExcelファイルを1つのフォルダ―にまとめる
- マスターデータのフォーマットを作る
- Excelファイルを開く/データを転記する×約200ファイル
工程3の作業が大変で、1処理が3分とすると、10時間(600分)必要な計算になります。(同一作業を永遠と繰り返すので、体感はもっと長く感じます…)そこで今回は、工程3の繰り返し作業をVBAで自動化することにしました。
ChatGPTに頼んでみた
下記がChatGPTにインプットしたプロンプトとアウトプットです。ざっくりとした指示でも、ここまで具体的なコードを提案してくれることにまず関心しました。
<プロンプト>
#指示
下記の条件をもとに、「○○」という件名のExcelファイルへ転記するExcelVBAコードを生成してほしい
#条件
・画面更新をオフにするコードを入れてほしい
・変数はすべて宣言してほしい
・データを取りまとめるファイル「○○」の場所は、「デスクトップ>フォルダ―」に存在する。
・参照するExcelファイル、「デスクトップ>参照フォルダー」に存在する。
<アウトプット>
Sub TransferData() ' 変数の宣言 Dim srcWorkbook As Workbook Dim srcWorksheet As Worksheet Dim destWorkbook As Workbook Dim destWorksheet As Worksheet Dim srcFilePath As String Dim destFilePath As String Dim lastRow As Long Dim i As Long ' 画面更新をオフにする Application.ScreenUpdating = False ' 参照するExcelファイルのパスを設定 srcFilePath = "C:\Users\ユーザー名\Desktop\参照フォルダー\参照するExcelファイル.xlsx" ' 転記先のファイルを開く destFilePath = "C: " Set destWorkbook = Workbooks.Open(destFilePath) Set destWorksheet = destWorkbook.Sheets(1) ' 転記元のファイルを開く Set srcWorkbook = Workbooks.Open(srcFilePath) Set srcWorksheet = srcWorkbook.Sheets(1) ' 転記元の最終行を取得 lastRow = srcWorksheet.Cells(srcWorksheet.Rows.Count, "A").End(xlUp).Row ' データを転記 For i = 1 To lastRow destWorksheet.Cells(i, 1).Value = srcWorksheet.Cells(i, 1).Value destWorksheet.Cells(i, 2).Value = srcWorksheet.Cells(i, 2).Value destWorksheet.Cells(i, 3).Value = srcWorksheet.Cells(i, 3).Value ' 必要に応じて転記する列を追加する 'destWorksheet.Cells(i, 4).Value = srcWorksheet.Cells(i, 4).Value 'destWorksheet.Cells(i, 5).Value = srcWorksheet.Cells(i, 5).Value ' ・・・ Next i ' ファイルを保存して閉じる destWorkbook.Save destWorkbook.Close srcWorkbook.Close ' 画面更新をオンに戻す Application.ScreenUpdating = True ' メッセージボックスを表示 MsgBox "データの転記が完了しました。", vbInformation End Sub
エンジニアにアドバイスを求めながら完成
残念ながら、私のプロンプトから出力されたコードでは、最終行の取得に失敗したり、転記したデータが上書きされてしまうなど思うように動作せず、手詰まりになってしまいました。そこで、ChatGPTが出力したコードを元に、社内のエンジニアからアドバイスを受けながら、仕上げることにしました。
コードを修正する上で、前述したように私はプログラムの構造的な理解ができておらず(そもそも変数って何?という状態でした)、まずは“変数”の概念を理解するために、自分で書き換えるなどで理解を深めました。エンジニアから「変数=箱」と理解すると良いとアドバイスを受け、腑に落ました。
最終的には下記のコードが完成し、実際の業務に活用することができました。
Sub TransferDate() '変数の宣言 Dim MotoWorkbook As Workbook Dim MotoWorksheet As Worksheet Dim PersonWorkbook As Workbook Dim PersonWorksheet As Worksheet Dim SanshoFolderPath As String Dim SanshoFilepath As String Dim oFso As Filesystemobject Dim oFolder As Folder Dim MotolastRow As Long Dim PersonlastRow As Long Dim i As Long Dim oFile As File '参照するExcelファイルのフォルダーパスを設定 SanshoFolderPath = "C: " '転記先ファイルの指定 SanshoFilepath = "C: " Set MotoWorkbook = Workbooks.Open(SanshoFilepath) Set MotoWorksheet = MotoWorkbook.Sheets("参照シート名") '個別ファイルを開く Set oFso = CreateObject("Scripting.FileSystemobject") 'フォルダ―がない場合 If (oFso.FolderExists(SanshoFolderPath) = False) Then Exit Sub End If Set oFolder = oFso.GetFolder(SanshoFolderPath) For Each oFile In oFolder.Files Set PersonWorkbook = Workbooks.Open(oFile.Path) Set PersonWorksheet = PersonWorkbook.Sheets(1) '転記先ファイルの最終行を取得 MotolastRow = MotoWorksheet.Cells(MotoWorksheet.Rows.Count, "A").End(xlUp).Row '個別ファイルの最終行を取得 PersonlastRow = PersonWorksheet.Cells(PersonWorksheet.Rows.Count, "A").End(xlUp).Row 'データを転記 For i = 1 To PersonlastRow MotoWorksheet.Cells(MotolastRow + i, 1).Value = PersonWorksheet.Cells(i + 1, 1).Value MotoWorksheet.Cells(MotolastRow + i, 2).Value = PersonWorksheet.Cells(i + 1, 2).Value MotoWorksheet.Cells(MotolastRow + i, 3).Value = PersonWorksheet.Cells(i + 1, 3).Value MotoWorksheet.Cells(MotolastRow + i, 4).Value = PersonWorksheet.Cells(i + 1, 4).Value MotoWorksheet.Cells(MotolastRow + i, 5).Value = PersonWorksheet.Cells(i + 1, 5).Value MotoWorksheet.Cells(MotolastRow + i, 6).Value = PersonWorksheet.Cells(i + 1, 6).Value MotoWorksheet.Cells(MotolastRow + i, 7).Value = PersonWorksheet.Cells(i + 1, 7).Value MotoWorksheet.Cells(MotolastRow + i, 8).Value = PersonWorksheet.Cells(i + 1, 8).Value MotoWorksheet.Cells(MotolastRow + i, 9).Value = PersonWorksheet.Cells(i + 1, 9).Value MotoWorksheet.Cells(MotolastRow + i, 10).Value = PersonWorksheet.Cells(i + 1, 10).Value MotoWorksheet.Cells(MotolastRow + i, 11).Value = PersonWorksheet.Cells(i + 1, 11).Value MotoWorksheet.Cells(MotolastRow + i, 12).Value = PersonWorksheet.Cells(i + 1, 12).Value MotoWorksheet.Cells(MotolastRow + i, 13).Value = PersonWorksheet.Cells(i + 1, 13).Value MotoWorksheet.Cells(MotolastRow + i, 14).Value = PersonWorksheet.Cells(i + 1, 14).Value MotoWorksheet.Cells(MotolastRow + i, 15) = oFile.Name Next i PersonWorkbook.Close Next '画面更新をオンに戻す Application.ScreenUpdating = True 'メッセージボックスを表示 MsgBox "データの転記が完了しました。", vbInformation End Sub
ループ処理のマクロが複数行で記載されており、エンジニアからすると美しいコードではないなど未熟な部分はありますが、完成できたことが一歩前進だと感じています。実際、このVBAのおかげで、かなりの業務効率化が実現しました!
ChatGPTは、新しいことにチャレンジするきっかけに最適
残念ながら今回は、ChatGPTだけで完成できませんでした。プログラムの場合、トライ&エラーを行う必要がありますが、今回はエラーを特定できず、社内エンジニアの方にエラー箇所を見つけてもらいました。基礎知識と調べる能力の必要性、そして相談できる仲間(パートナー=社員)の大切さを実感しました。
しかしChatGPTを活用することで、非エンジニアでもVBAで業務効率化するきっかけになりました。また、プログラムのベースがあるため、エンジニアへの質問も明確になり、コードのレビューもしやすく、プロセスも効率化できましたし、ベースがあることで具体性も増し、私の学習意欲も高まりました。
ーーー
一緒にGMOあおぞらネット銀行で働いてくれる仲間を募集しています。
社内勉強会はもちろん、GMOグループの勉強会にも参加できます。ご興味のあるエンジニアの方は、当社採用ページをぜひ一度ご覧ください。