• ベストアンサー

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

はじめまして! エクセル初心者です。過去ログを検索してみたのですが、上手く見つけられなかったので質問します。 下記のようなデータがあります。   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を入力してあるセルは非表示部分もカウントしてしまいます。)

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

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

midomonge
質問者

お礼

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

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.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を押すと戻りました。

midomonge
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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

midomonge
質問者

お礼

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

回答No.1

自信はありませんが、 subtotal関数を使ってはいかがですか? =SUBTOTAL(3,A1:A7) =SUBTOTAL(3,B1:B7)とし、 A1で○をオートフィルターで選択し 且つ B1で×をオートフィルターで選択すると それぞれ表示されているカウントが出るはずですが、 やりたい事とちょっとずれてたらスイマセン・・

midomonge
質問者

お礼

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

関連するQ&A