あなたの習慣について教えてください!!

お世話になります。
重複を含まずに件数を数える方法を教えて下さい。
下のような表がSHEET1にあるとしてC列に●が入っているもので
A列にある種類に対してB列にある産地の件数を重複を含まずに数えたいです。
ちなみに実際の表はA~S列まであり、1万行近くあります。
ピポットだと重複を含んで計算してしまい、困っています。
どうぞよろしくお願いします。

※EXCEL2010を使用です

SHEET1
A列   B列    C列
種類  産地   チェック
リンゴ  青森     ●
ぶどう  山梨
みかん  愛媛  ●
リンゴ  福島     ●
リンゴ  青森     ●
みかん  愛媛  ●

SHEET2
A列   B列    
種類  産地件数
リンゴ  2(※青森2、福島1件で重複分は含まないので2件)
みかん  1(※愛媛2件で重複分は含まないので1件)

※ぶどうはC列に●がないので記載しない

A 回答 (3件)

No.1です。



>1万行近くあります。
となるとオートフィルではかなり面倒なので、VBAでの一例です。

>ちなみに実際の表はA~S列まであり・・・
D列以降のデータも対象になるのか不明なので、質問文どおりA~C列までのデータとしてみました。
標準モジュールです。

Sub Sample1()
 Dim myDic1 As Object, myDic2 As Object
 Dim i As Long, lastRow As Long
 Dim myStr As String, wS As Worksheet
 Dim myKey, myItem, myR
  Set myDic1 = CreateObject("Scripting.Dictionary")
  Set myDic2 = CreateObject("Scripting.Dictionary")
  Set wS = Worksheets("Sheet2")
   lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
    If lastRow > 1 Then
     Range(wS.Cells(2, "A"), wS.Cells(lastRow, "B")).ClearContents
    End If
   With Worksheets("Sheet1")
    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, 3) <> "" Then
        myStr = myR(i, 1) & "_" & myR(i, 2)
        If Not myDic1.exists(myStr) Then
         myDic1.Add myStr, ""
         If Not myDic2.exists(myR(i, 1)) Then
          myDic2.Add myR(i, 1), 1
         Else
          myDic2(myR(i, 1)) = myDic2(myR(i, 1)) + 1
         End If
        End If
       End If
Next i
End With
  myKey = myDic2.keys
  myItem = myDic2.items
   myR = Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "B"))
    For i = 0 To UBound(myKey)
     myR(i + 1, 1) = myKey(i)
     myR(i + 1, 2) = myItem(i)
    Next i
   Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "B")) = myR
    Set myDic1 = Nothing
    Set myDic2 = Nothing
    wS.Activate
    MsgBox "完了"
End Sub

とりあえずはお望みの結果になると思います。m(_ _)m
    • good
    • 0

データベースクエリでやれば何てことない処理です。



SELECT 種類, Count(種類) As 産地件数
FROM
(SELECT Distinct 種類, 産地, チェック
FROM [Sheet1$A:C]
WHERE チェック = '●')
GROUP BY 種類
    • good
    • 0

こんにちは!



一案です。
↓の画像のように作業用の列を設けてみてはどうでしょうか?
作業列1(Sheet2のA列に重複なしに種類を表示するため)のD2セルに
=IF(AND(C2<>"",COUNTIF(A$2:A2,A2)=1),ROW(),"")

作業列2(産地件数を求めるため)のE2セルに
=IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2)=1,1,"")

という数式を入れフィルハンドルでこれ以上データはない!という位まで下へコピーしておきます。

Sheet2のA2セルに
=IFERROR(INDEX(Sheet1!A:A,SMALL(Sheet1!D:D,ROW(A1))),"")

B2セルに
=IF(A2="","",SUMIF(Sheet1!A:A,A2,Sheet1!E:E))

という数式を入れA2・B2セルを範囲指定 → B2セルのフィルハンドルで下へコピーすると
画像のような感じになります。

※ 作業列が目障りであれば、遠く離れた列にするか
非表示にしておいてください。m(_ _)m
「重複を含まずに件数を数える方法」の回答画像1
    • good
    • 0

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