Использование SUMIF для получения списка условий - PullRequest
0 голосов
/ 05 февраля 2019

Попытка использовать SUMIF для группировки данных по классу:

У меня есть набор данных, который выглядит следующим образом:

dataset

У меня также есть список свойств:

properties

Теперь я хочу сумму Class A Class B & Class C со временем.

Таким образом, в новом столбце (Cell I2) я набрал формулу: =SUMIF($B$1:$H$1,$N$2:$N$8,$B2:$H2), и результат должен быть 116, но это не так?

excel doc

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Безумие пяти диапазонов

enter image description here

В Excel

В ячейке I2 используйте следующую формулу:

=SFive($B2:$H2,$B$1:$H$1,$N$2:$N$8,$I$1:$K$1,$O$2:$O$8)

и скопируйте / вставьте туда, где вам нужно.

В VBA

Function SFIVE(SumRange As Range, CompanyH As Range, CompanyV As Range, _
        ClassH As Range, ClassV As Range) As Double ' As Long if whole numbers.

    Dim vntSumH As Variant    ' Horizontal Sum Array
    Dim vntCompH As Variant   ' Horizontal Company Array
    Dim vntCompV As Variant   ' Vertical Company Array
    Dim vntClassH As Variant  ' Horizontal Class Array
    Dim vntClassV As Variant  ' Vertical Class Array
    Dim strClass As String    ' Current Class
    Dim strCompany As Variant ' Current Company

    Dim j As Long   ' Horizontal Class Range Column Counter
    Dim i As Long   ' Vertical Class and Vertical Company Array Row Counter
    Dim k As Long   ' Horizontal Company and Sum Array Row Counter

    vntSumH = SumRange    ' Copy Horizontal Sum Range to array.
    vntCompH = CompanyH   ' Copy Horizontal Company Range to array.
    vntCompV = CompanyV   ' Copy Vertical Company Range to array.
    vntClassH = ClassH    ' Copy Horizontal Class Range to array.
    vntClassV = ClassV    ' Copy Vertical Class Range to array.

    ' Loop through columns of Horizontal Class Range.
    For j = 1 To ClassH.Columns.Count
        ' Check column of "Input Cell" against column of Horizontal Class Range.
        If Application.ThisCell.Column = ClassH.Column + j - 1 Then
            ' Assign only Class (last character) to Current Class.
            strClass = Right(vntClassH(1, j), 1)
            ' Loop through rows of Vertical Class (Company) Array.
            For i = 1 To UBound(vntClassV)
                ' Check if value of current row in Vertical Class Array
                ' is equal to Current Class.
                If vntClassV(i, 1) = strClass Then
                    ' Assign value of current row in Vertical Company Array
                    ' to Current Company.
                    strCompany = vntCompV(i, 1)
                    ' Loop through columns of Horizontal Company (Sum) Array.
                    For k = 1 To UBound(vntCompH, 2)
                        ' Check if value of current column in Horizontal
                        ' Company Array is equal to Current Company.
                        If vntCompH(1, k) = strCompany Then
                            ' Check if current column in Sum Array contains
                            ' a number.
                            If IsNumeric(vntSumH(1, k)) Then
                                ' Add value of current column in Sum Array
                                ' to SFIVE.
                                SFIVE = SFIVE + vntSumH(1, k)
                            End If
                            ' If you will allow multiple occurrences of
                            ' a Company in Horizontal Company Array (Range),
                            ' you will have to outcomment the following
                            ' "Exit For" line.
                            Exit For
                        End If
                    Next
                End If
            Next
            Exit For ' Stop searching because these are unique values.
        End If
    Next

End Function
0 голосов
/ 05 февраля 2019

Измените метки в ячейках I1 на K1, чтобы они были просто A, B и C.

Затем вы можете использовать в ячейке I2

=SUMPRODUCT($B2:$H2,--(INDEX($O$2:$O$8,MATCH($B$1:$H$1,$N$2:$N$8,0))=I$1))

Копировать поперек и вниз.Этот подход работает в Excel 365 с новыми функциями динамического массива, которые в настоящее время доступны только для версий Insider.Доказательство на этом скриншоте:

Для более старых версий Excel будет проще всего вставить строку под названием компании и добавить туда класс.Тогда вы можете использовать простую формулу Sumif of Sumifs.Вот формула Sumifs, используемая на скриншоте с Excel 2010:

=SUMIFS($B3:$H3,$B$2:$H$2,I$1)

enter image description here

Редактировать два : кредит Тиму Хенгу запредоставив эту формулу, чтобы перейти в ячейку I2, скопируйте ее вниз и вниз.Работает в любой версии Excel.

=SUMPRODUCT(($B$1:$H$1=$N$2:$N$8)*($O$2:$O$8=I$1)*$B2:$H2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...