プロが教えるわが家の防犯対策術!

重複を除いてデータ数をカウントする「関数」を教えてください。よろしくお願いいたします。
単純に全データからカウントするのであれば、sumproduct等を使えばできますが、困っているのは、一部のデータ(晴のみ)から、重複データを除いて(同じ日に複数回稼働していても1とカウント)集計するという点です。

稼働日  天気  管理番号
2月10日  晴   10022
2月20日  晴   31555
2月20日  晴   10022
2月20日  晴   10022
2月20日  晴   10022
2月24日  晴   44200
2月25日  雨   31555
2月25日  雨   10022

【導きたい答え】
「晴れの日」の「管理番号10022」の稼働日数は、「2」日でした。
(4個ではなく、2個(2日)とカウントしたい)

*Excel2016を使用しています。
*実際はもっと多くのデータが対象となります。あくまで例は簡略化したものです。
*ピボットやVBA?ではなく、エクセル関数で求めたいです。
*可能であれば、作業領域でいったん計算して再集計する等ではなく、一度で求められる方法がいいです。

質問者からの補足コメント

  • 「作業領域でいったん計算して再集計する等ではなく、一度で求められる方法希望」と書きましたが、無理そうであれば、いったん「作業領域」で計算する方法でもかまいません。

    改めてピボットやVBAは対象外でお願いします。

      補足日時:2018/04/21 20:43
  • HAPPY

    出来ました!

    すみません、いろいろ試していたら、2になりました!
    入力項目だったんですね。
    ありがとうございます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/04/21 20:46

A 回答 (4件)

No.1です。



ユーザー定義関数の方法をと思っていましたが、VBAはダメ!というコトなので・・・
ただ作業用の列は使ってもOKのようなので、一例です。

↓の画像のようにD列を作業用の列としています。
作業列D2セルに
=IF(AND(B2=G$1,C2=G$2),IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2,C$2:C2,C2)=1,1,""),"")

という数式を入れこれ以上データはない!というくらいまで下へフィル&コピー!
結果のG3セルには
=SUM(D:D)
という数式を入れています。m(_ _)m
「Excel 重複を除いてデータ数をカウン」の回答画像3
    • good
    • 0
この回答へのお礼

ありがとうございます。
とてもすっきりとした式で求められるのでびっくりしました。

=IF(AND(B2=G$1,C2=G$2),IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2,C$2:C2,C2)=1,1,""),"")

この式なんですが、IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2,C$2:C2,C2)=1,1,""),"")
の部分って何を計算?しているんでしょうか。
稼働日の情報、天気の情報、管理番号の情報が 1,1,空白 ならば、空白?

お礼日時:2018/04/21 22:13

No.3です。



>IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2,C$2:C2,C2)=1,1,""),"")
>の部分って何を計算?しているんでしょうか。

説明を少しだけ・・・
前半部分の
>IF(AND(B2=G$1,C2=G$2)
は問題ないですよね。
(画像のB列がG1、C列がG2と一致するものだけを対象としています)

さて、上記のIF関数が「TRUE」の場合ですが
前回アップした画像の配置で
2行目から検索し
A列・B列・C列が重複するデータがある場合、最初に出現する行だけに「1」が表示されるようにしています。
これが質問文の中で一番重要な部分になると思います。

※ どこか使っていない列の2行目に
=COUNTIFS(A$2:A2,A2,B$2:B2,B2,C$2:C2,C2)

という数式を入れ、フィルハンドルで下へコピーしてみてください。
2行目以降、A~C列が重複するデータの出現回数が表示されます。
その中の最初に出現した行だけ(「1」の行だけ)を作業列に表示するようにしています。

あとは単純にプラスすれば質問の回答がそのまま簡単に導き出せます。
    • good
    • 1
この回答へのお礼

とても参考になりました。
ありがとうございます!!!

お礼日時:2018/04/25 20:11

添付図参照


D1: =A2&"_"&B2&"_"&C2
E2: =IF(COUNTIF(D$2:D2,D2)>1,"",A2)
F2: =IF(AND(B2=G$3,C2=G$2),E2,"")
F1: =COUNT(F2:F500)
「Excel 重複を除いてデータ数をカウン」の回答画像2
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
関数を入れてみたのですが、下記の通り「0」となります。
色がついている箇所(稼働日数や管番、天)というのがよくわかりません。
そこは手入力すべきなのか、自動で返ってくるものなのでしょうか。
Fの列はちゃんと計算式を入れても空白の結果となります。

稼働日 天気 管理番号 稼働日_天気_管理番号         0
2月10日 晴 10022  43141_晴_10022  2月10日
2月20日 晴 31555  43151_晴_31555  2月20日
2月20日 晴 10022  43151_晴_10022  2月20日
2月20日 晴 10022  43151_晴_10022 
2月20日 晴 10022  43151_晴_10022 
2月24日 晴 44200  43155_晴_44200  2月24日
2月25日 雨 31555  43156_雨_31555  2月25日
2月25日 雨 10022  43156_雨_10022  2月25日

お礼日時:2018/04/21 20:39

こんばんは!



関数で作業列なしで!となると結構厄介だと思います。
手っ取り早くVBAでの一例です。
↓の画像のような配置になっていて、
F1・F2セルに各条件を入力した時点でマクロが実行されるようにしてみました。
シートモジュールにしてください。

Private Sub Worksheet_Change(ByVal Target As Range) '//この行から//
If Intersect(Target, Range("F1:F2")) Is Nothing Or Target.Count > 1 Then Exit Sub
Dim myDic As Object
Dim i As Long, lastRow As Long, cnt As Long
Dim myStr As String
Dim myR
If WorksheetFunction.CountBlank(Range("F1:F2")) = 0 Then
Set myDic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(Cells(2, "A"), Cells(lastRow, "C"))
For i = 1 To UBound(myR, 1)
If myR(i, 2) = Range("F1") And myR(i, 3) = Range("F2") Then
myStr = myR(i, 1) & "_" & myR(i, 2) & "_" & myR(i, 3)
If Not myDic.exists(myStr) Then
myDic.Add myStr, ""
cnt = cnt + 1
End If
End If
Next i
Range("F3") = cnt
Set myDic = Nothing
Else
Range("F3").ClearContents
End If
End Sub '//この行まで//

※ A~C列の変更ではマクロは動きません。
F1またはF2セルのデータが変わった時点でマクロが実行されます。m(_ _)m
「Excel 重複を除いてデータ数をカウン」の回答画像1
    • good
    • 0
この回答へのお礼

質問文の通りVBAは対象外です。

お礼日時:2018/04/21 20:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A