2016-09-17 110 views
-2

尋找Excel數組公式將每個「代碼」的「權重」加總並按權重順序對「代碼」進行排序。Excel數組公式爲條件求和然後排序

| A | B | C | D | E | 
|1 | Code | Weight |  | Code |TotWeight| 
|2 | 444 | 30 |  | 444 | 50 | 
|3 | 333 | 10 |  | 222 | 40 |  
|4 | 222 | 10 |  | 333 | 40 | 
|5 | 444 | 10 |  | 555 | 20 |   
|6 | 444 | 10 | 
|7 | 222 | 30 | 
|8 | 333 | 20 | 
|9 | 555 | 20 | 
|10| 333 | 10 | 

列A和B是輸入,D和E是輸出。

回答

0

雖然這可能最終是一個複雜的計算密集型數組公式,但對於所有意圖和目的,您真的試圖用SUM,GROUP BY和ORDER BY子句來實現數據庫SELECT語句。喜歡的東西,

SELECT code, weight FROM 
(SELECT cw.code, Sum(cw.weight) AS weight 
    FROM tblCodeWeights AS cw 
    GROUP BY cw.code) 
ORDER BY weight DESC, code; 

我會建議利用ADODB.Connection到能產生你想要達到的結果工作表中的VBA子過程。下面的代碼是詳細的,可能會稍微修剪一下,但操作的每個方面都要處理,應該是不言自明的或易於研究的。

Option Explicit 

Sub sortedFilteredSums() 
    Dim cnx As Object, rs As Object 
    Dim sWS1 As String, sWB As String, sCNX As String, sSQL As String 
    Dim ws1TBLaddr As String 

    With Worksheets("Sheet8") 
     ws1TBLaddr = .Cells(1, 1).CurrentRegion.Address(0, 0) 
     sWS1 = Worksheets("Sheet8").Name 
    End With 

    sWB = ThisWorkbook.FullName 
    sCNX = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sWB _ 
     & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 
    Debug.Print sCNX 

    Set cnx = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 

    cnx.Open sCNX 

    sSQL = "SELECT [code], [weight] FROM (" 
    sSQL = sSQL & " SELECT cw.[code], SUM(cw.[weight]) AS [weight]" 
    sSQL = sSQL & " FROM [" & sWS1 & "$" & ws1TBLaddr & "] cw" 
    sSQL = sSQL & " GROUP BY cw.code" 
    sSQL = sSQL & ") ORDER BY [weight] DESC, [code]" 

    Debug.Print sSQL 
    'SELECT code, weight FROM 
    ' (SELECT cw.code, Sum(cw.weight) AS weight 
    ' FROM tblCodeWeights AS cw 
    ' GROUP BY cw.code) 
    'ORDER BY weight DESC, code; 

    rs.Open sSQL, cnx 

    With Worksheets("Sheet8") 
     .Range("D1").Resize(1, 2) = Array("code", "totweight") 
     .Range("D2").CopyFromRecordset rs 
    End With 

    rs.Close: Set rs = Nothing 
    cnx.Close: Set cnx = Nothing 

End Sub 

請注意,這不能在尚未保存的工作簿上執行;例如而不是在一個新的無標題的工作簿上。你的結果應該類似於以下內容。

sum_group_order

用於該實施例的測試工作簿是暫時購自:

ADO Select Sum Group By.xlsb

+0

謝謝。我正在使用不使用任何VBA的解決方案。 – Sammy

0

如@Jeeped該請求解釋是相當複雜的。 但是,它可以通過使用工作列的公式來實現。

假設您的數據位於A1:B11

標題列CTotal.WeightC2:C11輸入公式:

=IF(COUNTIF($A$1:$A2,$A2)>1,"", SUMIF($A$1:$A$11,$A2,$B$1:$B$11))

與位於 F2:G11預期的結果

然後輸入以下公式:

F2:F11=IF(EXACT($G2,""),"",INDEX($A$1:$A$11,MATCH($G2,$C$1:$C$11,0)))

G2:G11=IFERROR(LARGE($C$1:$C$11,COUNTA($F$1:$F1)),"")

Fig.1 圖1

上述用於在問題中提供的數據工作的公式。

但是,如果有代碼具有相同的總重量,則需要額外的工作列。

標題欄D作爲Rank並輸入此公式來排序總重量(見圖。2):

D2:D11

=IFERROR(RANK.EQ($C2,$C$2:$C$11, 0) +COUNTIF($D$1:$D1,RANK.EQ($C2,$C$2:$C$11, 0)),"")

而公式在F2:G11應該是這些:

F2:F11=IFERROR(INDEX($A$1:$A$11,MATCH(COUNTA($F$1:$F1),$D$1:$D$11,0)),"")

G2:G11=IF(EXACT($F2,""),"",SUMIF($A$1:$A$11,$F2,$B$1:$B$11))

enter image description here 圖2