Все еще довольно любитель, так что будьте осторожны. Я пытаюсь создать функцию, которая дает среднее значение набора чисел. Набор чисел на самом деле является зубцом винтика. Первым зубом всегда является зуб 1 (идентифицируемый как окрашенный), повреждение или закупорка регистрируются на зубах при вращении по часовой стрелке, поэтому повреждение на зубах 7 и 23 будет на зубах 7 и 23 от исходного зуба. Аномалия возникает, когда вы вычисляете нормальное среднее значение, поскольку среднее количество остановок на зубах 3, 4 и 33 фактически будет 1, а НЕ 14,33 в соответствии со стандартным средним. Я рассчитал это, чтобы найти среднее значение, и под средним я подразумеваю более близкое к медиане набора круговых чисел. Я добавляю по единице к каждому значению в диапазоне и вычисляю разницу между максимальным и минимальным числами, используя функцию MOD. Как только я определяю первую позицию самой короткой разницы, это просто случай вычитания увеличенного значения из нового среднего. Это, наверное, лучше описать в таблице ...
введите описание изображения здесь
Как видите, реальное среднее значение или медиана - это зубец 1, который является средним минус приращение первого набора чисел с наименьшей разницей. Код, который у меня есть в настоящее время для go посредством выполнения этих вычислений, дает значение # error, но мой опыт работы с пользовательскими функциями очень минимален, и я не знаю, с чего начать исправление проблемы, указатели будут оценены, решение будет fantasti c. Заранее большое спасибо.
Public Function AVGDISTCALC(rng As Range)
'Determines the average distance of a number of distances on a 37 tooth wheel.
Dim x As Integer
Dim i As Integer
Dim avg As Integer
Dim diff As Integer
Dim Arr() As Variant
Dim r As Long
Dim c As Long
Application.ScreenUpdating = False
'Write the range to an array.
Arr = rng
'Cycle through each increment on the 37 tooth wheel.
diff = 38
For i = 1 To 37
Arr = rng
'For each increment calculate the min and max of the range.
For r = 1 To UBound(Arr, 1)
For c = 1 To UBound(Arr, 2)
If (Arr(r, c) + i) Mod 37 = 0 Then
Arr(r, c) = 37
Else
Arr(r, c) = (Arr(r, c) + i) Mod 37
End If
Next c
Next r
If WorksheetFunction.Max(Arr) - WorksheetFunction.Min(Arr) < diff Then
diff = WorksheetFunction.Max(Arr) - WorksheetFunction.Min(Arr)
avg = WorksheetFunction.Average(Arr)
x = i
End If
Next i
AVGDISTCALC = avg - x
End Function