[[20231104165922]] 『種類ごとに入力が完了しているものだけカウント』(キャン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『種類ごとに入力が完了しているものだけカウント』(キャン)

以下の表があるとして、

     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


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.