Страница 1 из 1

Суммировать пока не "условие"

Добавлено: 26 мар 2011, 01:59
andrey_andrey
Добрый день
Помогите чайнику
Даны первые две колонки
по номеклатуре "а" было 3 продажи кол-вом 1,2,3. надо посчитать общее кол-во проданного товара по всем номенклатурам и получить итоговый столбец 3. Кол-во продаж может быть разное.
Заранее спасибо.

Первый столбец -
a


b




d

c
Второй столбец -
1
2
3
3
3
1
2
3
1
1
1
Третий столбец (который необходимо получить)
6


12




2

1

Re: Суммировать пока не "условие"

Добавлено: 27 мар 2011, 09:37
SAS888
Можно применить пользовательскую функцию

Код: Выделить всё

Function CountNom(Nom As String, rng As Range, Sales As Range) As Long
    Dim x As Range, i As Long
    If Nom = "" Then Exit Function
    Set x = rng.Find(what:=Nom, LookAt:=xlWhole)
    If x Is Nothing Then
        CountNom = 0
    Else
        i = x.End(xlDown).Row
        CountNom = Application.Sum(Intersect(Rows(x.Row & ":" & x.End(xlDown).Row - 1), Sales))
    End If
End Function
1-й аргумент - имя по номенклатуре (что ищем).
2-й аргумент - диапазон, содержащий эти имена.
3-й аргумент - диапазон суммирования.
Пример использования см. во вложении. 1-й аргумент можно задавать как ссылкой (см. формулу в ячейке "C1"), так и значением (см. формулу в ячейке "C4").

Re: Суммировать пока не "условие"

Добавлено: 27 мар 2011, 14:17
andrey_andrey
Вы просто мой спаситель!!!! Огромное спасибо!!!!
Завтра удивлю начальство)))

Re: Суммировать пока не "условие"

Добавлено: 27 мар 2011, 14:38
andrey_andrey
Правда возникли небольшие трудности, если по номенклатуре была одна продажа.
См. Книга1.xls

Re: Суммировать пока не "условие"

Добавлено: 28 мар 2011, 06:19
SAS888
Да. Вы правы. То, что по одной продаже может быть две номенклатуры подряд, этот момент функция не учитывала. Измените ее на следующую:

Код: Выделить всё

Function CountNom(Nom As String, rng As Range, Sales As Range) As Long
    Dim x As Range, i As Long
    If Nom = "" Then Exit Function
    Set x = rng.Find(what:=Nom, LookAt:=xlWhole)
    If x Is Nothing Then
        CountNom = 0
    Else
        i = IIf(x.Offset(1) = "", x.End(xlDown).Row, x.Offset(1).Row)
        CountNom = Application.Sum(Intersect(Rows(x.Row & ":" & i - 1), Sales))
    End If
End Function

Re: Суммировать пока не "условие"

Добавлено: 28 мар 2011, 22:37
andrey_andrey
Спасибо огромное, все работает как часы))) Надо потихоньку осваивать VBA. Чтобы я без Вас делал?))