Подсчитайте уникальные значения, если критерии выполнены - PullRequest
2 голосов
/ 03 мая 2020

Таблица Excel:

            A              B           C         D         E
    1   Products         Sales       Count:      1
    2   Product_A         500       
    3   Product_A         400       
    4   Product_A           
    5   Product_B         200       
    6   Product_B           
    7   Product_C           
    8   Product_C           
    9   Product_C   
   10
   11

В приведенной выше таблице Excel у меня есть список products и их sales.
Как видите, products может появляться в списке несколько раз, и не каждая запись имеет sale, что вызывает empty cells в Column B.

Теперь я хочу посчитать unqiue products, которые вообще не имеют продажи.
В приведенном выше случае это будет только Product_C, поскольку у других products есть хотя бы одна продажа в Column B.
Следовательно, ожидаемый результат в Cell D1 равен 1.

Итак, я дошел до этой формулы:

=COUNTIFS(B2:B9,"<>"&"")

Тем не менее, он считает все "" в Column B без проверки, есть ли в product запись не-emtpy где-то еще в списке.

Ты хоть представляешь, как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 03 мая 2020

Если бы у вас был Excel O365, вы можете попробовать:

=COUNTA(UNIQUE(FILTER(A2:A9,COUNTIFS(A2:A9,A2:A9,B2:B9,">0")=0)))
1 голос
/ 03 мая 2020

Уникальный счетчик нулей

Если у вас нет аллергии c на VBA, вот гибкий UDF. Строки 1-3 показывают, что достаточно выбрать любую ячейку в качестве второго аргумента, если она находится в столбце Sales. Строки 4-5 показывают, что то же самое недопустимо для столбца Products. Если для третьего аргумента установлено значение TRUE, строки 6-8 показывают, что разрешено указывать столбец Products, используя только ячейку, если она проверяется первой. Строка 8 показывает, как Product_D не учитывается. Строка 9 показывает поведение вне границ (0).

enter image description here

Option Explicit

Function Unique0Count(UniqueRange As Range, ValueRange As Range, _
  Optional calculateLastCell As Boolean = False) As Long

    Dim dict As Object      ' Dictionary Object
    Dim Key As Variant      ' Dictionary Key (For Each Control Variable)
    Dim rng As Range        ' Unique Range, Unique Last Cell Range,
                            ' Value Range
    Dim Unique As Variant   ' Unique Array
    Dim Value As Variant    ' Value Array
    Dim i As Long           ' Unique/Value Array Elements (Rows) Counter

    ' Write values from Unique Range to Unique Array.
    If Not calculateLastCell Then
        Set rng = UniqueRange.Columns(1)
    Else
        Set rng = Columns(UniqueRange.Column).Find(What:="*", _
          LookIn:=xlFormulas, SearchDirection:=xlPrevious)
        If rng Is Nothing Then Exit Function ' No data in column.
        If rng.Row < UniqueRange.Row Then Exit Function
        Set rng = Range(UniqueRange.Cells(1), rng)
    End If
    Unique = rng
    ' Write values from Value Range to Value Array.
    Set rng = Cells(rng.Row, ValueRange.Column).Resize(rng.Rows.Count)
    Value = rng

    ' Create a reference to the Dictionary Object(Late Binding).
    Set dict = CreateObject("Scripting.Dictionary")
    ' Loop through elements (rows) of Unique Array.
    For i = 1 To UBound(Unique)
        ' Check if value in current row of Source Array is NOT "".
        If Unique(i, 1) <> "" Then
            ' Write values of Unque Array to the Key of the Dictionary
            ' and sum the corresponding values of Value Array for each
            ' unique element to the Dictionary.
            dict(Unique(i, 1)) = dict(Unique(i, 1)) + Value(i, 1)
        End If
    Next

    ' Calculate the number of items containing value 0.
    For Each Key In dict.keys
        If dict(Key) = 0 Then Unique0Count = Unique0Count + 1
    Next Key

End Function
1 голос
/ 03 мая 2020

В D1, формула массива (подтверждается нажатием Ctrl + Shift + Enter):

=SUM(--(FREQUENCY(IF(0+(COUNTIFS(A2:A9,A2:A9,B2:B9,"<>")=0),MATCH(A2:A9,A2:A9,0)),ROW(A2:A9)-ROW(A1))>0))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...