Хотя явно не указано, можно легко предположить, что вы пытаетесь использовать VBA для повышения эффективности вычисления/пересчета формулы массива. Вы не указали объем (т. Е. количество строк), но маловероятно, что вам нужны полные ссылки на колонки, которые вы используете. Следующие времена цикла вычислений были основаны на ~ 1000 рядах статических данных.
Ваша формула массива:
=INDEX(C:C, MATCH(1, (O:O=O2)*(Y:Y=Y2)*(AA:AA=AA2)*(A:A<>A2), 0))
Прошедшее время, чтобы заполнить вниз и рассчитать: 24.828 секунды
Ваша формула массива с ссылками на столбцы усеченный фактических экстентов данных:
=INDEX($C$2:$C$999, MATCH(1, ($O$2:$O$999=O2)*($Y$2:$Y$999=Y2)*($AA$2:$AA$999=AA2)*($A$2:$A$999<>A2), 0))
Прошедшее время, чтобы заполнить вниз и рассчитать: 0,203 секунды
Сопоставимые стандартная формула со ссылками столбцов усекается до фактических экстентов данных:
=INDEX($C$2:$C$999, MIN(INDEX(ROW($1:$998)+(($A$2:$A$999=A2)+($O$2:$O$999<>O2)+($Y$2:$Y$999<>Y2)+($AA$2:$AA$999<>AA2))*1E+99, ,)))
Прошедшее время, чтобы заполнить вниз и рассчитать: 0,257 секунд
Как вы можете видеть, сокращение столбиковых ссылок на то, что на самом деле используется, значительно повышает эффективность. Формулы массивов обрабатывают, вычисляя все против всего остального. Расчетная нагрузка возрастает экспоненциально по мере увеличения количества строк, на которые ссылаются ячейки.
Если данные постоянно меняются, и вы не знаете, сколько строк вы будете иметь дело с, используйте именованные диапазоны с относится к:, которые определены динамически. Пример:
- Выберите столбец, который обычно определяет экстенты данных и учитывает характер данных. Этот метод немного отличается в зависимости от того, имеете ли вы дело с истинными числами или текстом.Для демонстрационных целей столбец C имеет номера.
- Выберите формулу ► Определенные имена ► Менеджер имен. Когда откроется диалоговое окно «Диспетчер имен», нажмите Новый.
- Введите дружественное название для диапазона в Имя: текстовое поле; например MyColAA. Lave Сфера применения: как рабочая тетрадь.
- Используйте следующую за Обозначает::
=$AA$2:INDEX($AA:$AA, MATCH(1e99, $C:$C))
Это будет определять myColAA в АА2 к строке, соответствующей последний номер в столбце C. Если в колонке C: C была полна текста значений Вас будет использоваться следующее:
=$AA$2:INDEX($AA:$AA, MATCH("zzz", $C:$C))
- Повторите для столбцов A: A, C: C, O: O и Y: Y. Сохраните использованную ссылку как столбец C: C, чтобы они всегда имели одинаковое количество строк, но изменяли другие ссылки на колонки и давали каждому новое имя.
- При создании всех названных диапазонов и обратно на лист, тест один, нажав F5 , набрав myColAA в Reference : текстовое поле и нажать кнопку OK .
Формула массива теперь будет выглядеть примерно так.
=INDEX(myColC, MATCH(1, (myColO=O2)*(myColY=Y2)*(myColAA=AA2)*(myColA<>A2), 0))
Названные диапазоны будут расти и сокращаться с объемом доступных данных.
Чтобы получить массив из листа Excel в переменную VBA, вы можете просто присвоить ему что-то вроде этого: aryArrayVariable() = Sheet1.Range («A1: Z100»). После этого вы можете перебирать массив и делать все, что захотите, и в конце писать на лист. Вы можете посмотреть этот сайт (и следующие пять частей) https://fastexcel.wordpress.com/2011/05/25/writing-efficient-vba-udfs-part-1/ – Ralph
Вы можете использовать функции поиска по массив таким же образом, как вы использовали бы их в листе. Например, WorksheetFunction.Match (ValueToLookFor, SomeArray, False), при условии, что SomeArray является двумерным. –
'Worksheet.Evaluate()' работает с формулами массива, поэтому вы можете использовать свою формулу почти как есть. –