• ベストアンサー

=SUBTOTAL に =COUNTIF の機能を実装

お世話になります。 掲題の件で ご相談が御座います。 =SUBTOTAL(3,U5:U63) と =COUNTIF(U5:U63,"完了") を 1つのセルで表現したいのですが これは不可能でしょうか? 本当は「U列」だけではなく、20~30列全部に そのような機能を持った関数を入れたいのですが 両方を兼ね備えた関数を どなたかご存知ないでしょうか。 ようは、その表全体にフィルタを設定しており、いくつかの条件で抽出した時に「完了」の数が変わるので 現状 自分が思いつく所で考えると別シートに移して「=COUNTIF(●:●,"完了")」を都度入れていくか? ぐらいしか思いつきません。 ・フィルタで抽出しても元の範囲選択はそのまま。 ・フィルタで抽出後に見えている選択範囲の「完了」だけを数えて欲しい ・上記2つの条件で1つのセルに数式を入力したい。 この3つの条件が満たされれば「=SUBTOTAL」や「=COUNTIF」にこだわる必要はありません。 どなたか ご存知であればご教示いただけますでしょうか。 説明が不足のようでしたら何度でも補足致しますので何卒宜しくお願い致します。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.7

またまたまた登場、myrangeです。 質問者がマクロをどの程度使えるのか分からないのでなんですが、 (質問から推測するにあまり使ったことがない?) 先に提示したマクロは関数ではありませんから データの内容が変るたびに(結果を求めたい時点で)実行しなければいけません。 もし、SUBTOTALのような関数(セルに式としてセットする)にしたければ 以下のようなユーザー定義関数を作ることになります。 '----------------------------------------------  Function Ookami(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  Ookami = Cnt End Function '--------------------------------------------- 使い方は、以下のようにします。 関数名は質問者のハンドルネームです。。(^^;;; ■Ookami(セル範囲, 検索文字)■ =Ookami(U5:U63,"完了") F5~F666の範囲で、表示されてる"連絡済"をカウントしたければ =Ookami(F5:F666,"連絡済") 要するにふつうの関数と同じような使い方になります。 以上です。  

ookami1969
質問者

お礼

何度も ご回答いただきまして 誠にありがとう御座います。 やはりVBAにほぼ不可能は無いような感じですね。 こういった事を聞かずにやれるようになりたいものです。。 気に掛けていただきましてありがとう御座いました。

その他の回答 (7)

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.8

VBA案が順当だとは思いますが、数式一発でもできなくはないので一応…。 ●セル範囲U3:U63について、  「値が"完了"であり」かつ「フィルタで表示されている」セルの数。  =SUMPRODUCT(SUBTOTAL(3,OFFSET(U2,ROW(INDIRECT("1:"&ROWS(U3:U63))),))*(U3:U63="完了")) ※U2を参照している部分は、対象範囲の直上セルを指定してください。 以上ご参考まで。

ookami1969
質問者

お礼

ご回答誠にありがとう御座います。 結論「マクロは嫌」と言われてしましまして、また 急いでいたこともあり _Kyleさんの回答を見る前に作業列を使って解決してしましました。。。 もったいないことをしました。 いただいた数式の中身を理解し、別の機会に利用させていただこうと思います。 ご対応いただきましてありがとう御座いました。

回答No.6

作業列1列使います。作業列V列として V5セルに =(SUBTOTAL(3,U5)) V63行までオートフィル(括弧をつけてください) フィルタによる表示/非表示の検査となります 結果を求める数式は =SUMIF(U5:U63,"完了",V5:V63)

ookami1969
質問者

お礼

ご回答誠にありがとう御座います。 やはり作業列を使う方が良いようですね。 ご提示いただきました数式も参考にさせていただきます。 ご対応ありがとう御座いました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

こんばんは! まったくの的外れになるかもしれませんが・・・ どうしてもオートフィルタを使わないとダメですか? 無理矢理って方法になります。 ↓の画像のようにオートフィルタを使わずに 条件だけを入力すれば その条件に合ったセルの個数と「完了」のセルの個数を 2段で表示させる方法になるのですが、 画像の場合は「ハ」の個数と「完了」個数を表示しています。 B21セル =SUMPRODUCT(($A$2:$A$19=$A$21)*(B$2:B$19<>"")) B22セル =SUMPRODUCT(($A$2:$A$19=$A$21)*(B$2:B$19=$A$22)) として、B21・B22セルを範囲指定した後にオートフィルで列方向にコピーしています。 この程度の回答しか思い浮かびませんでしたが、 的外れなら軽く読み流してくださいね。m(__)m

ookami1969
質問者

お礼

ご回答 ありがとう御座います。 フィルタを使う必要が御座いますので この方法はちょっと。。。 でも、いつも いろいろと工夫をされているtom04さんの姿勢はいつも関心させられます。 自分も見習いたいと思います。 ありがとう御座いました。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

またまた登場、myRangeです。 マクロでやりたいということなので。。。 コードの書き方はいくつかありますが、簡単なのを2つほど。 結果は、セルU1に表示するものとした場合。 '---------------------------------------  Sub Test222()  Dim Cnt As Long  Dim Rng As Range  Dim myRange As Range  Set myRange = Range("U5", Cells(Rows.Count, "U").End(xlUp))  For Each Rng In myRange.SpecialCells(xlCellTypeVisible)    If Rng.Value = "完了" Then      Cnt = Cnt + 1    End If  Next Rng  Range("U1").Value = Cnt End Sub '------------------------------------------------ Sub Test333()  Dim R As Long  Dim Cnt As Long  For R = 5 To Cells(Rows.Count, "U").End(xlUp).Row    If Cells(R, "U").Value = "完了" And _    Cells(R, "U").EntireRow.Hidden = False Then        Cnt = Cnt + 1    End If  Next R  Range("U1").Value = Cnt End Sub '--------------------------------------------- それから、お礼のコメントに >やはり作業列を追加する以外方法はないのでしょうか。。。 >現状 このシートは「DP列」までデータが入っておりまして >そろそろ限界に近づいております。。。 とありますが、DP列は最大列の半分(xl2003まで)しか使ってないですが、 それがなぜ、そろそろ限界に近づいて、となるのでしょうか。 ちょと疑問。 以上です。

ookami1969
質問者

お礼

再登場 誠にありがとう御座います。 また、VBAのコードまでいただきましてありがとう御座いました。 結論から言うと「マクロは嫌」と言われてしまいまして 関数で作業列を使ってやる事になってしまいました。。。 業務用共有資料ではなく 個人の作業用に活用させていただこうと思います。 わざわざ ありがとう御座いました。

  • Sinogi
  • ベストアンサー率27% (72/260)
回答No.3

エクセルのバージョンは何でしょうか? 当方Excel2002では =SUBTOTAL(3,U5:U63) を入力しているのセルの値は、オートフィルタの結果によりご質問の希望通りに変化します。

ookami1969
質問者

お礼

ご回答誠にありがとう御座います。 言葉足らずですみませんでした。。。 Excelは2003です。 あと、各列には「完了」と「未完了」が混在しており、フィルタの抽出条件により 都度見えている画面上「完了」と「未完了」の数が変わってきます。 なので「=SUBTOTAL」だけだと 完了、未完了の両方の合計が出て来ますので苦労しております。 何か良い方法を ご存知でしたら是非お願い致します。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

作業列を使わないなら、マクロになるでしょう。 作業列を使う方法(作業列をV列とする) V5に、  =(U5="完了")*1 と式をいれ、V63までコピーする ●求める式は、 =SUBTOTAL(9,V5:V63) となる。 作業列のV列が邪魔なら非表示にしておく。 尚、マクロなら簡単にできますが。。。 以上です。  

ookami1969
質問者

お礼

ご回答誠にありがとう御座います。 やはり作業列を追加する以外方法はないのでしょうか。。。 現状 このシートは「DP列」までデータが入っておりまして そろそろ限界に近づいております。。。 もし よろしければマクロでの解決方法を ご教示いただけませんでしょうか。 お忙しい中 大変 恐縮では御座いますが 何卒 宜しくお願い致します。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

>・フィルタで抽出後に見えている選択範囲の「完了」だけを数えて欲しい オートフィルターなら、この後、U列の▼クリックして「完了」...で良いのでは?

ookami1969
質問者

お礼

ご回答ありがとう御座います。 すみません。 言葉が足りなかったようです。 「フィルタで抽出後に見えている選択範囲の「完了」だけを数えて”表示させて”欲しい」 のです。 何か方法をご存知ないでしょうか。 宜しくお願い致します。

関連するQ&A