商品を発注する時に使うデータ。情報はあるけれどバラバラで活用しづらい。前回、必要なデータを整理するのにChatGPTを活用してちょっとだけ簡単にできましたが、理想の形にならなかったので、見直しながら再度挑戦!
複数のデータをまとめてすぐ使える状態にしたい
商品を注文する時、準備としていろいろなデータ使いますが、主に下記3つのデータを中心に使っています。
1. 今お店にある在庫
2. 今まで売れた数量
3.これからお店に入れる数量
4.注文してまだお店についていない在庫
1~3については今のシステムのフォーマットがあるので、データをそのまま出力してすぐ使えます。ここに4.注文しているけどまだ商品が届いていない在庫 のデータを組みこんで使いたい。このデータを業務に使える状態にするのに非常に手間がかかるのです。これを整理にする方法をChatGPTに相談して2ステップでできるようになりました。
1. CSVデータのシートの統合
今回使いたい4のデータは複数の分かれたCSVデータの形で取得します。
本命のデータ整理の前にこれを1つのシートにまとめる必要があります。
複数の提案の中からPower Queryを使ってまとめるをやってみました
1.まとめたいデータを一つのフォルダに入れる
2.エクセルの左上 データ⇒データの取得⇒フォルダからでデータ集約したいフォルダを指定
83.これを最後にデータの結合および読み込み を選択
出来上がったシートはこれ
色分けされてて見やすい! 1段階目 クリアです。
2.完成したシートを作業シートに合体する
普段使っているVLOOKUPでは1回でできず、非常に手間がかかるためこの改善をしたい。前回、2つのエクセル関数を組み合わせてやる方法を知りましたがもっと簡単にしたい。VBAを使いたかったけれど、実際にはなかなか動かず再度挑戦します。
前回の反省ポイント
1. やりたいことをChatGPTにうまく伝えられず返答がよくわからない
2. いつも使っているエクセルを使用したらデータ量が多すぎてパソコンが固まる
3. 取得したデータをまとめ・別シートに特定のデータを呼び出すことを一度にやろうとした
反省を活かして今回は下記に注意して進めます
・ChatGPTに正確に要求を伝える
・試すのに適度な情報量でマクロを実行できる元データを作成する
・途中であきらめない
ChatGPTに正確に要求を伝える
チャットとつくので漠然とプロンプトは短くて簡単な内容でないといけないと思い込んでいました。詳しく書くにもどう書いたらいいのか見当もつかず・・。こちらの記事を参考にしました。
直接入力するとうっかりENTERキーを押してうまくいかなかったので、一旦テキストに記載して貼り付けました。箇条書きのほうが自分の頭を整理しやすいし、正確に伝わったようです。
VBAは便利と聞いたけどをイマイチ理解していないので使い方も聞いてみます
使い方はわかりました。
適度な情報量でマクロを実行できる元データの準備
1.エクセルファイルのオプションを選択し マクロを有効にする
2.ファイルの保存形式を.xlsm にする
3.エクセルの行を減らしたシートの作成
前回は業務に使うものをそのまま利用しようとして2万行のものを使ったため計算に時間がかかっているのか、フリーズしているのかわからず困惑。今回は説明を何度も読み返して丁寧に準備!
早速コード記入
書いてもらったコード
Sub CopyData()
Dim wsOrder As Worksheet
Dim wsPurchase As Worksheet
Dim lastRowOrder As Long
Dim lastRowPurchase As Long
Dim orderKey As String
Dim i As Long
Dim j As Long
シートを設定
Set wsOrder = ThisWorkbook.Sheets("注文起案シート")
Set wsPurchase = ThisWorkbook.Sheets("発注中")
最終行を取得
lastRowOrder = wsOrder.Cells(wsOrder.Rows.Count, "A").End(xlUp).Row
lastRowPurchase = wsPurchase.Cells(wsPurchase.Rows.Count, "A").End(xlUp).Row
注文起案シートのループ
For i = 2 To lastRowOrder
orderKey = wsOrder.Cells(i, 1).Value & wsOrder.Cells(i, 2).Value
発注中シートのループ
For j = 2 To lastRowPurchase
If wsPurchase.Cells(j, 1).Value & wsPurchase.Cells(j, 2).Value = orderKey Then
wsOrder.Cells(i, 3).Value = wsPurchase.Cells(j, 3).Value
Exit For
End If
Next j
Next i
MsgBox "データの転記が完了しました。"
End Sub
マクロが正常に実行されると、「データの転記が完了しました。」というメッセージが表示されます。「注文起案シート」のC列に、「発注中」シートのC列の値が転記されているか確認します。と説明してくれましたが、できません。
もう一度ChatGPTに相談
エラーの意味が理解できず、エラーコードとエラーメッセージをそのままChatGPTに聞きました。するとファイル名の相違をチェックするよう指摘されました。ChatGPTに入力したシート名と自分で作ったファイルのシート名が違っていたという凡ミス!!指摘されて落ち着いて確認したら問題解消。マクロが実行されました。
実際につかえるようにしたい
今回このマクロ実行、計算に10秒くらいかかりました。これはサンプルデータだから行数少ないけど実際使うのはデータがもっと多い。このままでは応用できない!ってことでまた相談。
で、使い方とともに欲しい答えをくれました
完璧なコード
Sub CopyData()
Sub CopyDataOptimized()
Dim wsOrder As Worksheet
Dim wsPurchase As Worksheet
Dim lastRowOrder As Long
Dim lastRowPurchase As Long
Dim orderKey As String
Dim orderDict As Object
Dim i As Long
' シートを設定
Set wsOrder = ThisWorkbook.Sheets("発注起案シート")
Set wsPurchase = ThisWorkbook.Sheets("発注中")
' 最終行を取得
lastRowOrder = wsOrder.Cells(wsOrder.Rows.Count, "A").End(xlUp).Row
lastRowPurchase = wsPurchase.Cells(wsPurchase.Rows.Count, "A").End(xlUp).Row
' Dictionaryの初期化
Set orderDict = CreateObject("Scripting.Dictionary")
' 発注中シートのデータをDictionaryに読み込む
For i = 2 To lastRowPurchase
orderKey = wsPurchase.Cells(i, 1).Value & wsPurchase.Cells(i, 2).Value
If Not orderDict.exists(orderKey) Then
orderDict.Add orderKey, wsPurchase.Cells(i, 3).Value
End If
Next i
' 注文起案シートにデータを転記
For i = 2 To lastRowOrder
orderKey = wsOrder.Cells(i, 1).Value & wsOrder.Cells(i, 2).Value
If orderDict.exists(orderKey) Then
wsOrder.Cells(i, 3).Value = orderDict(orderKey)
End If
Next i
MsgBox "データの転記が完了しました。"
' Dictionaryのクリーンアップ
Set orderDict = Nothing
End Sub
これをつかったら・・完成しました!
理想の形です。クリックしてすぐに結果が出たのでこれなら実務にも活用できます
さらに最後にまとめもしてくれました。
ChatGPTって頼りになる!
ここまでくるのにかなり時間を要しましたがわかってきたらすごく頼りになる!
うまくいっていなかった時は、返答の意味が解らずこちらが固まっていましたが、「わからない」って聞いていいんだなと理解してからは気が楽になり使いやすくなりました。わかるまで聞き続ける、あきらめないって大事!!
使いこなせるようになったら普段の業務をもっと高速化できるはず。できた時間で現場を回る時間を増やすことやチームのパフォーマンスをよくするための話し合いの時間をとることに使えればいいなあと考えています。