VBA使自定义函数的命名范围参数指向单个单元格和一系列单元格

percentrank函数可以使用相同的命名范围,如下所示:

=percentrank(inputrange,inputrange) 

它将第一个参数视为计算百分比截止点的单元格范围,并使用第二个参数返回单个单元格的值以在截断点之间进行sorting。 单个单元格由input/调用函数的行确定。

我想重新创build这个function,并使用第二个范围参考find一个单元格值(基于该函数进入的行)。 这是我有:

 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 

如果我将这两个参数的命名区域传递给它,它将这两个区域视为单元格的数组。 我希望它以这种方式处理第一个参数,但使用第二个参数find单个单元格值。 也就是说,我想要它镜像PERCENTRANK函数的function。

编辑:

肖恩Chesire的input帮助我得到它的工作。 我希望有任何改进的build议,因为我确定这个function是由别人写的。

这是最后的forms:

 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 

这将告诉你公式从哪个单元格被调用:

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

然后,您应该能够testing给定的范围,并确定应该在另一个数组中引用哪个值

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