2016-09-17 8 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

Хотя это, в конечном счете, возможно с помощью сложной и расчетной формулы массива, для всех целей и задач вы действительно пытаетесь выполнить оператор SELECT базы данных с помощью агрегатных предложений SUM, GROUP BY и ORDER BY. Нечто подобное,

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; 

Я хотел бы предложить процедуру суб VBA с использованием ADODB.Connection на лист, который может произвести результаты, которые вы пытаетесь достичь. Следующий код является подробным и может быть немного сокращен, но каждый аспект операции обрабатывается и должен быть понятным или легко исследоваемым.

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

Название Колонка C в Total.Weight и ввести эту формулу в C2:C11:

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

Затем с ожидаемыми результатами, расположенных на F2:G11 ввести эти формулы:

В F2:F11:

В 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

 Смежные вопросы

  • Нет связанных вопросов^_^