パーセントランク関数は、次のような両方のアグリメントに対して同じ名前の範囲を取ることができます。
=percentrank(inputrange,inputrange)
最初の引数をパーセントカットオフを計算するためのセルの範囲として扱い、2番目の引数を使用して単一のセルの値を返し、カットオフ間でランク付けします。単一のセルは、関数が入力/呼び出された行によって決定されます。
この機能を再作成し、2番目の範囲参照を使用して、(関数が入力された行に基づいて)単一のセルの値を見つけたいと思います。これが私が持っているものです:
Public Function QUARTILE_RANK(DataRange As Range, RefCell As Range)
If RefCell <> vbNullString Then
q1 = Application.WorksheetFunction.Quartile(DataRange, 1)
q2 = Application.WorksheetFunction.Quartile(DataRange, 2)
q3 = Application.WorksheetFunction.Quartile(DataRange, 3)
q4 = Application.WorksheetFunction.Quartile(DataRange, 4)
If (RefCell <= q1) Then QUARTILE_RANK = 1
If (RefCell > q1) And (RefCell <= q2) Then QUARTILE_RANK = 2
If (RefCell > q2) And (RefCell <= q3) Then QUARTILE_RANK = 3
If (RefCell > q3) Then QUARTILE_RANK = 4
Else
QUARTILE_RANK = vbNullString
End If
End Function
両方の引数に同じ名前の範囲を渡すと、両方の範囲がセルの配列と見なされます。最初の引数をそのように処理したいのですが、2番目の引数を使用して単一のセル値を見つけます。つまり、PERCENTRANK関数の機能をミラーリングしたいのです。
編集:
Sean Chesireの意見は、私がそれを機能させるのに役立ちました。これと同じ関数が他の人によって書かれたと確信しているので、改善のための提案を歓迎します。
最終的な形式は次のとおりです。
Public Function QUARTILE_RANK(DataRange As Range, RefRange As Range)
Dim refCell As Range
If RefRange.Rows.Count > 1 Then
Set refCell = RefRange.Cells(Application.Caller.Row, 1)
Else
Set refCell = RefRange ' maybe they only passed a cell reference
End If
If refCell <> vbNullString Then
q1 = Application.WorksheetFunction.Quartile(DataRange, 1)
q2 = Application.WorksheetFunction.Quartile(DataRange, 2)
q3 = Application.WorksheetFunction.Quartile(DataRange, 3)
q4 = Application.WorksheetFunction.Quartile(DataRange, 4)
If (refCell <= q1) Then QUARTILE_RANK = 1
If (refCell > q1) And (refCell <= q2) Then QUARTILE_RANK = 2
If (refCell > q2) And (refCell <= q3) Then QUARTILE_RANK = 3
If (refCell > q3) Then QUARTILE_RANK = 4
Else
QUARTILE_RANK = vbNullString
End If
End Function