Ребят, полдня туплю жёстко над тем, как в массив засунуть формулу CountIfs (СЧЁТЕСЛИМН).
Вообщем суть такая: надо формулу СЧЁТЕСЛИМН засунуть в VBA и при этом именно в массив, т.к. там расчёт куда быстрее производится (у меня объём строк до 900 000). Макрос сначала определяет последние строки и столбцы в таблице (strcount, colcount), потом загоняет лист в массив (r_data), и дальше циклом прогоняет формулы по всей длине массива.
С первыми двумя формулами всё ок (DatePart), там расчёт именно в массиве производится, и ошибок нет. А вот дальше (Application.CountIfs) пошли проблемы. Синтаксис формулы такой: Application.CountIfs (Arg(1),agr(2), arg(3)...)
Через Range и Cells всё проще, здесь всё работает:
Однако надо чтобы расчёт был без обращения к ячейке, а именно к массиву, чтобы быстрее считалось. Вот хз как это сделать... Может кто сталкивался с подобным?
Код
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
Логика такая: нужно посчитать кол-во строк которые удовлетворяют нескольким критериям. Критерии - это столбцы C, AH, AO. Т.е. берём весь столбец C до последней строки и считаем по этому же столбцу кол-во совпадений по каждой строке. Потом берём столбец AH и делаем тоже самое. Далее AO по тому же принципу. И в итоге в нужную ячейку у нас считается кол-во строк которые удовлетворяют 3-ём критериям. Другими словами это логика формулы СЧЁТЕСЛИМН
antontanachev написал: Однако надо чтобы расчёт был без обращения к ячейке, а именно к массиву, чтобы быстрее считалось.
а есть уверенность, что будет быстрее? Да и сомнения у меня в применимости CountIfs, так как она в качестве аргументов, где ищем, ждет вроде не массив, а диапазон.
Ну расчеты в массиве идут куда быстрее чем без массива. Я хочу весь лист засунуть в массив, там произвести расчеты, а потом готовый лист тупо скопировать из массива в новую книгу. Сейчас по формулам VBA у меня просчет недельного отчета занимает минимум 1 час