2013-09-27 2 views
0

У меня есть большой цикл, который выполняет итерацию более 1000 данных. Вместо того, чтобы делать это как можно эффективнее (сохранение вывода в массив, а затем печать в конце), я был записывая значения в рабочий лист, а затем копируя и вставляя на другой лист для каждого прогона.как написать формулу как функцию рабочего листа

У меня есть пара вопросов, как теоретических, так и практических.

  1. ли быстрее продолжать копировать/вставить для каждой строки, кроме этого в течение текущего рабочего листа, а затем скопировать и вставить окончательную таблицу данных в самом конце?

  2. Как я могу переписать эту функцию как формулу рабочего листа. Причина, по которой я в настоящее время не использую массив, я не знаю, как переписать эту формулу как формулу non cell.

Dim avg_rng As Range 
Set avg_rng = Sheets("OrdCloseTrade").Range(Cells(strt_pt(end_ct), j), Cells(end_pt(end_ct) - 
1, j)) 
'Debug.Print sum_rng 

Sheets("OrdCloseTrade").Cells(47, lent + 2).FormulaArray = _ 
"=AVERAGE(IF(ISNUMBER(" & avg_rng.Address & ")," & avg_rng.Address & "))" 
+0

что вы хотите вывод, что UDF (определяемые пользователем функции) быть? – sam092

+0

avg_rng - это диапазон чисел и потенциально ошибки #VALUE. Я хочу написать функцию, подобную этой функции массива, которая будет выполняться и сохраняться внутри, не записывая на лист. Я думаю, что это заставит программу работать быстрее. Выход должен быть средним по диапазону, исключая значения ошибок. – googlekid

+0

также по функции Я имел в виду .FormulaArray .... не отдельная функция VBA – googlekid

ответ

0

Не совсем понял ваш первый вопрос.

Но чем меньше операций копирования и вставки, тем быстрее выполняется выполнение.

Для второго вопроса, возможно, следующее может дать вам подсказку.

Function avgVal(ByVal rng As Range) 
    avgVal = Application.Evaluate("=average(if(isnumber(" & rng.Address & ")," & rng.Address & "))") 
End Function 

Функция принимает диапазон в качестве аргумента и выводит среднее значение. Таким образом, вы можете использовать его в клетке, вызвав

=avgVal(A1:D1), например

+0

ok awesome ... да, это именно то, что я искал. «Оценить» – googlekid

+0

будет ли это работать для формулы массива? – googlekid

+0

Я попытался положить 3 в A1, 4 в B1 #REF! в C1 и 9 в D1 , наконец, E1: '= avgVal (A1: D1)' дает 5.5333 , поэтому кажется, что все в порядке – sam092

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