2015-04-27 2 views
1

В настоящее время я использую формулу массива в своих данных, чтобы найти строку, в которой столбцы O, Y и AA соответствуют текущей строке и где значение столбца A не соответствует, и возвращает столбец C для соответствующая строка.Код, эквивалентный формуле массива

Вот моя формула:

=INDEX(C:C,MATCH(1,(O:O=O2)*(Y:Y=Y2)*(AA:AA=AA2)*(A:A<>A2),0)) 

Использование именованных диапазонов Я был в состоянии ввести эту формулу с помощью VBA, но то, что я действительно хочу сделать, это использовать VBA для выполнения подобной функции и записать полученное значение в столбце D.

Я имею в виду, что, возможно, петлю, для каждого I от 2 до последней строки, найти другую строку в пределах диапазона, который соответствует и писать ячейку (строку, которая была найдена,). значение для ячейки (i,), но я не знаю, синтаксис для массива VBA, чтобы найти соответствующую строку.

+0

Чтобы получить массив из листа Excel в переменную VBA, вы можете просто присвоить ему что-то вроде этого: aryArrayVariable() = Sheet1.Range («A1: Z100»). После этого вы можете перебирать массив и делать все, что захотите, и в конце писать на лист. Вы можете посмотреть этот сайт (и следующие пять частей) https://fastexcel.wordpress.com/2011/05/25/writing-efficient-vba-udfs-part-1/ – Ralph

+0

Вы можете использовать функции поиска по массив таким же образом, как вы использовали бы их в листе. Например, WorksheetFunction.Match (ValueToLookFor, SomeArray, False), при условии, что SomeArray является двумерным. –

+0

'Worksheet.Evaluate()' работает с формулами массива, поэтому вы можете использовать свою формулу почти как есть. –

ответ

0

Хотя явно не указано, можно легко предположить, что вы пытаетесь использовать 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 секунд


Как вы можете видеть, сокращение столбиковых ссылок на то, что на самом деле используется, значительно повышает эффективность. Формулы массивов обрабатывают, вычисляя все против всего остального. Расчетная нагрузка возрастает экспоненциально по мере увеличения количества строк, на которые ссылаются ячейки.

Если данные постоянно меняются, и вы не знаете, сколько строк вы будете иметь дело с, используйте именованные диапазоны с относится к:, которые определены динамически. Пример:

  1. Выберите столбец, который обычно определяет экстенты данных и учитывает характер данных. Этот метод немного отличается в зависимости от того, имеете ли вы дело с истинными числами или текстом.Для демонстрационных целей столбец C имеет номера.
  2. Выберите формулу ► Определенные имена ► Менеджер имен. Когда откроется диалоговое окно «Диспетчер имен», нажмите Новый.
  3. Введите дружественное название для диапазона в Имя: текстовое поле; например MyColAA. Lave Сфера применения: как рабочая тетрадь.
  4. Используйте следующую за Обозначает::

    =$AA$2:INDEX($AA:$AA, MATCH(1e99, $C:$C))

    Это будет определять myColAA в АА2 к строке, соответствующей последний номер в столбце C. Если в колонке C: C была полна текста значений Вас будет использоваться следующее:

    =$AA$2:INDEX($AA:$AA, MATCH("zzz", $C:$C))
  5. Повторите для столбцов A: A, C: C, O: O и Y: Y. Сохраните использованную ссылку как столбец C: C, чтобы они всегда имели одинаковое количество строк, но изменяли другие ссылки на колонки и давали каждому новое имя.
  6. При создании всех названных диапазонов и обратно на лист, тест один, нажав F5 , набрав myColAA в Reference : текстовое поле и нажать кнопку OK .

Формула массива теперь будет выглядеть примерно так.

=INDEX(myColC, MATCH(1, (myColO=O2)*(myColY=Y2)*(myColAA=AA2)*(myColA<>A2), 0)) 

Названные диапазоны будут расти и сокращаться с объемом доступных данных.

+0

Вы правильно определили, что я ищу, чтобы выполнить расчет. Что еще более важно, я уже использовал vba для ввода этой формулы, но оставление формулы массива делает Excel чрезвычайно медленным при работе с большими наборами данных. Я уже использую именованные диапазоны в моей формуле, которые также динамически определяются, чтобы включать все непустые ячейки, я просто не хотел ставить свои диапазоны имен здесь по соображениям конфиденциальности. Я закончил тем, что вставлял формулу так же, как и я, а затем оценивал весь столбец следующим образом: с столбцами («D») .value = .value Спасибо за вашу помощь. – DGy

Смежные вопросы