- ベストアンサー
売上管理から購入者の購入サイクルを出す方法が知りたい
Excel2007を利用しております。 毎日の売り上げを下記の表の様に売り上げ管理をしています。「フィルタ」や「ピポット」で購入者別、商品別を出しております。下記の様な表で『購入サイクル』を出せれば…と言うのが教えて頂きたい事なのです。1/15に田中様がりんご10個お買求め頂き、2回目は3/9に同じお買いもの、3回目に5/7に同じお買いもの。この場合約56.5日という購入サイクルが出ますが、この様なものを出したい場合どの様な方法がベストでしょうか? 関数を使って出来れば何よりで、ピポットで可能なのか、VBAでなければ無理なのか、アクセスを使うのがよいのか(未使用ソフトです)?もしもVBAであれば申し訳ありませんがコードを教えて下さい A B C D 購入日 購入者 商品名 数量 1/15 田中様 りんご 10 ・ ・ ・ ・ 3/2 鈴木様 みかん 20 3/9 田中様 りんご 5 ・ ・ ・ ・ ・ ・ ・ ・ 5/7 田中様 りんご 5 ・ ・ ・ ・ 8/2 鈴木様 みかん 20 8/2 阿部様 みかん 20 購入者は約250名~300名程、商品アイテムは30種程です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ANo.2です。 >しかし重ねて申し訳ないのですが、「購入日、購入者、商品名、数量」の列を変更するにはどの部分を変えればよいでしょうか? >表の詳細を申しますとA列には「日付」B列には「地域」C列には「購入者」D列には「商品名」、E列には「数量」となっております。 Sub try2() Dim Dic As Object Dim i As Long, j As Long Dim n As Long Dim st As String Dim v, w, x, key Set Dic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") v = .Range(.Range("A2"), .Cells(Rows.Count, 4).End(xlUp)).Value2 End With For i = 1 To UBound(v, 1) st = v(i, 3) & "_" & v(i, 4) If Not Dic.exists(st) Then Dic(st) = Array(v(i, 1), 0, 0, 1) Else n = Dic(st)(0) w = Array(v(i, 1), Dic(st)(1) + (v(i, 1) - n), Dic(st)(3)) Dic(st) = Array(w(0), w(1), w(1) / w(2), w(2) + 1) End If Next ReDim x(1 To Dic.Count, 1 To 3) For Each key In Dic.keys j = j + 1 x(j, 1) = Split(key, "_")(0) x(j, 2) = Split(key, "_")(1) x(j, 3) = Dic(key)(2) Next With Worksheets("Sheet2") .Range("A1:C1").Value = Array("購入者", "商品名", "購入サイクル") .Range("A2").Resize(Dic.Count, 3).Value = x End With Set Dic = Nothing Erase v, w, x End Sub こうゆう事でしょうか。
その他の回答 (3)
- hallo-2007
- ベストアンサー率41% (888/2115)
作業列使った関数案です。 A B C D E 作業列 購入日 購入者 商品名 数量 =B2&C2 1/15 田中様 りんご 10 とA列に井列挿入して、=B2&C2 を下までコピィしておきます。 F列に =VLOOKUP(A2,A3:B$100,2,FALSE) と範囲をひとつ下の行から最後のデータまでにして、下までコピィ 次に購入した日付がでますので、 次購入までの期間は G列に =E2-B2で出ます。(1個単位で計算なら =(G2-B2)/E2も良いかも) 後はピボットテーブルなどで、平均値にしてみてはいかがでしょうか?
補足
回答ありがとうございます。 現在、No1,No2さんからの回答を採用させていただいており「hallo-2007」さんの方法まで着手出来ておりません。しかし、必ず回答を利用させて頂き役立てさせて頂きます。 解り易い説明をありがとうございました。
- n-jun
- ベストアンサー率33% (959/2873)
Sheet1のデータを基にSheet2に書き出します。 (シート名は適宜修正して下さい。) Sub try() Dim Dic As Object Dim i As Long, j As Long Dim n As Long Dim st As String Dim v, w, key Set Dic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") v = .Range(.Range("A2"), .Cells(Rows.Count, 3).End(xlUp)).Value2 End With For i = 1 To UBound(v, 1) st = v(i, 2) & "_" & v(i, 3) If Not Dic.exists(st) Then Dic(st) = Array(v(i, 1), 0, 0, 1) Else n = Dic(st)(0) w = Array(v(i, 1), Dic(st)(1) + (v(i, 1) - n), Dic(st)(3)) Dic(st) = Array(w(0), w(1), w(1) / Dic(st)(3), Dic(st)(3) + 1) End If Next ReDim w(1 To Dic.Count, 1 To 3) For Each key In Dic.keys j = j + 1 w(j, 1) = Split(key, "_")(0) w(j, 2) = Split(key, "_")(1) w(j, 3) = Dic(key)(2) Next With Worksheets("Sheet2") .Range("A1:C1").Value = Array("購入者", "商品名", "購入サイクル") .Range("A2").Resize(Dic.Count, 3).Value = w End With Set Dic = Nothing Erase v, w End Sub こうゆう感じのことでいいのかな。 購入者の並べ替えはしてないですけど。
補足
ありがとうございます。本当に大感謝いたします。 まさに願ったとおり、希望通りの結果が出ます。 しかし重ねて申し訳ないのですが、「購入日、購入者、商品名、数量」の列を変更するにはどの部分を変えればよいでしょうか?表の詳細を申しますとA列には「日付」B列には「地域」C列には「購入者」D列には「商品名」、E列には「数量」となっております。
- n-jun
- ベストアンサー率33% (959/2873)
別の日に田中様が”みかん”を購入したら、それは”りんご”とは違うサイクル と言う事でしょうか。
補足
「同じ商品をどのくらいのサイクルで購入されているか?」を知りたいです ”みかん”は”みかん”のサイクルを”りんご”は”りんご”のサイクルを知るため可能な方法をお願いします。
補足
本当に本当にありがとうございました。 お陰様で100%完璧に理想通りのことができました。 本当にありがとうございました。