'上位n個のセルのインデックス配列を返す関数 '使用例 '{=MyTopN($A$2:$A$100,3)} 'A2:A100の上位3個のセルのインデックスを取得します。 '1列なので例えばC2:C4に配列数式として入力し、行インデックスだけを '取得することもできます。 Option Explicit Function MyTopN(range1 As Object, topCount As Integer) As Variant Dim dfValue() As Double Dim iIndex() As Long Dim iRow As Long, iCol As Long Dim iRowsCount As Long, iColumnsCount As Long Dim iUbound As Integer Dim i As Long, j As Long, n As Long Dim v As Variant Dim r As Range If topCount <= 0 Then Exit Function iUbound = topCount - 1 ReDim dfValue(0 To iUbound) ReDim iIndex(0 To iUbound, 0 To 1) iRowsCount = range1.Rows.Count iColumnsCount = range1.Columns.Count n = -1 For iRow = 1 To iRowsCount For iCol = 1 To iColumnsCount v = range1.Cells(iRow, iCol) If (Not IsEmpty(v)) And IsNumeric(v) Then '配列要素数を追加するか調べる If n = iUbound Then '配列要素数を追加しない場合 '配列の最小値との比較 If v > dfValue(n) Then '値挿入処理の開始インデックスの設定 j = n - 1 Else '値挿入処理を行わない j = -1 End If '最初の配列要素か調べる ElseIf n <> -1 Then '配列要素数を追加する n = n + 1 '値挿入処理の開始インデックスの設定 j = n - 1 Else '最初の配列要素の場合 n = 0 dfValue(0) = v iIndex(0, 0) = iRow iIndex(0, 1) = iCol '値挿入処理を行わない j = -1 End If If j <> -1 Then '値を挿入 For i = j To 0 Step -1 If v > dfValue(i) Then dfValue(i + 1) = dfValue(i) iIndex(i + 1, 0) = iIndex(i, 0) iIndex(i + 1, 1) = iIndex(i, 1) Else dfValue(i + 1) = v iIndex(i + 1, 0) = iRow iIndex(i + 1, 1) = iCol Exit For End If Next If i = -1 Then dfValue(0) = v iIndex(0, 0) = iRow iIndex(0, 1) = iCol End If End If End If Next Next MyTopN = iIndex End Function