[[20051214134725]] 『DBの集計のオート化』(信州) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『DBの集計のオート化』(信州) Windows2000、Excel2000
 久し振りの投稿です。
下記のDBは売上日順に入力したものです。これを
@商品分類順に並べ替える
A商品分類毎に平均値、最高値、最低値を求め、それぞれの値を各商品分類行の最後行の次行に
入れる作業を手作業で行っていますが、それをVBA化出来ないか、試行錯誤中です。どなたか知恵を貸して下さいませんか?

A:最初のDB

 売上日	店コード	商品分類	  売上金額
12/14/05	A店	食品1	    19550
12/14/05	B店	飲料2	    15000
12/13/05	A店	電化製品1   360000
12/13/05	C店	食品1	     5100
12/13/05	B店	飲料3	     2700
12/13/05	E店	飲料2	     6000
12/12/05	G店	食品1	    25500
12/12/05	A店	電化製品1   120000
12/12/05	E店	食品3	   240000
12/11/05	A店	飲料3	     9600
12/11/05	H店	食品1	    30600
12/11/05	B店	電化製品1  3000000
12/11/05	B店	飲料2	    45000
12/11/05	G店	食品3	   171000
12/11/05	A店	電化製品2  7200000
12/11/05	E店	食品2	    79500
12/10/05	I店	飲料2	    90000
12/10/05	A店	食品3	   270000
12/10/05	G店	電化製品2  3600000
12/10/05	J店	飲料3	    31200
12/10/05	H店	電化製品2  4320000
12/10/05	H店	食品3	   240000
12/10/05	I店	飲料3	     9600
12/10/05	J店	飲料2	    12000
12/10/05	D店	電化製品3   360000

B:商品分類の昇順に並べ替え

 Sub 商品分類別並べ替え()
    Range("C2").Select
    Application.CutCopyMode = False
    Selection.Sort Key1:=Range("C2"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom,   SortMethod _
        :=xlPinYin
 End Sub

 を実行して

 売上日	店コード	商品分類	  売上金額
12/14/05	B店	飲料2	    15000
12/13/05	E店	飲料2	     6000
12/11/05	B店	飲料2	    45000
12/10/05	I店	飲料2	    90000
12/10/05	J店	飲料2	    12000
12/13/05	B店	飲料3	     2700
12/11/05	A店	飲料3	     9600
12/10/05	J店	飲料3	    31200
12/10/05	I店	飲料3	     9600
12/14/05	A店	食品1	    19550
12/13/05	C店	食品1	     5100
12/12/05	G店	食品1	    25500
12/11/05	H店	食品1	    30600
12/11/05	E店	食品2	    79500
12/12/05	E店	食品3	   240000
12/11/05	G店	食品3	   171000
12/10/05	A店	食品3	   270000
12/10/05	H店	食品3	   240000
12/13/05	A店	電化製品1   360000
12/12/05	A店	電化製品1   120000
12/11/05	B店	電化製品1  3000000
12/11/05	A店	電化製品2  7200000
12/10/05	G店	電化製品2  3600000
12/10/05	H店	電化製品2  4320000
12/10/05	D店	電化製品3   360000

 C:Bを商品分類毎にAVG,MAX,MINを求め、それぞれの値を各商品分類行の最後行の次行に
入れる作業を手作業で行った後

 売上日	店コード	商品分類	 売上金額
12/14/05	B店	飲料2	    15000
12/13/05	E店	飲料2	     6000
12/11/05	B店	飲料2	    45000
12/10/05	I店	飲料2	    90000
12/10/05	J店	飲料2	    12000
		AVG	    33600
		MAX	    90000
		MIN	     6000
12/13/05	B店	飲料3	     2700
12/11/05	A店	飲料3	     9600
12/10/05	J店	飲料3	    31200
12/10/05	I店	飲料3	     9600
		AVG	    13275
		MAX	    31200
		MIN	     2700
12/14/05	A店	食品1	    19550
12/13/05	C店	食品1	     5100
12/12/05	G店	食品1	    25500
12/11/05	H店	食品1	    30600
		AVG	    20187.5
		MAX	    30600
		MIN	     5100
12/11/05	E店	食品2	    79500
		AVG	    79500
		MAX	    79500
		MIN	    79500
12/12/05	E店	食品3	   240000
12/11/05	G店	食品3	   171000
12/10/05	A店	食品3	   270000
12/10/05	H店	食品3	   240000
		AVG	   230250
		MAX	   270000
		MIN	   171000
12/13/05	A店	電化製品1   360000
12/12/05	A店	電化製品1   120000
12/11/05	B店	電化製品1  3000000
		AVG	   912750
		MAX	  3000000
		MIN	   120000
12/11/05	A店	電化製品2  7200000
12/10/05	G店	電化製品2  3600000
12/10/05	H店	電化製品2  4320000
		AVG	  3810000
		MAX	  7200000
		MIN	   120000
12/10/05	D店	電化製品3   360000
		AVG	   360000
		MAX	   360000
		MIN	   360000

 Cの作業がしんどいのでVBA化出来ないかな〜と考えているのですが・・・(信州)

 分類ごとに並べ替える。
次は、データ→集計で
最小値の集計:集計のダイアログで「現在の集計表と入れ替える」のチェックを入れる。
最大値の集計:集計のダイアログで「現在の集計表と入れ替える」のチェックを外す。
平均の集計:集計のダイアログで「現在の集計表と入れ替える」のチェックを外す。
を、自動記録したらどうでしょう。  (Hatch)

 こんな感じで...

 Sub test()
 Dim i As Long, ii As Long, x As Long
 Application.ScreenUpdating = False
 With ActiveSheet
     With .Range("a1").CurrentRegion
         On Error Resume Next
         With .Columns(1)
             .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
         End With
         Err.Clear
         .Sort key1:=.Cells(2, 3), order1:=xlAscending, _
         key2:=.Cells(2, 1), order2:=xlAscending, header:=xlYes
     End With
     i = 2: x = i
     Do
         If .Cells(i + 1, "c") <> .Cells(i, "c") Then
             .Rows(i + 1 & ":" & i + 3).Insert
             With .Cells(i + 1, "c")
                 .FormulaR1C1 = "=average(r" & x & "c4:r[-1]c4)"
                 .Offset(1).FormulaR1C1 = _
                                 "=max(r" & x & "c4:r[-2]c4)"
                 .Offset(2).FormulaR1C1 = _
                                 "=min(r" & x & "c4:r[-3]c4)"
             End With
             i = i + 3: x = i + 1
         End If
         i = i + 1
     Loop Until .Cells(i, "c") = ""
 End With
 Application.ScreenUpdating = True
 End Sub
 (seiya)

 オー、すごーい!seiya様 一発でうまくいきました。大感激です!これから上記のVBAを分析してみますが、
AVG,MAX,MINを入れる事は出来ないでしょうか? (信州)

              With .Cells(i + 1, "c")
                 .FormulaR1C1 = "=average(r" & x & "c4:r[-1]c4)"
                 .Offset(1).FormulaR1C1 = _
                                 "=max(r" & x & "c4:r[-2]c4)"
                 .Offset(2).FormulaR1C1 = _
                                 "=min(r" & x & "c4:r[-3]c4)"
             End With

 を、下記に変更してみてください?

             With .Cells(i + 1, "c")
                 .offset(,-1).resize(3)=application.transpose(array("Avr","Max","Min"))
                 .FormulaR1C1 = "=average(r" & x & "c4:r[-1]c4)"
                 .Offset(1).FormulaR1C1 = _
                                 "=max(r" & x & "c4:r[-2]c4)"
                 .Offset(2).FormulaR1C1 = _
                                 "=min(r" & x & "c4:r[-3]c4)"
             End With

 (seiya)

 有難うございます。これで、毎週悩まされていた集計作業から解放されそうです。(信州)

 野暮な質問ですが、
    With .Range("a1").CurrentRegion
         On Error Resume Next
         With .Columns(1) -->@
             .SpecialCells(xlCellTypeBlanks).EntireRow.Delete -->A
         End With
         Err.Clear
         .Sort key1:=.Cells(2, 3), order1:=xlAscending, _
         key2:=.Cells(2, 1), order2:=xlAscending, header:=xlYes -->B
     End With

@,A,Bの意味は何でしょうか?


     With .Range("a1").CurrentRegion
         On Error Resume Next
         With .Columns(1) -->@
             .SpecialCells(xlCellTypeBlanks).EntireRow.Delete -->A
         End With
         Err.Clear
         .Sort key1:=.Cells(2, 3), order1:=xlAscending, _
         key2:=.Cells(2, 1), order2:=xlAscending, header:=xlYes -->B
     End With
 上記は、Avr, Max, Minが挿入される前の状態に戻す作業です。

 @ Range("a1").currentregion の columns(1) ということはA列でcurrentregionの最下行までを指定
 A Avr, Max, Minが挿入されている状態では、その同行は常に空白になるので、これを目安に行削除。
 B C列、A列の優先順位で並び替え。

 (seiya)

 有難うございます。(信州) 

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.