『種類ごとに入力が完了しているものだけカウント』(キャン) 以下の表があるとして、      A  B    C 01 種類  代表  日付  02   A  〇  2023/11/4 03   A      2023/11/4 04   A      2023/11/4 05   A  〇  2023/11/4 06   A      2023/11/4 07   A  〇  2023/11/4 08   B    09   B  〇  2023/11/4 10   B  〇  2023/11/4 11   B  〇  2023/11/4 12   C    13   C  〇 14   C   15   D  〇 16   D  〇  2023/11/4 17   E      2023/11/4 18   E      2023/11/4 種類(A列)ごとに、 代表(B列)に〇が付いている行すべてに、 日付(C列)に日付が入っている 種類数を求めたい場合、どのような関数を組めばよいでしょうか? 種類A…判定〇(〇3件全てに日付あり) 種類B…判定〇(〇3件全てに日付あり) 種類C…判定×(〇1件 日付なし) 種類D…判定×(〇2件 1件日付あり 1件日付なし) 種類E…判定×(〇0件) で、結果 2 を出したいです。 なお、D列以降でオートフィルタをかける可能性があるので、 フィルタに対応した関数にしたいです。 宜しくお願い致します。 < 使用 Excel:Microsoft365、使用 OS:Windows10 > ---- 種類A…判定〇(〇3件全てに日付あり) 種類B…判定〇(〇3件全てに日付あり) 種類C…判定×(〇1件 日付なし) 種類D…判定×(〇2件 1件日付あり 1件日付なし) 種類E…判定×(〇0件) が種類が五種類あるのに記号が○か×しかないのをまず区別したほうがいいと思います。 記号でなくとも数字にするか。 (判定マン) 2023/11/04(土) 20:25:36 ---- 失礼。意味がやっぱりわからない。 種類A…判定〇(〇3件全てに日付あり) 種類B…判定〇(〇3件全てに日付あり) 種類C…判定×(〇1件 日付なし) 種類D…判定×(〇2件 1件日付あり 1件日付なし) 種類E…判定×(〇0件) この場合なら結果2を出したいという事ですか? (判定マン) 2023/11/04(土) 20:30:35 ---- こんな? =LET(ft,FILTER(A2:C18,B2:B18="〇"),all,UNIQUE(take(ft,,1)), ext,UNIQUE(FILTER(take(ft,,1),take(ft,,-1)=0,"")),SUM(MAP(all,LAMBDA(a,NOT(OR(ISNUMBER(FIND(a,ext))))))*1)) (まる2021) 2023/11/04(土) 23:11:59 ---- >フィルタに対応した関数にしたいです。 を、見落としてました。ダメだったらスルーで、お願いします。 あと、ついでに、「〇」(U+3007) は漢数字の零ですよ。 普通「マル/バツ」の場合は、「○」(U+25CB) の丸記号を使います。 (まる2021) 2023/11/04(土) 23:36:45 ---- >フィルタに対応した関数にしたいです。 ユーザー定義関数でいいなら↓を定義して 表示したいセルに「=MyFunc(A2:C18)」で、どうでしょう? Function MyFunc&(rng As Range) Dim r As Range, cnt& Dim dic As Object, k Set dic = CreateObject("Scripting.Dictionary") For Each r In rng.Rows If Not r.Hidden Then If r.Cells(1, 2).Value = "〇" Then k = r.Cells(1, 1).Value If dic.Exists(k) Then If IsEmpty(r.Cells(1, 3).Value) Then dic(k) = Empty End If Else If r.Cells(1, 3).Value > 0 Then dic(k) = k Else dic(k) = Empty End If End If End If End If Next For Each k In dic If Not IsEmpty(dic(k)) Then cnt = cnt + 1 Next MyFunc = cnt End Function (まる2021) 2023/11/05(日) 11:42:09 ---- >判定マンさん 伝わり辛い文章で申し訳ありません。  種類A…判定〇(〇3件全てに日付あり)  種類B…判定〇(〇3件全てに日付あり)  種類C…判定×(〇1件 日付なし)  種類D…判定×(〇2件 1件日付あり 1件日付なし)  種類E…判定×(〇0件) の部分は、計算上のものであり、 求めたいのは【2】という結果のみ。という意味です。 (キャン) 2023/11/06(月) 09:41:34 ---- >まる2021さん 「〇」(U+3007)と「○」(U+25CB) の違いについて、 教えて頂きありがとうございます。 今後は「○」(U+25CB) を利用します。 また、ユーザー定義関数での回答ありがとうございます。 複数名で利用するファイルで、 全ユーザーがマクロを有効にするのが難しいので、 今回は、ユーザー定義関数を利用せず実現できたらと考えています。 折角回答を頂いたのに、申し訳ありません。 (キャン) 2023/11/06(月) 09:47:30 ---- 1点、条件面を記載し忘れておりました。 表のセルは全て関数が使われており、 直接入力ではなく、関数の結果の値です。 複雑な関数になることが予想される為、 計算用のセルを設けても構いません。 宜しくお願い致します。 (キャン) 2023/11/06(月) 09:50:26 ---- D列に作業列を作る案です。 答えは[F1]に表示、作業用のリストを[H,I]列で使用しています。 適時、ご自身の環境に合わせて下さい。 これでダメなら、自分にはお手上げです。 __A_ __B_ __C______ __D___ __E __F __G __H __I________ 1 種類 代表 日付 作業列 2 A 3 2 A 〇 2023/11/4 1 B 3 3 A 0 C -1000000000 4 A 0 D -999999999 5 A 〇 2023/11/4 1 E 0 6 A 0 7 A 〇 2023/11/4 1 8 B 0 9 B 〇 2023/11/4 1 10 B 〇 2023/11/4 1 11 B 〇 2023/11/4 1 12 C 0 13 C 〇 -1E+09 14 C 0 15 D 〇 -1E+09 16 D 〇 2023/11/4 1 17 E 2023/11/4 0 18 E 2023/11/4 0 [D2] =IF(B2="〇",IF(C2>0,1,-10^9),0)  下にコピー [F1] =COUNTIF(I1#,">0") [H1] =UNIQUE(A2:A18) [I1] =MAP(H1#,LAMBDA(a,SUM(FILTER(SUBTOTAL(109,INDIRECT("D"&ROW(2:18))),A2:A18=a,0)))) (まる2021) 2023/11/06(月) 11:24:35 ---- >まる2021さん ユーザー定義関数を使わない方法を教えて頂き、 ありがとうございました。 作業列を作る形で、実現出来ました! (キャン) 2023/11/06(月) 17:36:26 ---- こんなのも。 =LET(a,TAKE(A2:A500,XMATCH("?*",A2:A500,2,-1)), ROWS(UNIQUE(FILTER(a,BYROW(a,LAMBDA(r,(OFFSET(r,,1)="〇")*SUBTOTAL(2,OFFSET(r,,2)))))))) とか =LET(a,OFFSET(A2,,,XMATCH("?*",A2:A500,2,-1)), ROWS(UNIQUE(FILTER(a,BYROW(a,LAMBDA(r,(OFFSET(r,,1)="〇")*SUBTOTAL(2,OFFSET(r,,2)))))))) (んなっと) 2023/11/07(火) 07:36:56 ---- 最初の質問で使われていた「 〇 」で回答しています。 結局〇と○どちらかにしたのか不明なので、念のためこんなのも。 =LET(a,TAKE(A2:A500,XMATCH("?*",A2:A500,2,-1)), ROWS(UNIQUE(FILTER(a,BYROW(a,LAMBDA(r,(OFFSET(r,,1)<>"")*SUBTOTAL(2,OFFSET(r,,2)))))))) (んなっと) 2023/11/07(火) 07:50:00