1

パーセントランク関数は、次のような両方のアグリメントに対して同じ名前の範囲を取ることができます。

=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
4

2 に答える 2

0

これにより、数式がどのセルから呼び出されたかがわかります。

Function testit() As String
testit = Application.Caller.Parent.Parent.Name & " " & Application.Caller.Parent.Name & " " & Application.Caller.Address
End Function

次に、指定された範囲をテストし、他の配列でどの値を参照する必要があるかを判断できるはずです。

于 2012-07-30T19:55:55.237 に答える
0

=LOOKUP(PERCENTRANK(vals,vals),{0,0.25,0.5,0.75},{1,2,3,4})

于 2012-07-30T20:56:15.597 に答える