Страницы: 1
RSS
Не работает функция Application.CountIfs внутри массива
 
Ребят, полдня туплю жёстко над тем, как в массив засунуть формулу CountIfs (СЧЁТЕСЛИМН).

Вообщем суть такая: надо формулу СЧЁТЕСЛИМН засунуть в VBA и при этом именно в массив, т.к. там расчёт куда быстрее производится (у меня объём строк до 900 000). Макрос сначала определяет последние строки и столбцы в таблице (strcount, colcount), потом загоняет лист в массив (r_data), и дальше циклом прогоняет формулы по всей длине массива.

С первыми двумя формулами всё ок (DatePart), там расчёт именно в массиве производится, и ошибок нет.
А вот дальше (Application.CountIfs) пошли проблемы. Синтаксис формулы такой: Application.CountIfs (Arg(1),agr(2), arg(3)...)

Через Range и Cells всё проще, здесь всё работает:
Код
Cells(i, 62) = Application.CountIfs(Range("AO:AO"), Range("AO" & i), Range("AH:AH"), Range("AH" & i), Range("C:C"), Range("C" & i))
Однако надо чтобы расчёт был без обращения к ячейке, а именно к массиву, чтобы быстрее считалось. Вот хз как это сделать... Может кто сталкивался с подобным?

Код
 Sub test()

    Dim r_data As Variant
    Dim strcount, colcount As Long
    
    strcount = Cells(Rows.Count, 41).End(xlUp).Row
    colcount = Cells(1, Columns.Count).End(xlToLeft).Column
    
    r_data = Range(Cells(1, 1), Cells(strcount, colcount))

    For i = 2 To strcount
        r_data(i, 1) = DatePart("ww", r_data(i, 5), vbMonday)
        r_data(i, 2) = DatePart("d", r_data(i, 5)) & "." & DatePart("m", r_data(i, 5)) & "." & DatePart("yyyy", r_data(i, 5))
        
        r_data(i, 62) = Application.CountIfs(r_data(2, 41), r_data(2, strcount), r_data(i, 41), _
            r_data(2, 34), r_data(strcount, 34), r_data(i, 34), r_data(2, 3), r_data(strcount, 3), r_data(i, 3))
    Next i

End Sub

Изменено: antontanachev - 30.07.2019 12:56:55 (Приложил пример, и предложил название темы: Не работает функция Application.CountIfs внутри массива)
 
Файл-пример в студию. Как есть - Как надо
Согласие есть продукт при полном непротивлении сторон
 
Пример приложил
 
Я так понимаю в файле Как есть. А где Как надо? Какова логика? Опишите обычными словами, без привязки к формулам
Согласие есть продукт при полном непротивлении сторон
 
Логика такая: нужно посчитать кол-во строк которые удовлетворяют нескольким критериям. Критерии - это столбцы C, AH, AO. Т.е. берём весь столбец C до последней строки и считаем по этому же столбцу кол-во совпадений по каждой строке. Потом берём столбец AH и делаем тоже самое. Далее AO по тому же принципу. И в итоге в нужную ячейку у нас считается кол-во строк которые удовлетворяют 3-ём критериям. Другими словами это логика формулы СЧЁТЕСЛИМН
 
Цитата
antontanachev написал:
Однако надо чтобы расчёт был без обращения к ячейке, а именно к массиву, чтобы быстрее считалось.
а есть уверенность, что будет быстрее? Да и сомнения у меня в применимости CountIfs, так как она в качестве аргументов, где ищем, ждет вроде не массив, а диапазон.
По вопросам из тем форума, личку не читаю.
 
Ну расчеты в массиве идут куда быстрее чем без массива. Я хочу весь лист засунуть в массив, там произвести расчеты, а потом готовый лист тупо скопировать из массива в новую книгу. Сейчас по формулам VBA у меня просчет недельного отчета занимает минимум 1 час
Страницы: 1
Наверх