プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。

エクセルについて質問させていただければと思います。
以下の値があるとき、”A列の特定の値の中でB列の重複したものを除外したデータ数をカウントしたく”思っております。
(あくまでも例なので、実際に作業を行うデータは数千行あります。)

A列  B列 
あ  アイス
あ  アイス
あ  プリン
あ  ケーキ
い  ケーキ
い  プリン
う  アイス
う  だんご
う  アイス

つまり、上記の値で考えると
下のような結果となります。

あ…3(個)
い…2(個)
う…2(個)

A列をフィルタしてから、カウントする方法もありますでしょうが
こちらに関しまして関数のみで処理できますでしょうか

何卒お願いいたします。

A 回答 (5件)

[No.3]は下記でも良さそうです。



E1: =A1&B1
C1: =IF(COUNTIF(A$1:A1,A1)=1,SUMPRODUCT((A$1:A$9=A1)*(1/COUNTIF(E$1:E$9,E$1:E$9))),"")
「指定行の特定の値をカウントしたい(エクセ」の回答画像5
    • good
    • 0

こんにちは



>関数のみで処理できますでしょうか
すでに回答がでていますが、別方法の一例です。


>A列の特定の値の中で~~
「特定の値」というのは個別に指定するのか、あるいは表全体から一覧的にリストアップするのかわかりませんでしたので、ひとまずリストアップする方で・・・


A、B列にデータがあるとして、D、E列にリストとカウント結果の表を作成します(添付図参照)
まず、A列から重複のない「値のリスト」をD列に作成します。
D1セルに
=IFERROR(INDEX(A:A,AGGREGATE(15,6,INDEX(ROW(A$1:A$1000)/(COUNTIF(OFFSET(A$1,0,0,ROW(A$1:A$1000)),A$1:A$1000)=1),,),ROW(A1))),"")
の式を入れて、下方にフィルコピーすることでリストが作成されます。

このリストの各値に対して、ご質問のカウント結果をE列に算出します。
E1セルに
=IF(D1="","",SUM(INDEX(IFERROR((MATCH(D1&B$1:B$1000,A$1:A$1000&B$1:B$1000,0)=ROW(A$1:A$1000))*1,0),,)))
の式を入力し、Ctr+Shift+Enterで確定します。(←必須です)
確定後、下方にフィルコピーすると、それぞれの値に対するカウント結果が表示されます。

>データは数千行あります
※ 上の式は1~1000行を対象として作成してありますので、実際に応じて範囲を修正する必要があります。
※ 計算が配列計算になっていますので、必要以上に範囲を大きくしずぎると、計算に時間が掛かってしまう可能性があります。
「指定行の特定の値をカウントしたい(エクセ」の回答画像4
    • good
    • 1

E1: =A1&B1


F1: =1/COUNTIF(E$1:E$9,E1)
C1: =IF(COUNTIF(A$1:A1,A1)=1,SUMPRODUCT((A$1:A$9=A1)*(F$1:F$9)),"")
「指定行の特定の値をカウントしたい(エクセ」の回答画像3
    • good
    • 0

こんばんは!



関数での方法をご希望だというコトですが、
手っ取り早くVBAでの一例です。
元データはSheet1にあり、Sheet2に表示するとします。
尚、Sheet1の1行目は項目行でデータは2行目以降にあるという前提です。

一例です。
標準モジュールにしてください。

Sub Sample1()
 Dim myDic As Object
 Dim i As Long, k As Long, lastRow As Long
 Dim myStr As String, wS As Worksheet, myFlg As Boolean
 Dim myKey, myItem, myR, myAry

  Set myDic = CreateObject("Scripting.Dictionary")
  Set wS = Worksheets("Sheet2")
   wS.Range("A:B").ClearContents
    With Worksheets("Sheet1")
     wS.Range("A1") = .Range("A1")
     wS.Range("B1") = "個数"
      lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
       myR = Range(.Cells(2, "A"), .Cells(lastRow, "B"))
        For i = 1 To UBound(myR, 1)
         If Not myDic.exists(myR(i, 1)) Then
          myDic.Add (myR(i, 1)), myR(i, 2)
         Else
          myStr = myDic(myR(i, 1))
          myAry = Split(myStr, "_")
           For k = 0 To UBound(myAry)
            If myR(i, 2) = myAry(k) Then
             myFlg = True
             Exit For
            End If
           Next k
            If myFlg = False Then
             myStr = myStr & "_" & myR(i, 2)
             myDic(myR(i, 1)) = myStr
            End If
         End If
          myFlg = False
        Next i
    End With
     myKey = myDic.keys
     myItem = myDic.items
      myR = Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "B"))
       For i = 0 To UBound(myKey)
        myAry = Split(myItem(i), "_")
         myR(i + 1, 1) = myKey(i)
         myR(i + 1, 2) = UBound(myAry) + 1
       Next i
      Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "B")) = myR
       Set myDic = Nothing
       MsgBox "完了"
End Sub

※ コードは長いですが、ほとんど時間を要しないと思います。
※ 関数でないので
データ変更があるたびにマクロを実行する必要があります。

どうしても関数での方法をご希望の場合、
作業用の列を2列くらい設ければ対応できると思いますが
まずはこの程度で・・・m(_ _)m
    • good
    • 0

市役所などの自治体が行っているパソコン相談で相談したほうが良いと思います。

    • good
    • 0

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