web-dev-qa-db-ja.com

COUNTIF基準を満たす行を表示します

これが可能かどうかはわかりませんが、COUNTIF関数を使用すると、基準を満たす行を実際に見つけることができます。

たとえば、大量のデータを調べて「5」の結果が返されるCOUNTIF式があります。

したがって、5行がCOUNTIF基準を満たしていますが、これらの5行を簡単に見つけることは可能ですか?

前もって感謝します :)

2
Geotaz

これは非常に簡単な例です。 1を超える列[〜#〜] b [〜#〜]の値の数をカウントします。基準をセルC1に入れ、C2に入力します。

=COUNTIF(B:B,C1)

enter image description here

カウントに寄与するアイテムがあることがわかりました11。今、私たちはそれらを見つけたいと思います。
標準モジュールに次のユーザー定義関数を入力します。

Public Function CountIfFinder(rng As Range, crit As String) As String
    Dim r As Range, DQ As String

    DQ = Chr(34)
    crit = DQ & crit & DQ
    CountIfFinder = ""
    Set rng = Intersect(rng, rng.Parent.UsedRange)

    For Each r In rng
        s = "=countif(" & r.Address & "," & crit & ")"
        If Evaluate(s) = 1 Then CountIfFinder = CountIfFinder & "," & r.Address(0, 0)
    Next r

    CountIfFinder = Mid(CountIfFinder, 2)
End Function

セルを選択(sayD1そして入力:

=CountIfFinder(B:B,C1)

enter image description here

ユーザー定義関数(UDF)は、インストールと使用が非常に簡単です。

  1. ALT-F11はVBEウィンドウを表示します
  2. ALT-IALT-Mは新しいモジュールを開きます
  3. ものを貼り付けて、VBEウィンドウを閉じます

ブックを保存すると、UDFも一緒に保存されます。 2003年以降のバージョンのExcelを使用している場合は、ファイルを.xlsxではなく.xlsmとして保存する必要があります。

UDFを削除するには:

  1. 上記のようにVBEウィンドウを表示します
  2. コードをクリアする
  3. vBEウィンドウを閉じる

ExcelからUDFを使用するには:

= myfunction(A1)

一般的なマクロの詳細については、以下を参照してください。

http://www.mvps.org/dmcritchie/Excel/getstarted.htm

そして

http://msdn.Microsoft.com/en-us/library/ee814735(v = office.14).aspx

uDFの詳細については、以下を参照してください。

http://www.cpearson.com/Excel/WritingFunctionsInVBA.aspx

これを機能させるには、マクロを有効にする必要があります!

2
Gary's Student

すべての手順は添付の画像で詳しく説明されていますが、以下の解決策を参照してください。

これらがどのように機能するかを説明するために、以下に示す各ステップの詳細な説明を作成します。

enter image description here

ステップ1:

確立した検索条件を示します。この例では、Gender = Mであるすべての行を探しています

この条件で見つかった行数を返すための同等のCOUNTIF関数を以下に示します。

ステップ2:

配列式=IF($B$2:$B$8=$B$11,ROW($B$2:$B$8))を確立します。これは配列数式であり、通常のIF関数の拡張を使用します。配列_B2:B8_の値を_B11_と比較し、比較の結果を値の配列として返します。比較がtrueの場合、結果はROW()番号になり、それ以外の場合はFALSEになります(比較がfalseの場合は値が提供されないため)。

これをさらに理解するには、以下のような単純なIF式から始めて、value_if_trueとvalue_if_falseのさまざまなオプションを試して、結果「IF(B2 = B11、ROW(B2)、)」を理解します。

「IF(B2 = B11、ROW(B2)、 "不一致")」

次に、B11をFに変更して同じことを試し、結果がどうなるかを確認します。

ステップ3:ここでは、SMALL関数を使用して、配列内のn番目に小さい値を返します。ただし、ここでの秘訣は、各行のn番目の値を変更することです。したがって、最初の行は配列_F2:F8_の最小値を示し、2番目の行は2番目に小さい値を返し、3番目の行は3番目に小さい値を返す必要があります。

したがって、ROW()-1を使用して、対応するn番目の変数の設定を取得し、残りは簡単です。

ステップ4:

ステップ3の終わりに、検索条件が満たされる行の数があります。このステップでは、INDEX関数を使用して、これらの行番号に対応する行値を抽出するだけです。

これを実現するには、最初にセルM2:O2を選択し、_F2_を押すと、カーソルがセルM2に配置されます。数式INDEX($A$1:$C$8,J2,0)を入力し、Ctrl + Shift + Enterを同時に押すと、配列数式として機能します。この数式の0は、範囲A1:C8の特定の列の値ではなく、行全体を返すように強制します。

次に、M2:O4を選択​​し、Ctrl + Dを押して、一番上の行の数式を下のセルにコピーします。

ビンゴ!

説明が必要な場合はコメントを投稿してください。喜んで説明させていただきます。私はいくつかの簡略化を使用し、機能を説明するために手順を分解しました。これらの式をすべて組み合わせて、一度に同じ結果を得ることができます。

また別の簡略化:正確な行数で式を入力することを選択しますが、検索条件によって返される行数がわからない場合は、最終結果を作成できます元のデータセットの範囲と同じ大きさの配列で、すべての行が返される場合に対応できる可能性があります。返される行数が結果領域より少ない場合に空白行を表示するために、各式にエラー処理を追加することもできます。これが理にかなっていることを願っています!

0
Bharat Anand