• ベストアンサー

集計

お世話になります。 表の集計にCountifで、1の数をカウント又は2だったり3だったり変数をカウントしたのですが、困っているのは、オートフィルタをかけている表でCountif関数を使用しても非表示の数字もカウントしてしまう事です。表示されている部分だけを数えたいのですがどうやったらいいのでしょうか?お教え下さい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#70958
noname#70958
回答No.3

単に「表示されているセルを数える」のではなくて 「表示されているセルについて特定の数字を数える」のかと思ったのですが…。 もし私の解釈が正しければ、 例えば、データが2行目以下にあり、C列の値が5である行をカウントする場合。 ---------------------------------------------- ●甲案: オーソドックスに作業列を使って。  1.すべての行を表示した状態で、適当な列(仮にD列とします)の2行目を    =SUBTOTAL(3,C2)   として下方にフィルしておきます。  2.そのうえで、任意のセルを   =SUMPRODUCT((C2:C99=5)*D2:D99)   とすれば、オートフィルタをかけた際に、   「表示されている行で、かつ、C列が5である行」の数が得られます。 ---------------------------------------------- ●乙案: ややトリッキーですが数式一発で。  任意のセルを   =SUMPRODUCT(SUBTOTAL(3,OFFSET(C2,ROW(C2:C99)-2,))*(C2:C99=5))  とすれば、直接結果を得ることができます。  ※OFFSET(C2,ROW(C2:C99)-2,) の C2 の部分は範囲の先頭行を指定し、   ROW(C2:C99)-2 の -2 の部分は先頭行の行番号を指定します。 ---------------------------------------------- ●丙案:ユーザー定義関数を使って。  [Visual Basic]カテゴリでのご質問なので、やっつけですが一応。 Function Sample(ByVal myRng As Range, ByVal myKey As Variant) As Long  myRst = 0  For Each myCel In myRng   If Application.Subtotal(3, myCel) = 1 And myCel.Value = myKey Then    myRst = myRst + 1   End If  Next myCel  Sample = myRst End Function 任意のセルを  =Sample(C2:C99,5) とすれば、結果が得られます。 ---------------------------------------------- いずれもExcel2003で動作確認済。以上ご参考まで。

miruchoko
質問者

お礼

ありがとうございました。 大変参考になりました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

もしかして、VBAですか? なら、 Kensu = WorksheetFunction.Subtotal(3, Range("A2:A50")) とか Kensu = WorksheetFunction.Subtotal(3, Range("A1").CurrentRegion.Columns(1)) - 1 など。。。  

miruchoko
質問者

お礼

ありがとうございました。 参考になりました。

すると、全ての回答が全文表示されます。
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.1

そういうときは、SUBTOTAL関数を使います。 例えば、全て表示されてる時点で、データが、A2~A50に入力されていたら   =SUBTOTAL(3,A2:A50) としておくと、フィルターが掛かると表示されてる件数が計算されます。 それから、わざわざ数えなくてもフィルターがかかった時点で 画面下部のステータスバーの左に、抽出数が表示されるはずです。  

すると、全ての回答が全文表示されます。

関連するQ&A