非エンジニアがChatGPTを駆使してVBAプログラムを学んだ話

こんにちは。GMOあおぞらネット銀行で人事を担当しているKMです。今回は、非エンジニアの私がChatGPTを活用して、VBAプログラムを作った話をします。


非エンジニアのジレンマからの脱却を目指す

業務をしている中で、毎月発生する作業や膨大なデータで、同じ作業を繰り返すことがあります。そんな時、私のような非エンジニアは「誰かこの作業を自動化してくれないかな」と他力本願になりながら、最終的には“仕方なく”人力で何とかしてきました。(多分こういう方は多いはず。)

過去に独学でのVBAプログラミングにトライしましたが、構造などが理解できず途中で挫折していました。そんな私が、ChatGPTを活用して、実際にVBAを動かすことに成功しました!

今回のチャレンジをまとめると以下の3つとなります。順を追って説明していきます。

  1. プロセスを明確にして(ここがめっちゃ重要!)やりたいことをChatGPTに指示すれば、ちゃんと動く
  2. 細かいところを設定するためには、VBAの構造的な理解が必要(ここが難しい・・)
  3. 例外なく、ChatGPTを使うのにも慣れが必要

要件定義

約200のExcelファイルを一つのExcelデータにまとめてマスターデータを作るという処理を行いました。
人力で乗り切ろうとすると、以下の工程が発生します。

  1. 約200のExcelファイルを1つのフォルダ―にまとめる
  2. マスターデータのフォーマットを作る
  3. 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グループの勉強会にも参加できます。ご興味のあるエンジニアの方は、当社採用ページをぜひ一度ご覧ください。

gmo-aozora.com