[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『種類ごとに入力が完了しているものだけカウント』(キャン)
以下の表があるとして、
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件)
この場合なら結果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
「〇」(U+3007)と「○」(U+25CB) の違いについて、
教えて頂きありがとうございます。
今後は「○」(U+25CB) を利用します。
また、ユーザー定義関数での回答ありがとうございます。
複数名で利用するファイルで、
全ユーザーがマクロを有効にするのが難しいので、
今回は、ユーザー定義関数を利用せず実現できたらと考えています。
折角回答を頂いたのに、申し訳ありません。
(キャン) 2023/11/06(月) 09:47:30
表のセルは全て関数が使われており、
直接入力ではなく、関数の結果の値です。
複雑な関数になることが予想される為、
計算用のセルを設けても構いません。
宜しくお願い致します。
(キャン) 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
ユーザー定義関数を使わない方法を教えて頂き、
ありがとうございました。
作業列を作る形で、実現出来ました!
(キャン) 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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.