ジムは、従業員の名前とその給与のリストがある状況について説明しました。彼は、最も給与の高い5人の従業員が誰であるかを判断したいと考えています。彼はLARGE関数を使用して5つの最大の給与を識別し、次にVLOOKUPを使用してそれらの給与に属する名前を返そうとします。上位5つの給与に重複がない限り、これは問題なく機能します(人々は同じ給与を支払われます)。ある場合、VLOOKUPはその給与の最初の従業員の名前のみを返します。

すべての固有名詞を返すには、いくつかの方法があります。

1つの方法は、数式を使用して完全にバイパスすることです。代わりに、Excelのオートフィルター機能を使用できます:

。データテーブルの任意のセルを選択します。

。データを選択|フィルター|オートフィルター。 Excelは、テーブルの各列ヘッダーの右側にドロップダウン矢印を追加します。

。 [給与]列の上部にあるドロップダウンリストを使用して、[トップ10]を選択します。Excelに[トップ10オートフィルター]ダイアログボックスが表示されます。 (図1を参照)

。センターコントロールを10から5に調整します。

。 [OK]をクリックします。 Excelは、リストの上位5つの給与を表示します。

これらの手順を実行すると、特に従業員の給与に同点がある場合、実際には5つを超えるレコードが表示される可能性があります。フィルタは上位5つの給与を識別し、それらに一致する給与を持つすべてのレコードを表示します。

AutoFilterを使用したくない場合、別のオプションは、従業員リストの各レコードに固有の何かがあることを確認することです。たとえば、従業員名が列Bにあり、給与が列Cにある場合、列Aで次の式を使用して、各レコードを一意にすることができます。

=C2+ROW()/100000000

これにより、行番号が100,000,000で除算され、一意の値が作成されます。たとえば、行2に98,765.43、列Aに49の同一の給与がある場合、次のようになります。

98765.43000002 98765.43000049

大きな数値(100,000,000)は、行65536に同じ数値がある場合、次のようになります。

98765.43065536

また、この場合でも、小数点以下第2位に四捨五入された値が実数になります。 LARGEとVLOOKUPが列Aの「一意でない」値で実行された場合、リスト内の人の位置に基づいて、最大の給与(および関連する人)を返します。

3番目のアプローチは、RANK関数とCOUNTIF関数を使用して、給与リストの各値に一意の「ランキング」を返すことです。給与がB1:B50の範囲にある場合は、セルC1に次のように入力し、範囲を下にコピーします。

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

ランキング値でINDEXを使用して、各給与に関連付けられた名前を返すことができるようになりました。

最後に、4番目のアプローチは、必要な情報を返すことができるマクロを作成することです。マクロを実装する方法はたくさんあります。以下はそのうちの1つにすぎません:

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は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に)給与が最も高い5人の従業員の名前が表示されます。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

link:/ excelribbon-ExcelTipsMacros [ここをクリックして、新しいブラウザタブでその特別なページを開きます]

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(3077)は、Microsoft Excel 97、2000、2002、および2003に適用されます。