Преобразование UDF в массив UDF

Я проверил, как создавать UDF-массивы с одной ячейкой, и не могу понять, что я видел, поэтому я подумал, может быть, мне лучше спросить!

Мне было интересно, может ли кто-нибудь помочь мне выяснить, как преобразовать мой UDF во что-то, что может обрабатывать диапазон, вывод которого затем можно было бы усреднить.

Я создал UDF, чтобы найти количество месяцев в возрасте в следующем формате:

Chronological Age

    8:1
    8:2
    8:9
    8:1
    8:0
    7:10
    8:9

UDF выглядит следующим образом:

Function GDAgeToMonths(YearsMonths As String) As Integer

Dim Colonz As Integer, Yearz As Integer, Monthz As Integer, Greaterz As Integer

' check if the stings consists of ">" sign
If InStr(YearsMonths, ">") >= 1 Then
    Greaterz = 2
Else
    Greaterz = 1
End If

' check position of ":" or "." sign
If InStr(YearsMonths, ":") >= 1 Then
    Colonz = InStr(YearsMonths, ":")
Else
    Colonz = InStr(YearsMonths, ".")
End If

Yearz = Mid(YearsMonths, Greaterz, Colonz - Greaterz)
Monthz = Right(YearsMonths, Len(YearsMonths) - Colonz)
GDAgeToMonths = Yearz * 12 + Monthz

End Function

Итак, я подумал о чем-то вроде:

Function GDAverageAge(AgeRange As Range) As Integer

Dim MonthsRange As Range, AverageMonths As Double

MonthsRange = GDAgeToMonths(AgeRange)

AverageMonths = WorksheetFunction.Average(MonthsRange)

GDAverageRange = GDMonthsToAge(AverageMonths)

End Function

С помощью функции ниже, чтобы вернуть среднее значение от месяцев к возрасту:

Function GDMonthsToAge(NumberofMonths As Integer) As String

Dim Yearz As Integer, Monthz As Integer
Yearz = NumberofMonths \ 12
Monthz = NumberofMonths - (12 * Yearz)
GDMonthsToAge = Yearz & ":" & Monthz
End Function

Я очень надеюсь, что это имеет смысл!

Я действительно не знаю, должна ли это быть формула массива как таковая или она будет что-то делать с диапазоном, но я в основном планирую использовать формулу для усреднения результата выполнения формулы для каждой ячейки в диапазоне.

Любая помощь будет принята с благодарностью!

Спасибо за уделенное время!


person GL D    schedule 24.09.2016    source источник
comment
UDF не обязательно должна быть формулой массива, потому что вы строите повторяющиеся вычисления в коде самой UDF. Кроме того, ни одна UDF не может записать значение в ячейку на листе, которая не является ячейкой, содержащей UDF. Однако ряд ячеек может содержать UDF и быть «введенным в массив», как и любая другая собственная формула рабочего листа.   -  person    schedule 25.09.2016
comment
Спасибо за это. Думаю, я понимаю, о чем вы. UDF, который я хочу создать, будет принимать диапазон, преобразовывать его в месяцы, усреднять, преобразовывать обратно в годы, а затем сообщать об этом в ячейке, в которой он записан. Точно так же, как когда вы используете среднюю функцию в Excel, за исключением преобразования каждого перед выполнением вычисления среднего значения в ячейке с усредняемым форматом. Другими словами, я хочу получить средний возраст из столбца возрастов. Excel не может интерпретировать возраст в указанном выше формате, поэтому сначала нужно преобразовать их в количество месяцев, но я не хочу создавать для этого еще один столбец.   -  person GL D    schedule 25.09.2016


Ответы (1)


Вы были близки, вам просто нужен цикл For:

Function GDAverageAge(Ages As Range) As String
Dim c As Integer, a As Integer, am As Integer, v As Variant
'Counter of number of entries in range
c = 0
'Total value of range in months
a = 0
For Each v In Ages
a = a + GDAgeToMonths(v.Value)
c = c + 1
Next v
am = a / c
GDAverageAge = GDMonthsToAge(am)
End Function

Работает здесь - наслаждайтесь!

person GL D    schedule 07.10.2016