見出し画像

ChatGPTがあればコードが書けなくてもExcelVBA・マクロは本当に作れるのか?

Excelの作業を効率化したい!

元SE・キャリアコンサルタントのちょこです。
元SEだったらプログラミングは得意でしょ?って聞かれることがあるのですが、文系からのインフラエンジニアだった私は、実業務ではプログラミングを行う機会って無かったんです。どこにコードを書いて、どうやってマクロ設定してるのかってことは知っているんだけど、自分でイチからVBAコードを書くというのはやったことがないんです。

でもでも、ChatGPTはコードが書けなくても、Excelの処理をマクロで自動化できるって言うじゃないですか。てことは、こんなへっぽこな私でも作れちゃうってことなんですかね!?
ということで、特に何も下調べ無しに、ChatGPTくんと一緒に試行錯誤しながらExcelの処理効率化にチャレンジしていきたいと思います。

ChatGPTくんと一緒に頑張る!

やりたいことをどう伝えよう?

今回やりたいこと

どうせなら実際に使えそうなもので試してみようということで、何か便利にしたいことはないかなーと考え、ひとつ思いつきました。
「FX3社の取引履歴データを、Excelのひとつのシートに集約する」
勉強のために小銭でチビチビやりはじめたFXなんですけど、3つの会社の取引履歴があるんです。履歴のCSVファイルは会社ごとに項目名やレイアウトが違うので、手作業でデータをまとめようとすると、それぞれCSVファイルを開いて、項目列ごとにコピーして、同じ意味をもつ項目名の列にペーストして・・・を手作業で繰り返すのが面倒です。
この作業をボタンひとつで処理できるといいなぁと思い、挑戦してみます。

3社のCSVデータをひとつのExcelシートに簡単に集約したい

簡単に処理の流れを決める

3社のCSVファイルから、どうやってデータを集約するのかを、ChatGPTくんに考えてもらうということもできると思うんですけど、ChatGPTくんへどう伝えたらいいのかなと悩んでしまいました。膨大な量のデータだったら手伝ってもらうところですが、今回は練習用の小さいデータなので、自分で項目をざっと見て、どう取り込むか整理しました。設計書を書くほどでもないので、メモだけ作ります。

・どの会社のデータを取り込んだかを判別する
どの会社のデータを取り込むのかを判別するために、ダウンロード時のファイル名ルールを決め、ファイル名の先頭文字によって処理を分岐させることとしました。
・InputデータとOutputデータの紐づけ
今回はA社のタイトル行にある項目名をベースにOutputとなるrirekiシートを作ることにしました。B社データは項目名が違っても、同じ並びで同じ内容が出力されていたので、そのまま取り込めそう。
C社データは、他の2社と全くフォーマットが違っていたので、何番目の項目は、rirekiシートの何番目の項目に取り込む・・・というように、全11項目を紐づけしていきました。

ChatGPTくんへやりたいことを伝える

ここでやっとChatGPTくんの出番です。
ここまで整理した内容をもとに、こんな感じなのかなぁとプロンプトを作ってみました。それがこれ。

##Instruction##
 VBAでCSVファイルを開いているrirekiシートに取り込み、データを統合するコードを書いてください。
##処理##
ユーザがファイルを取り込むためのダイアログボックスを表示し、選択されたファイルの先頭文字を識別して、以下の処理を行います。
 1.もしファイル名が"G"で始まるCSVファイルが選択されたら
  ・CSVファイルの4行目以降かつ2列目にデータが入っている行全てのデータをrirekiシートの最終行以降にコピーします。
  ・rirekiシートのコピーした行のV列に、"G社"と入力します。
 2.もしファイル名が"J"で始まるCSVファイルが選択されたら
  ・CSVファイルの2行目以降かつ2列目にデータが入っている行全てのデータをのデータをrirekiシートの最終行以降にコピーします。
  ・rirekiシートのコピーした行のV列に、"J社"と入力します。
 3.ファイル名が"L"で始まるCSVファイルが選択されたとき
  ・CSVファイルの5行目以降のデータを以下のルールでrirekiシートの最終行以降にコピーします。
   CSVファイルの1列目のデータをrirekiシートの4列目へコピー
   CSVファイルの2列目のデータをrirekiシートの10列目へコピー
   CSVファイルの3列目のデータをrirekiシートの7列目へコピー
   CSVファイルの4列目のデータをrirekiシートの11列目へコピー
   CSVファイルの5列目のデータをrirekiシートの9列目へコピー
   CSVファイルの6列目のデータをrirekiシートの15列目へコピー
   CSVファイルの7列目のデータをrirekiシートの19列目へコピー
   CSVファイルの8列目のデータをrirekiシートの20列目へコピー
   CSVファイルの9列目のデータをrirekiシートの1列目へコピー
   CSVファイルの10列目のデータをrirekiシートの12列目へコピー
   CSVファイルの11列目のデータをrirekiシートの2列目へコピー
  ・rirekiシートのコピーした行のV列に、"L社"と入力します。
##Context##
 1.指定したファイルの最終行は、シートごとに異なります。
 2.rirekiシートは開いています。
 3.指定するファイルは複数あります。
##Output##
1.完結にお願いします。

するとChatGPTくんが、サクサクサクッと、80行のVBAコードを書いてくれました。仕事が速い!

作ってくれたコードを設定して動かしてみる・・・あれ?

早速、準備していたOutputファイルに作ってもらったVBAのコードを貼り付け、試しに動かしてみます。
ファイル選択画面から、テスト用のファイルを取り込んでみると・・・。
うんうん、あっと言う間にデータがrirekiシートに取り込まれました。一番気になっていたC社データもちゃんと指定の項目列に取り込まれています。
データの内容は大丈夫かな?
・・・あれ?
件数が違う。

ChatGPTくんと試行錯誤

InputとOutputのデータを照合してみると、どうやらInputのA列が空欄になっている最終行が抜けてしまうよう。B列は確実にデータが入るので、ここで判断してもらえばいいのかなあ。

そこで、
「取り込み件数が足りていないので、B列のデータがある行はすべて取り込んで」
と追加でひとことお願いしてみました。
そうしたら、お安い御用!と言わんばかりに、またまたコードを仕上げてくれたChatGPTくん。
ありがとー!と、また動作確認をしてみると・・・?
うーん、なぜだか最初はできていた「タイトル行はコピーしなくていいよ」という部分を忘れちゃってる。

やっぱり最初のプロンプトを書き換えて、改めてお願いしてみよっと。
ファイルごとに処理を分岐させたあと、
「CSVファイルの4行目以降 かつ 2列目にデータが入っている行全てのデータをrirekiシートの最終行以降にコピーします」
というように指示を変えてお願い。
そうしたら、今度は思った通りのコードを書いてくれました。できあがったのがこれ。

Sub ImportCSVAndIntegrateData()
    Dim fd As FileDialog
    Dim filePath As String
    Dim csvWorkbook As Workbook
    Dim rirekiSheet As Worksheet
    Dim startRow As Long, i As Long, j As Long
    Dim lastRow As Long
    Dim col As Variant, row As Range
    
    ' rirekiシートを設定
    Set rirekiSheet = ThisWorkbook.Sheets("rireki")
    
    ' ファイル選択ダイアログの設定
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Title = "CSVファイルを選択"
        .Filters.Add "CSV Files", "*.csv", 1
        If .Show = False Then Exit Sub ' ユーザーがキャンセルした場合
        filePath = .SelectedItems(1) ' 選択されたファイルのパス
    End With
    
    ' CSVファイルを開く
    Set csvWorkbook = Workbooks.Open(filePath)
    
    ' ファイル名の先頭文字に基づいて処理を分岐
    Select Case UCase(Left(Dir(filePath), 1))
        Case "G"
           startRow = 4
            col = "G社"
        Case "J"
            startRow = 2
            col = "J社"
        Case "L"
            startRow = 5
            col = "L社"
        Case Else
            MsgBox "不正なファイル名です。"
            csvWorkbook.Close False
            Exit Sub
    End Select
    
    ' 最終行を取得
    lastRow = rirekiSheet.Cells(rirekiSheet.Rows.Count, 1).End(xlUp).Row + 1
    
    ' データをrirekiシートにコピー
    For i = startRow To csvWorkbook.Sheets(1).UsedRange.Rows.Count
        ' 2列目にデータがある行だけをコピー
        If Not IsEmpty(csvWorkbook.Sheets(1).Cells(i, 2).Value) Then
            If col = "L社" Then
                ' 特定の列へのマッピングでデータをコピー
                Dim mapping() As Variant
                mapping = Array(4, 10, 7, 11, 9, 15, 19, 20, 1, 12, 2)
                
                For j = LBound(mapping) To UBound(mapping)
                    rirekiSheet.Cells(lastRow, mapping(j)).Value = csvWorkbook.Sheets(1).Cells(i, j + 1).Value
                Next j
            Else
                ' 全列を直接コピー
                For j = 1 To csvWorkbook.Sheets(1).UsedRange.Columns.Count
                    rirekiSheet.Cells(lastRow, j).Value = csvWorkbook.Sheets(1).Cells(i, j).Value
                Next j
            End If
            ' V列に値を設定
            rirekiSheet.Cells(lastRow, 22).Value = col
            lastRow = lastRow + 1
        End If
    Next i
    
    ' CSVファイルを閉じる
    csvWorkbook.Close False
    
    MsgBox "データの統合が完了しました。"
End Sub

ファイル選択をキャンセルした場合のメッセージとか、取り込んだあとのメッセージとかは、細かく指定しなくても考えてくれてて、ありがたい。
これを、「取り込み」ボタンを押したら動作するようにするのはどうするんだっけ?というのも教えてくれました。

取り込みボタンでCSVファイルを選ぶだけ

コードが書けなくてもExcelマクロは作れることは作れる

あっと言う間にコードが出来上がる!

こんな感じで、コードが書けなくても、Excelマクロを作ることができました!
最初のやりたいことを整理したり、処理の流れを決めたり、Input/Outputファイルを準備したりというところに時間はかかったものの、ChatGPTくんとこれまで何度かプロンプトでやりとりをしたことがあったし、彼があっと言う間にコードを書いてくれるので、全体としては半日ほど(うちChatGPTくんの仕事はたぶんトータル10分もかかってない)でした。自分でVBAを勉強しながら作ろうと思ったら、きっと何日もかかってしまったかもしれません。

自分の頭の中にあるものを言語化するのは難しい

でも自分の頭の中にある思考を言語化するって、難しいなぁと改めて思いました。最初に把握しておくべきことは何か、どこまで決めておくべきかというところを知っていたほうが、スムーズに作成できそうです。
ちゃんと調べると、もっと良いプロンプトの書き方もあるのかもしれませんね。勉強したくなりました。

ChatGPTくんとの共同作業を楽しもう

正直コードの出来栄えについてはわからないのですが、動作させてみて、何がいけないんだろ?って考えて、伝え方を工夫して、って試行錯誤しながら、想定通りの動作に近づけていく作業は、楽しくて時間が過ぎるのも忘れてしまうほどでした。
また何か挑戦して、ChatGPTくんとの共同作業を楽しんでみたいなと思っています。




この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?