ExcelでMINIFとMAXIFを使おう

| コメント(0) | トラックバック(0)

仕事でExcelの関数で条件付きMINが必要になった。

もともと標準関数の中に条件付き合計値を出すSUMIF関数があるが、MINIF関数やMAXIF関数は無い。何故だ!
本当に無いのかよおい?と検索していたらmagnitude6さんが作っているのを発見。やはり同じことを考えている人がいた。先生ありがとう!

magnitude6さんが作ったMINIF関数とMAXIF関数は検索範囲をWhileで回すものだが、前にWhileを使ったときにFor Eachの方が早かったような気がしたので、magnitude6さんの関数を一部変更してFor Each版を作ってみた。
結果は自分が持ってたデータで検索範囲が100行くらいだと処理時間が半分くらいになった。データ量によっては効果がないかも。

使い方は、ScanCellsに検索対象のセル範囲(1列)、KeyWordにScanCellsから検索するデータ、CalcColumnにMaxまたはMinを判定する列番号(1列)を指定すればOK。
CalcColumnの列番号を数えるのが面倒。magnitude6さんと同じくセル範囲にして、先頭セルの列番号を計算した方が良かったかな。

[MAXIF関数]

Function MAXIF(ScanCells As Range, _
               KeyWord As Variant, _
               CalcColumn As Integer) As Variant
    ' 条件付きMax関数
    
    Dim TrgCel As Variant
    Dim TrgRow As Variant
    Dim MaxVal As Variant
    Dim ChkVal As Variant
    Dim CmpVal As Variant
    
    MaxVal = "<MAXIF_INITIAL_VALUE>"
    
    For Each TrgCel In ScanCells
        ChkVal = TrgCel.Value
        If ChkVal = KeyWord Then
            TrgRow = TrgCel.Row
            CmpVal = Cells(TrgRow, CalcColumn).Value
            If Not IsNull(CmpVal) Then
                If CmpVal <> "" Then
                    If MaxVal = "<MAXIF_INITIAL_VALUE>" Or _
                       MaxVal < CmpVal Then MaxVal = CmpVal
                End If
            End If
        End If
    Next
    
    If MaxVal <> "<MAXIF_INITIAL_VALUE>" Then
        MAXIF = MaxVal
    Else
        MAXIF = ""
    End If

End Function

[MINIF関数]

Function MINIF(ScanCells As Range, _
               KeyWord As Variant, _
               CalcColumn As Integer) As Variant
    ' 条件付きMin関数
    
    Dim TrgCel As Variant
    Dim TrgRow As Variant
    Dim MinVal As Variant
    Dim ChkVal As Variant
    Dim CmpVal As Variant
    
    MinVal = "<MINIF_INITIAL_VALUE>"
    
    For Each TrgCel In ScanCells
        ChkVal = TrgCel.Value
        If ChkVal = KeyWord Then
            TrgRow = TrgCel.Row
            CmpVal = Cells(TrgRow, CalcColumn).Value
            If Not IsNull(CmpVal) Then
                If CmpVal <> "" Then
                    If MinVal = "<MINIF_INITIAL_VALUE>" Or _
                       MinVal > CmpVal Then MinVal = CmpVal
                End If
            End If
        End If
    Next
    
    If MinVal <> "<MINIF_INITIAL_VALUE>" Then
        MINIF = MinVal
    Else
        MINIF = ""
    End If

End Function

トラックバック(0)

トラックバックURL: http://www.hiyori.net/mt/mt-tb.cgi/904

コメントする

このブログ記事について

このページは、hiyoriが2007年5月 2日 20:25に書いたブログ記事です。

ひとつ前のブログ記事は「イノシシ注意」です。

次のブログ記事は「電動アシスト自転車購入」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.27-ja