みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

(エクセル)オートフィルタ機能で表示部分のみの文字列をカウントしたい

はじめまして!
エクセル初心者です。過去ログを検索してみたのですが、上手く見つけられなかったので質問します。

下記のようなデータがあります。

  A1 B1 C1 D1
1 ○ × △ ▲
2 × ▲ ▽
3 ○ × ○ △
4 ▽ × ○ △
5 ○ ▲ ▽
6 ▲ △ ×
7 ○ △ × ▲

A1~D1にはオートフィルタをかけてあります。
A8にはCOUNTIF(a1:a7,"○")
A9にはCOUNTIF(a1:a7,"▲")
A10にはCOUNTIF(a1:a7,"△")
A11にはCOUNTIF(a1:a7,"▽")
A12にはCOUNTIF(a1:a7,"×")
B8にはCOUNTIF(b1:b7,"○")
B9にはCOUNTIF(b1:b7,"▲")
・・・・・とそれぞれ対応させいます。
例えば
A1で○を選択したときに、A8の数字は4になるのですが、B列の×はA列の○に対応した2にしたいのですが
3になってしまいます。
表示部分のみの文字列カウントをする方法ありませんか?
(countifを入力してあるセルは非表示部分もカウントしてしまいます。)

投稿日時 - 2006-05-27 10:48:12

QNo.2177898

暇なときに回答ください

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

#2>上の式をどうやって使えばいいのか
エクセルのワークシート画面でALT+F11 を押す
VBE画面になるので、
メニューの挿入から標準モジュールを選ぶ
標準モジュールでのコード入力画面になるので、
#2の回答の
切り取り線(?) より下の部分をコピーして貼り付ける
ウィンドウの×ボタンを押してVBE画面を閉じる
ワークシート画面で適当なセルで
=COUNTIFonDISP(セル範囲, 条件)
のようにして使う。(COUNTIF と用法は同じ)
#3の方が仰るように
Application.Volatile
した方がいいかもしれません。(i は必要ないけど)
もちろん関数名などは、自分の使いやすいように変更なさればよいです。
#2の利点は、内部的にCOUNTIF を呼び出しているので、
実質COUNTIF と同じであるということです。
(つまり、条件に"*○*" とか">10" とかが使えるということです)

投稿日時 - 2006-05-27 17:53:13

お礼

有難うございました。
出来ました!!
こんなやり方があったんですね。

投稿日時 - 2006-05-27 18:50:55

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

行の非表示に変更・表示に変更を関数で捉えられません。
SUBTOTALはCOUNT関数に当たる第2引数のコードはあるが、COUNTIFに当たるコードがありません。
そのほかも非表示を特別扱いする関数は無いように記憶します。
それで、Hidden状態を判別できるVBAを使わざるを得ないでしょう。
#2のご回答とほぼ同じですが
Public Function CntDisp(r As Range, cond As String) As Long
Application.Volatile
Dim count As Long
Dim x As Range
Dim i As Integer
i = 0
For Each x In r
If x.EntireRow.Hidden = False Then
If x = cond Then
count = count + 1
End If
End If
Next
CntDisp = count
End Function
を出してみます。違いは
(1)If x = "a" Then
count = count + 1
End Ifの理解のやさしさ
(2)Volatile 
ただし
http://www.moug.net/mmaga/back/066.htm のようなご注意も見つけました。
しかしf9(再計算)キーを押したときに差が出ました。
(3)しかし表示を再表示したとき、自動的には関数の結果出ている件数が戻りません。F9を押すと戻りました。

投稿日時 - 2006-05-27 17:19:40

お礼

#4の方のを参考にして出来ました。
有難うございました。

投稿日時 - 2006-05-27 18:52:00

ANo.2

可視セルを対象として実行するCOUNTIF を定義する
標準モジュールに貼り付け
countif と同じように使う
----------------------------------------------------------------
Public Function CountIFonDisp(r As Range, cond As String) As Long
Dim count As Long
Dim x As Range
For Each x In r
If x.EntireRow.Hidden = False Then
count = count + Application.WorksheetFunction.CountIf(x, cond)
End If
Next
CountIFonDisp = count
End Function

投稿日時 - 2006-05-27 15:34:31

お礼

有難うございます。
ですが上の式をどうやって使えばいいのか
分かりません。
教えて頂けると助かります。

投稿日時 - 2006-05-27 16:51:48

ANo.1

自信はありませんが、
subtotal関数を使ってはいかがですか?

=SUBTOTAL(3,A1:A7)
=SUBTOTAL(3,B1:B7)とし、
A1で○をオートフィルターで選択し
且つ
B1で×をオートフィルターで選択すると

それぞれ表示されているカウントが出るはずですが、
やりたい事とちょっとずれてたらスイマセン・・

投稿日時 - 2006-05-27 11:27:27

お礼

有難うございます。
私も最初SUBTOTALを考えたのですが
これを使うと、A8には検索前の段階で
全ての文字列の合計が表示されてしまうんですよね。
○はいくつ、△はいくつ等個別にカウント検索前、検索後にそれぞれ表示したいのですが。

投稿日時 - 2006-05-27 11:53:58

あなたにオススメの質問