ExcelでMAXIFとMINIFを使う

《2008/07/09に高速化版を再掲載していますので、内容理解より処理速度を優先する場合はこちらを参照下さい》
 
要は、SUMIF的な感じで指定範囲の最大値or最小値を返す関数。
VlookupやHlookupのような柔軟性のある関数にしてもよかったケド、納期の関係で限定的な機能になりました。これをベースにもっと汎用的な関数へ改造してお使い下さい(ぉ
 
MAXIF関数

Function MAXIF(ScanCells As Range, _
               KeyWord As Variant, _
               CalcCells As Range) As Variant
    ' 条件付きMax関数
    Dim Y As Long
    Dim MaxVal As Variant
    Dim ChkVal As Variant
    Dim CmpVal As Variant
    
    MaxVal = ""
    Y = 1
    While (Y <= ScanCells.Rows.Count) And (Y <= CalcCells.Rows.Count)
        ChkVal = ScanCells.Cells(Y, 1).Value
        If ChkVal = KeyWord Then
            CmpVal = CalcCells.Cells(Y, 1).Value
            If Not IsNull(CmpVal) Then
            If CmpVal <> "" Then
                If MaxVal = "" Or _
                   MaxVal < CmpVal Then
                    MaxVal = CmpVal
                End If
            End If
            End If
        End If
        Y = Y + 1
    Wend
    If MaxVal <> "" Then
        MAXIF = MaxVal
    Else
        MAXIF = ""
    End If
End Function

 
MINIF関数

Function MINIF(ScanCells As Range, _
               KeyWord As Variant, _
               CalcCells As Range) As Variant
    ' 条件付きMin関数
    Dim Y As Long
    Dim MinVal As Variant
    Dim ChkVal As Variant
    Dim CmpVal As Variant
    
    MinVal = ""
    Y = 1
    While (Y <= ScanCells.Rows.Count) And (Y <= CalcCells.Rows.Count)
        ChkVal = ScanCells.Cells(Y, 1).Value
        If ChkVal = KeyWord Then
            CmpVal = CalcCells.Cells(Y, 1).Value
            If Not IsNull(CmpVal) Then
            If CmpVal <> "" Then
                If MinVal = "" Or _
                   MinVal > CmpVal Then
                    MinVal = CmpVal
                End If
            End If
            End If
        End If
        Y = Y + 1
    Wend
    If MinVal <> "" Then
        MINIF = MinVal
    Else
        MINIF = ""
    End If
End Function

 
それぞれ、ScanCellsに比較対象のセル(単列複数行)、KeyWordにScanCellsから選択するデータ(文字列等)、CalcCellsにMax/Min判定対象のセル(単列複数行)を指定。
「=MAXIF(A2:A12, "合計", B2:B12)」とすると、A列が"合計"の行のB列のうち最大の値が返るというイメージ。