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

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
andrey_andrey
Сообщения: 4
Зарегистрирован: 26 мар 2011, 01:50

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

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


b




d

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


12




2

1
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

Можно применить пользовательскую функцию

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

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").
andrey_andrey
Сообщения: 4
Зарегистрирован: 26 мар 2011, 01:50

Вы просто мой спаситель!!!! Огромное спасибо!!!!
Завтра удивлю начальство)))
andrey_andrey
Сообщения: 4
Зарегистрирован: 26 мар 2011, 01:50

Правда возникли небольшие трудности, если по номенклатуре была одна продажа.
См. Книга1.xls
Вложения
Книга1..zip
(9.46 КБ) 54 скачивания
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

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

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

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
andrey_andrey
Сообщения: 4
Зарегистрирован: 26 мар 2011, 01:50

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