吉姆描述了一种情况,其中列出了员工姓名及其工资。他想确定谁是收入最高的五名员工。他使用LARGE函数确定五个最大的薪水,然后尝试使用VLOOKUP返回属于那些薪水的姓名。除非前五名的薪金重复(人们获得相同的薪水),否则此方法效果很好。如果存在,则VLOOKUP仅返回该薪水的第一位雇员的姓名。

要返回所有专有名称,您可以做几件事。

一种方法是完全不使用公式。相反,您可以在Excel中使用自动筛选功能:

。选择数据表中的任何单元格。

。选择数据|筛选器|自动筛选。 Excel在表中每个列标题的右侧添加下拉箭头。

。使用“薪金”列顶部的下拉列表选择“前10名”。Excel将显示“前10名自动筛选”对话框。 (请参见图1。)

。将中央控制从10调整到5。

。单击确定。 Excel在列表中显示前五名的薪水。

当您按照这些步骤,您实际上可能最终会看到五个以上的记录,特别是如果员工工资中有联系。筛选器将确定前五名的薪水,然后显示所有薪水与之匹配的记录。

如果您不想使用自动筛选,另一种选择是简单地确保员工列表中的每条记录都具有唯一性。例如,如果员工姓名在B列中,而薪水在C列中,则可以在A列中使用以下公式使每条记录唯一:

=C2+ROW()/100000000

这将添加行号除以100,000,000,并获得唯一值。例如,如果您在第2行和第A列中具有相同的薪水98,765.43和A列中的薪金将为:

98765.43000002 98765.43000049

较大的数字(100,000,000)使得如果在65536行中具有相同的数字,则会得到:

98765.43065536

即使在这种情况下,四舍五入到小数点后两位的值仍然是实数。如果使用A列中的“非唯一”值完成了LARGE和VLOOKUP,则根据人员在列表中的位置,您将返回最高薪水(及其相关人员)。

第三种方法是使用RANK和COUNTIF函数为薪水列表中的每个值返回唯一的“排名”。如果薪水在B1:B50范围内,请在单元格C1中输入以下内容并将其复制到该范围内:

=RANK(B1,$B$1:$B$50)+COUNTIF($B$1:B1,B1)-1

现在,您可以在排名值上使用INDEX来返回与每个薪水相关的名称。

最后,第四种方法是创建一个可以返回所需信息的宏。可以通过多种方式来实现宏。以下只是其中之一:

Function VLIndex(vValue, rngAll As Range, _   iCol As Integer, lIndex As Long)

Dim x As Long     Dim lCount As Long     Dim vArray() As Variant     Dim rng As Range     On Error GoTo errhandler

Set rng = Intersect(rngAll, rngAll.Columns(1))

ReDim vArray(1 To rng.Rows.Count)

lCount = 0     For x = 1 To rng.Rows.Count         If rng.Cells(x).Value = vValue Then             lCount = lCount + 1             vArray(lCount) = rng.Cells(x).Offset(0, iCol).Value         End If     Next x

ReDim Preserve vArray(1 To lCount)

If lCount = 0 Then         VLIndex = CVErr(xlErrNA)

ElseIf lIndex > lCount Then         VLIndex = CVErr(xlErrNum)

Else         VLIndex = vArray(lIndex)

End If errhandler:

If Err.Number <> 0 Then VLIndex = CVErr(xlErrValue)

End Function

传递给该用户定义函数的参数是值,要查找的像元范围,该范围的查找偏移量(右侧的列数为正,左侧的列数为负),并且重复项的编号(1是第一个值,2是第二个值,依此类推)。

例如,要使用它,请假设A1:B1包含列标题,A2:A100包含薪水,B2:B100包含员工名称。

在E2单元格中,您可以输入以下内容以确定表中的最高薪水:

=LARGE($A$2:$A$100,ROW()-1)

在单元格F2中,您可以输入以下公式以确定该行是否有重复项,并跟踪该重复项的当前“值”:

=IF(E2=E1,1+F1,1)

在单元格G2中,您可以使用以下公式,该公式调用用户定义的函数:

=VLIndex(E2,$A$2:$A$100,1,F2)

将单元格E2:G2复制到E3:G6,您将(在G列中)拥有薪水最高的五个员工的姓名。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3077)适用于Microsoft Excel 97、2000、2002和2003。