Hi everyone, I am working on a UDF to calculate quartiles (the ones provided in Excel do not calculate the way I want). However, when I call on the function and type in the parameters, I get a VALUE error. Can someone help me with where I'm going wrong?
(btw, this is my first UDF, so I apologize if something is fundamentally wrong with it)
Thanks!
Function QuartileNorm(MyRange As Range, Quartile As Integer)
Dim Q0 As Long
Dim Q1 As Long
Dim Q2 As Long
Dim Q3 As Long
Dim Q4 As Long
Dim rng As Long
Q0 = WorksheetFunction.Min(MyRange)
Q4 = WorksheetFunction.Max(MyRange)
rng = WorksheetFunction.Count(MyRange)
If rng Mod 4 = 0 Then
Q1 = (WorksheetFunction.Small(MyRange, rng / 4) + WorksheetFunction.Small(MyRange, (rng / 4) + 1)) / 2
Q2 = (WorksheetFunction.Small(MyRange, rng / 2) + WorksheetFunction.Small(MyRange, (rng / 2) + 1)) / 2
Q3 = (WorksheetFunction.Small(MyRange, (rng / 4) + (rng / 2)) + WorksheetFunction.Small(MyRange, (rng / 4) + (rng / 2) + 1)) / 2
ElseIf rng Mod 4 = 2 Then
Q1 = WorksheetFunction.Small(MyRange, (rng / 4) + 0.5)
Q2 = (WorksheetFunction.Small(MyRange, rng / 2) + WorksheetFunction.Small(MyRange, (rng / 2) + 1)) / 2
Q3 = WorksheetFunction.Small(MyRange, (rng / 4) + (rng / 2) + 0.5)
ElseIf rng Mod 4 = 1 Then
Q1 = WorksheetFunction.Small(MyRange, (((rng / 2) + 0.5) / 2) + 0.5)
Q2 = WorksheetFunction.Small(MyRange, rng / 2 + 0.5)
Q3 = WorksheetFunction.Large(MyRange, (((rng / 2) + 0.5) / 2) + 0.5)
ElseIf rng Mod 4 = 3 Then
Q1 = (WorksheetFunction.Small(MyRange, (((rng / 2) + 0.5) / 2)) + WorksheetFunction.Small(MyRange, (((rng / 2) + 0.5) / 2) + 1)) / 2
Q2 = WorksheetFunction.Small(MyRange, rng / 2 + 0.5)
Q3 = (WorksheetFunction.Large(MyRange, (((rng / 2) + 0.5) / 2)) + WorksheetFunction.Small(MyRange, (((rng / 2) + 0.5) / 2) + 1)) / 2
End If
If Quartile = 0 Then
QuartileNorm = Q0
ElseIf Quartile = 1 Then
QuartileNorm = Q1
ElseIf Quartile = 2 Then
QuartileNorm = Q2
ElseIf Quartile = 3 Then
QuartileNorm = Q3
ElseIf Quartile = 4 Then
QuartileNorm = Q4
End If
End Function
Bookmarks