2016-09-24 19 views
0

Ich habe überprüft, wie man Single-Cell-Array-UDFs machen und kann nicht Kopf oder Schwanz von dem, was ich gesehen habe, so dachte ich, vielleicht sollte ich besser fragen!Umwandlung eines UDF in ein Array UDF

Ich frage mich, ob jemand mir helfen könnte, herauszufinden, wie ich meine UDF in etwas umwandeln kann, das mit einem Bereich umgehen kann, dessen Ausgabe dann gemittelt werden könnte.

Ich habe eine UDF erstellt die Anzahl der Monate in einem Alter, in diesem Format zu finden:

Chronological Age 

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

die UDF geht wie folgt:

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 

So war ich etwas entlang der Linien denken von:

Mit der Funktion unten, um den Durchschnitt von Monaten zurück zu einem Alter:

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 

Ich hoffe wirklich, dass dies Sinn macht!

Ich weiß nicht wirklich, ob es eine Array-Formel per se sein muss oder ob es etwas mit einem Bereich tun würde, aber ich plane im Grunde, eine Formel zu verwenden, um das Ergebnis einer Formel auf jeder Zelle in a zu mitteln Angebot.

Jede Hilfe wird dankbar erhalten!

Vielen Dank für Ihre Zeit!

+2

Kein UDF muss eine Matrixformel sein, da Sie die wiederholenden Berechnungen innerhalb des Codes für die UDF selbst erstellen. Außerdem kann kein UDF einen Wert in eine Zelle des Arbeitsblatts schreiben, die nicht die Zelle ist, die die UDF enthält. Eine Reihe von Zellen kann jedoch eine UDF enthalten und wie jede andere native Worksheet-Formel "Array-Eingabe" sein. – Jeeped

+0

Danke dafür - ich glaube ich verstehe was du meinst. Die UDF, die ich erstellen möchte, nimmt einen Bereich an, konvertiert ihn in Monate, mittelt ihn, konvertiert ihn zurück in Jahre und meldet ihn dann in der Zelle, in der er geschrieben ist. Genauso wie wenn Sie die durchschnittliche Funktion innerhalb von Excel verwenden Zelle in ein "durchschnittliches" Format, bevor Sie die Durchschnittsberechnung durchführen. Um es anders auszudrücken, ich möchte das Durchschnittsalter von einer Spalte von Altern erhalten. Excel kann keine Altersangaben im obigen Format interpretieren, daher müssen sie zuerst in mehrere Monate konvertiert werden, aber ich möchte keine weitere Spalte dafür erstellen. –

Antwort

0

Sie waren irgendwie nahe, benötigt man nur eine For-Schleife:

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 

Works hier- zu genießen!