2016-09-24 65 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 

作品這裏 - 享受!