Страницы: 1
RSS
Суммирование по двум критериям с помощью VBA
 
Здравствуйте!

Как, с помощью VBA, можно суммировать  по двум условиям.
Можно как-то с помощью Словарей ("scripting.dictionary"), или есть другие, более быстрые, способы (массыви, или не знаю...)?

Детально росписано в прикреплённом файле.

Спасибо ВСЕМ за ответы!
 
И Вам здравствовать.
Пока программисты молчат, вставлю свои пять копеек в тему. Возможной причиной торможения может быть то, что Вы в качестве аргументов для функции указываете весь столбец. Попробуйте ограничить каким-то диапазоном. Например А1:А1000. Или используйте Динамический диапазон с автоподстройкой размеров или Умные таблицы Excel 2007-2013
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Соглашусь с
Цитата
Bema написал:
Попробуйте ограничить каким-то диапазоном
но если вам все таки нужен макрос, то пробуйте:
Код
Sub Sum_Ifs()
    Dim iSum As Object
    Dim Arr1(), Arr2(), i&
    Arr1 = Worksheets(1).Range("A1").CurrentRegion.Value
    Arr2 = Worksheets(2).Range("A1").CurrentRegion.Value
    Set iSum = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(Arr2)
        iSum.Item(Arr2(i, 1)) = 0
    Next i
    For i = 2 To UBound(Arr1)
        If iSum.exists(Arr1(i, 2)) Then
            If Arr1(i, 3) Like "*Ðîá*" Then
                iSum.Item(Arr1(i, 2)) = iSum.Item(Arr1(i, 2)) + Arr1(i, 4)
            End If
        End If
    Next i
    For i = 2 To UBound(Arr2)
        Arr2(i, 2) = iSum.Item(Arr2(i, 1))
    Next
    Worksheets(2).Range("A1").CurrentRegion.Value = Arr2
End Sub
 

Михаил Витальевич С.,  - Большое Спасибо за помощь! Всё работает.
Bema, Спасибо за подсказку
 
Здравствуйте! Ребята, не могу понять, почему не коректно работает концовка макроса:
Код
Sh_Klientu.Range("C2").Resize(UBound(dx) + 1).Value = dx ' эта строка почему-то заполняет диапазон одинаковими числами.

а если заменить циклом эту строку кода - тогда числа заполняются правильно, но очень медленно на большом диапазоне.

Код
For n = 0 To UBound(dx)      
   Sh_Klientu.Range("C" & n + 2).Value = dx(n)
Next

Я хочу научится работать со словарями и массивами, и по информации из интернета этот кусочек кода должен работать, но у меня не считает правильно.
Не могу понять причины, - подскажите, пожалуйста, что я делаю не так.
Спасибо!
 
Код
Sh_Klientu.Range("C2").Resize(UBound(dx) + 1).Value = Application.Transpose(dx)
 
k61, как всё просто, огромное ВАМ СПАСИБО!!!
Страницы: 1
Наверх