2012-01-17 11 views
0

のデータ行をグループ化し、ワークシートとして(DBではなく)としてグループ化し、別のビューテーブルワークシートのエントリとして集計する方法を探しています。例えば、私は、データの4行は​​言うている:これはかなり複雑な問題であり、私が何かを必要とExcel VBA:グループ化による未加工データテーブルの処理

GroupA GroupB Value1 Value2 Value3 
A  A  1000 0  0 
A  B  0  1000 1000 
B  A  1000 0  0 

:私は、ビューのテーブルに集約すると

GroupA GroupB Value1 Value2 Value3 
A  A  1000 0  0 
A  B  0  1000 0 
A  B  0  0  1000 
B  A  1000 0  0 

は、私のようなものを見たいですこれに取り組むのに役立ちます。どうすればいいですか最初に行をグループ化して、それらを処理関数に供給できますか?そこから、集約はかなり容易でなければなりません。

+0

Excelでテーブルを並べ替えることができます。 – Paparazzi

+0

サポートする必要のある集計タイプは何ですか?基本的なsum()などしかない場合は、ADOを使用してワークシートを照会し、 'GroupA [GroupA]、[GroupB]' –

+1

でピボットテーブルを使用していますか?そのような分析のために設計されたピボットテーブル。 – Fink

答えて

1

ここに、ADOを使用するアプローチがあります。 1つの条件は、ワークブックが保存されている必要があるということです.ADOには作業する道が必要です。

Sub SqlSummary() 

Dim oConn As New ADODB.Connection 
Dim oRS As New ADODB.Recordset 
Dim sPath, icount 
Dim f As ADODB.Field 
Dim sSQL As String 
Dim sRange1 As String 
Dim rngresults As Range 


    sSQL = " select a.[GroupA],a.[GroupB], sum(a.[Value1]) as [Value1], " & _ 
    " sum(a.[Value2]) as [Value2], sum(a.[Value3]) as [Value3] from <r1> a " & _ 
    " group by a.[GroupA], a.[GroupB] " 

    sRange1 = RangeName(shtData.Range("A1").CurrentRegion) 

    If ActiveWorkbook.Path <> "" Then 
     sPath = ActiveWorkbook.FullName 
    Else 
     MsgBox "Workbook being queried must be saved first..." 
     Exit Sub 
    End If 

    oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
       "Data Source=" & sPath & _ 
       ";Extended Properties='Excel 8.0;HDR=Yes'" 

    sSQL = Replace(sSQL, "<r1>", sRange1) 
    Debug.Print sSQL 
    oRS.Open sSQL, oConn 

    If Not oRS.EOF Then 

     shtDump.UsedRange.ClearContents 
     Set rngresults = shtDump.Range("A1") 
     icount = 0 
     For Each f In oRS.Fields 
      rngresults(1).Offset(0, icount).Value = f.Name 
      icount = icount + 1 
     Next f 
     rngresults(1).Offset(1, 0).CopyFromRecordset oRS 

    Else 

     MsgBox "No records found" 

    End If 

End Sub 

Function RangeName(r As Range) As String 
    RangeName = "[" & r.Parent.Name & "$" & _ 
       r.Address(False, False) & "]" 
End Function 
+0

私は自分のコーディングバッグに保存する素晴らしい方法+1 – brettdj

0

ここでは2007/10ではエクセル2010で生成されたピボットテーブルを使用すると、グループAは、以下の場合と同様に、ラベルは、行ごとに繰り返すことができます。 GroupAとGroupBは行フィールドとして設定され、残りは値フィールドとして設定されます。グランドトータルはオフになっています。ビューはクラシックピボットテーブルに設定されています:

enter image description here

+0

ピボットテーブルにカスタム列を作成することは可能ですか?つまり、値1と値2の合計ですか? – Kaisean

+0

はい、計算フィールドで行うことができます。可能であれば、私はソースデータ内でそれを計算し、その列をピボットオフするだけです。 –

+0

ピボットテーブルに関する質問:列ラベルがずらされているようにテーブルを作成して、 のようにすることはできますか?GroupA GroupB Value1 Value2 GroupC Value3 GroupD? – Kaisean

0

それはあなたが新しいシートにのみ、あなたのグループフィールドをコピーする場合は、Excel 2007のから削除重複ツール(利用可能なを使用して、1つの式を介してこれを行うことが可能です)を使用して、左記のユニークなレコードのみを再度リストアするようにします。次に、各値フィールドにこの式を追加します。

=SUMIFS(Sheet1!C:C,Sheet1!$A:$A,Sheet2!$A2,Sheet1!$B:$B,Sheet2!$B2) 
SUMIFS([sum_range],[criteria_range1],[criteria1],[criteria_range2],[criteria2]) 
+0

SumIfsは2007/10に利用可能です。以前のバージョンでは、代わりにSumProductを使用することができました。 –

関連する問題