Страницы: 1
RSS
Функция Average в пользовательской функции
 
Здравствуйте!
В приведенном коде интересует вторая строчка
Код
Public Function СРЕДГРУПП(f, v, g)
СРЕДГРУПП = .Average(.Index(f, v.Row * g - (g - 1)), .Index(f, v.Row * g))
End With
End Function 
Я там использую функцию Average. Но между двумя аргументами стоит запятая. Это значит, что функция считает среднее только между двумя числами. Однако если я ставлю двоеточие, чтобы посчитать среднее по всему диапазону, то мне выдается ошибка "Expected list separator or )"
Как в моем коде посчитать среднее по всему диапазону?

Спасибо!
 
Лучше привести пример полностью. И написать для чего вообще эта функция, возможно и писать-то ее не надо и она есть в стандартном наборе.

P.S. Где начало оператора With?
 
  • Аргументы могут быть числами, именами или ссылками на диапазоны или ячейки, содержащие числа.
 
justirus, виновата, затерла лишнюю строчку
Код
Public Function СРЕДГРУПП(f, v, g)

With Application.WorksheetFunction
СРЕДГРУПП = .Average(.Index(f, v.Row * g - (g - 1)), .Index(f, v.Row * g))
End With
End Function
Эта функция считает среднее значение по группам. Например, размер группы =4. То есть, сначала функция считает среднее с 1 по 4 ячейку, потом с 5 по 8 и так далее.

Вообще, функция моя пишется для следующей формулы
СУММ(ИНДЕКС(A$1:A$20;СТРОКА(G1)*4-3):ИНДЕКС(A$1:A$20;СТРОКА(G1)*4))
В моей функции f - это целый диапазон, v - просто скользящая строка, которая начинается с первой строчки диапазона f, а g- величина окна по усреднению.

Но вряд ли это так важно, когда вопрос касается только для .Average.. как охватить весь диапазон?
Изменено: Oda412 - 19.06.2014 13:23:01
 
Недостаточно контекста, выложи пример excel, т.е. табличку в которой хочешь посчитать, исходные данные и как должно быть(без формул).

Неохота ломать голову над созданием велосипеда, возможно по твоей задаче есть более простой способ решения.
 
"выложи", "хочешь", "твоей" - justirus, Вы знакомы с автором темы?
 
justirus, я уже решила свою задачу, вопрос только в Average.
Хорошо, поставлю вопрос по-другому. Возьмем простой пример функции

Код
Public Function СРЕДНЕЕ(f, g)
With Application.WorksheetFunction
СРЕДНЕЕ = .Average(f, g)
End With
End Function
 
Где из приведенного файла "Пример1" f - это ячейка А1, а g - ячейка А9
Моя функция СРЕДНЕЕ работает как среднее между первым и последним элементом, а не среднее всего диапазона...
А если я в строчке СРЕДНЕЕ между аргументами пишу двоеточие, вылезает вышеупомянутая ошибка...
Вопрос, как при помощи макроса посчитать среднее по всему диапазону?
Изменено: Oda412 - 19.06.2014 13:39:24
 
Не очень понимаю проблему - указываем диапазон:
Код
Sub TestAverage()
    MsgBox Application.WorksheetFunction.Average(Range("A1:A9"))
End Sub

 
 
Юрий М, да, а как же связать Ваш код с аргументами моей функции f и g?
Изменено: Oda412 - 19.06.2014 13:52:03
 
Цитата
Юрий М пишет: Вы знакомы с автором темы?
в обращении на "ты" не вижу оскорбления, панибратства и т.п., а вижу дружеское отношение. Это уже оффтоп на тему этики и ее современное трактование. Прошу меня ругать, только если поступит жалоба)))
 
justirus, здесь принято к незнакомым людям обращаться на ВЫ.
 
С переменными:
Код
Sub TestAverage()
Dim f As String, g As String
    f = Cells(1, 1).Address
    g = Cells(9, 1).Address
    MsgBox Application.WorksheetFunction.Average(Range(f & ":" & g))
End Sub
 
В ячейку пишется:
Код
=СРЕДНЕЕ(A1:A9)
В коде:
Код
Public Function СРЕДНЕЕ(f)
With Application.WorksheetFunction
СРЕДНЕЕ = .Average(f)
End With
End Function 
 
Юрий М, Вы здесь прописываете вручную ячейки. А в своей функции СРЕДНЕЕ предполагается, что каждый раз диапазон, по которому надо посчитать среднее, будет разным.
Вообще, вопрос относился к четвертому посту, где изначальная и конечная ячейки диапазона рассчитываются по-хитрому. Но между ними стоит запятая, поэтому среднее считается только по этим двум значениям. А хотелось, чтобы среднее считалось по всему диапазону..

я уже диапазон создавала отдельно такой:

Код
 d = Range(.Index(f, v.Row * g - (g - 1)), .Index(f, v.Row * g))  
СРЕДНЕЕ = .Average(d)
Но результат все тот же. В Range, видимо, тоже надо двоеточие писать, но оно тоже выдает ошибку
То есть, .Index(f, v.Row * g - (g - 1)) - это первая ячейка диапазона, а .Index(f, v.Row * g) - последняя. Я не знаю, что между ними поставить, чтобы посчитать среднее по всем элементам диапазона между ними...   :cry:
Изменено: Oda412 - 19.06.2014 14:08:47
 
А f и g - что за переменные у Вас: какой у них тип? И почему их нельзя связать через двоеточие, как у меня?
 
Юрий М, f и g - в упрощенной версии кода это ссылка на первую и последнюю ячейки диапазона. Тип по умолчанию Variant
То есть, когда я в рабочем листе набираю = СРЕДНЕЕ(А1;А9), у меня считается среднее только по этим двум ячейкам

Затем Вы в своем примере выводите на экран среднее при помощи всплывающего окна. А мне нужно значение в ячейке. Потом я эту формулу вниз буду растягивать, строить по получившимся данным графики.

Вообще, в жизни все началось с того, что мне нужно более миллиона значений усреднить с окном 3600 ячеек. Я написала функцию на основе формулы
СУММ(ИНДЕКС(A$2:A$1016278;СТРОКА(G2)*3600-3599):ИНДЕКС(A$2:A$1016278;СТРОКА(G2)*3600)). с тремя аргументами, где вместо A$2:A$1016278 - f, вместо G2 - v, вместо 3600 - g.
Это все работает
Только из-за запятой у меня не считается среднее по всему диапазону
Изменено: Oda412 - 19.06.2014 16:50:21
 
Цитата
Oda412 пишет: Вы в своем примере выводите на экран среднее при помощи всплывающего окна. А мне нужно значение в ячейке.
В "окне" (MsgBox) я ТОЛЬКО показываю результат, Вы же можете вместо сообщения выводить результат в любую ячейку:
Код
[B1]=Application.WorksheetFunction.Average(Range(f & ":" & g)) 
И разделитель в диапазоне всегда двоеточие. Можно сначала установить диапазон, а потом использовать уже эту переменную:
Код
Sub Test2()
Dim Rng As Range
    Set Rng = Range("A1:A9")
    Range("A10") = Application.WorksheetFunction.Average(Rng)
End Sub 
 
Юрий М, хорошо, а если вместо А1 и А9 использовать параметры f и g соответственно? Как тогда правильно написать синтаксис?
Изменено: Oda412 - 19.06.2014 14:52:08
 
Я же показал - сцепить через двоеточие.
 
Юрий М, все, да, глаза мои уже не видят.. спасибо большое! заработало. Фух! :)
 
Юрий М, простите меня, пожалуйста, я не совсем углядела один нюанс: функция считает среднее не правильно...
Если возьмем следующую функцию
Код
Public Function СРЕДГРУПП5(f, g)
СРЕДГРУПП5 = Application.WorksheetFunction.Average(Range(f & ":" & g))
End Function 
И применим ее к диапазону ячеек, например, между А3 и А6, то результат не будет равен среднему значению этих ячеек. То есть, я набираю =СРЕДГРУПП5(А3;А6), получается 3,5. А если набираю =СРЗНАЧ(А3:А6), то получается 3
Где может быть ошибка?
 
Не вижу эту функцию в Вашем файле... В моём примере текстовая строка - String, а Вы пытаетесь подсунуть два ДИАПАЗОНА. Попробуйте так:
Код
СРЕДГРУПП5 = Application.WorksheetFunction.Average(Range(f.Address & ":" & g.Address))
 
 
Юрий М, спасибо огромное.
Дай Бог Вам здоровья..  
 
Как вариант передавать функции значения строк и колонок верхнего левого и правого нижнего углов диапазона

Код
Public Function СРЕДГРУПП5(RW1, CL1, RW2, CL2 As Long)
СРЕДГРУПП5 = Application.WorksheetFunction.Average(Range(Cells(RW1, CL1), Cells(RW2, CL2)))
End Function
 
Страницы: 1
Читают тему
Наверх