• ベストアンサー

売上管理から購入者の購入サイクルを出す方法が知りたい

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種程です。

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.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 こうゆう事でしょうか。

sasa_aru
質問者

補足

本当に本当にありがとうございました。 お陰様で100%完璧に理想通りのことができました。 本当にありがとうございました。

その他の回答 (3)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

作業列使った関数案です。 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も良いかも) 後はピボットテーブルなどで、平均値にしてみてはいかがでしょうか?

sasa_aru
質問者

補足

回答ありがとうございます。 現在、No1,No2さんからの回答を採用させていただいており「hallo-2007」さんの方法まで着手出来ておりません。しかし、必ず回答を利用させて頂き役立てさせて頂きます。 解り易い説明をありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

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 こうゆう感じのことでいいのかな。 購入者の並べ替えはしてないですけど。

sasa_aru
質問者

補足

ありがとうございます。本当に大感謝いたします。 まさに願ったとおり、希望通りの結果が出ます。 しかし重ねて申し訳ないのですが、「購入日、購入者、商品名、数量」の列を変更するにはどの部分を変えればよいでしょうか?表の詳細を申しますとA列には「日付」B列には「地域」C列には「購入者」D列には「商品名」、E列には「数量」となっております。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

別の日に田中様が”みかん”を購入したら、それは”りんご”とは違うサイクル と言う事でしょうか。

sasa_aru
質問者

補足

「同じ商品をどのくらいのサイクルで購入されているか?」を知りたいです ”みかん”は”みかん”のサイクルを”りんご”は”りんご”のサイクルを知るため可能な方法をお願いします。

関連するQ&A