• 締切済み

なぜない?フィルタの使えるCOUNTIF関数

VBA初心者です。 エクセルでフィルターをかけた上で、特定のデータを数えたいと思うのですが・・・。 例 A        B 東京都    ● 神奈川県   ▲ 東京都    ▲ 愛知県    ● 静岡県    ● 東京都    ▲ このようにデータが入力されているとして、A列でオートフィルターをかけてA列が「東京都」でB列が「●」のセルをカウントしたいとします。 作業列を使ったり、SUMPRODUCT関数を使う方法もありますが、他の方に教えて頂き以下のようなユーザー定義関数を使っております。 Function AAA(myRange As Range, myStr As Variant) As Long  Dim Rng As Range  Dim Cnt As Long  For Each Rng In myRange   If Rng.EntireRow.Hidden = False And Rng.Value = myStr Then     Cnt = Cnt + 1   End If  Next Rng  AAA = Cnt End Function これで確かに希望通りの動作にはなるのですが、他のマクロを動作させるとエラーになってしまうケースが多いようです。 エラーになると、セル内の表示は「######」になってしまい、何らかの原因で非常に桁数の大きな結果が返っているのかと思いましたが、そうでもないようです。 この状態になっても、別セルに1つデータを入れたりするとまた正常に戻ったりして、ちょっと原因が掴めない状態でいます。 しかし疑問に思っているのは、フィルターの使えるCOUNTIF関数は、非常に需要が高いように思うのですが、なぜEXCELにはこういう関数が標準で存在していないのでしょうか? 何か理由をご存じの方いらっしゃいますか?

みんなの回答

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.3

>A列が「東京都」でB列が「●」のセルをカウントしたい エクセル2007以降で実装された、COUNTIFS関数を使って計算できます。 また、AでもBでもない別列でオートフィルタしたという状況でも、そのオートフィルタの条件を同様にCOUNTIFS関数に組み込んで計算する事で、できます。 #一応2003以前のエクセルでも、「A列東京都」「B列○」を共にオートフィルタで絞り込み、SUBTOTAL関数を3で使うなどの方法で「オートフィルタの絞り込み結果を数える」ことはできました。 ご質問の直接の回答として >なぜEXCELにはこういう関数が標準で存在していないのでしょうか? 基本的には、エクセルでは「1つの何か」を計算する関数が主だったからです。 ○条件に合致する「1つの結果」を計算する検索系の関数 ○「1つの条件」に合致するものを計算するCOUNTIFやSUMIF関数 例外的に配列の計算結果を算出するFREQUENCYとかLINESTといったものもありましたが、一般的な関数ではありません。 複数条件の計算ができるCOUNTIFS,SUMIFS等の関数は、長く求められていましたがようやく実装されました。今後も、たとえば「条件に合致する複数の計算結果を返す検索系の関数」などが追加されると嬉しいと思います。

yasupon2
質問者

お礼

ご回答ありがとうございます。 COUNTIFSという関数があるのですね。 勉強不足でした。 これから研究してみようと思います。 ただ、これだとA列に例えば全都道府県が存在すると、数を表示する列も47個必要になりそうですね。 できれば同じセルにその都度フィルターで抽出した対象の数を表示したいのですが…。 もう少し考えてみます。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.2

>作業列を使ったり、SUMPRODUCT関数を使う方法もありますが、他の方に教えて頂き以下のようなユーザー定義関数を使っております。 配列演算を利用してIF関数とCOUNT関数の組み合わせで目的が達成できます。 =COUNT(IF((A$2:A$7=A2)*(B$2:B$7=B2),ROW($2:$7),"")) IF関数の返り値を配列とするため演算式を入力後、Ctrl+Shift+Enterで確定します。

yasupon2
質問者

お礼

ご回答ありがとうございます。 確かにこの方法でも解答No.1の方に教えていただいたCOUNTIFS関数と同じ結果が出せるのですね。 しかもEXCEL2003でも使えるみたいです。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

>なぜない?フィルタの使えるCOUNTIF関数 SUBTOTAL関数があるからでは? オートフィルタで条件を追加しなけりゃいけないので複数の結果の同時表示は出来ませんけど 複数の結果が必要な場合は、フィルタでなくピボットテーブルを使えということなのでしょう。 ・SUBTOTAL関数 http://exinfo.biz/func/func_subtotal.shtml ・ピボットテーブル http://hamachan.info/excel/piboto.html

yasupon2
質問者

お礼

ご回答ありがとうございます。 入力されているデータの種類が少なければビボットテーブルで一覧にしても良いのですが…。 対象になるデータ数が多くなると、どうしても見にくくなってしまい、何とか1つのセルに都度フィルターで抽出した結果を表示したいのです。 B列の条件がなければSUBTOTALでOKなのですが、もう少し考えてみることにします。

関連するQ&A