2016-09-24 61 views
0

我已经检查过如何制作单元数组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 

我真的很希望这是有道理的!

我真的不知道它是否必须是一个数组公式,或者它是否会用范围做某些事情,但我基本上打算使用公式来计算公式在每个单元格上运行的结果的平均值范围。

任何帮助将受到感谢!

谢谢你的时间!

+2

没有UDF必须是数组公式,因为您在UDF自身的代码中构建了重复计算。此外,没有UDF可以将值写入工作表上不是包含UDF的单元格的单元格中。但是,一系列单元格可以包含一个UDF,并像'任何其他本地工作表公式'一样可以'数组输入'。 – Jeeped

+0

谢谢你 - 我想我明白你的意思。我想要创建的UDF将在一个范围内,将其转换为数月,平均值,将其转换回年,然后在写入的单元格中报告它。就像在Excel中使用平均函数时一样在执行平均计算之前,将单元转换为“可平均”格式。换句话说,我想从一列年龄中获得平均年龄。 Excel无法以上述格式解释年龄,因此他们需要先将其转换为若干个月,但我不想为此创建另一列。 –

回答

0

是一种密切的,你只需要你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 

作品这里 - 享受!