43

I've got a large table that is already organized using filters etc. I'd like to add a summary underneath certain columns that contain the number of distinct values in that column.

There's no function =COUNTDISTINCT(A2:A100) so what can I do instead? (Excel 2003)

I can't exactly use answers to this similar question because I don't want to modify the table or the filtering. I need an addition in the worksheet, not a modification.

9 Answers9

40
=SUMPRODUCT((A2:A100 <> "")/COUNTIF(A2:A100,A2:A100 & ""))

will do it without having to use an array formula.

8

I found a solution here which seems to be an incredible roundabout way to solve it. But hey, it works...

=SUM(IF(COUNTIF(A2:A100,A2:A100)=0, "", 1/COUNTIF(A2:A100,A2:A100)))

and then press Ctrl+Shift+Enter. Pressing only Enter will give the wrong result.

Excellll
  • 12,847
4

In Excel 365, you can use

=COUNTA(UNIQUE('Sheet 1'!C1:C100))

to count the unique values.

Function Explanation:

  1. UNIQUE('Sheet 1'!C1:C100,) returns the distinct values from the range C1 to C100.
  2. COUNTA() takes these unique values as input and returns the count.
matrix
  • 477
3

This article shows this for text values:

=SUM(IF(FREQUENCY(IF(LEN(C3:C25)>0,MATCH(C3:C25,C3:C25,0),""), IF(LEN(C3:C25)>0,MATCH(C3:C25,C3:C25,0),""))>0,1))

and this for numeric values:

=SUM(IF(FREQUENCY(C3:C25, C3:C25)>0,1))

This article shows similar formulas, but also shows a method using filters.

Count the number of unique values by using a filter

You can use the Advanced Filter to extract the unique values from a column of data and paste them to a new location. Then you can use the ROWS function to count the number of items in the new range.

  1. Ensure that the first row in the column has a column header.
  2. On the Data menu, point to Filter, and then click Advanced Filter.
  3. In the Advanced Filter dialog box, click Copy to another location.
  4. If the range that you are counting is not already selected, delete any information in the List range box and then click the column (or select the range) that contains your data.
  5. In the Copy to box, delete any information in the box or click in the box, and then click a blank column where you want to copy the unique values.
  6. Select the Unique records only check box, and click OK.

    The unique values from the selected range are copied to the new column.

  7. In the blank cell below the last cell in the range, enter the ROWS function. Use the range of unique values that you just copied as the argument. For example, if the range of unique values is B1:B45, then enter:
    =ROWS(B1:B45)

2

=SUM(1/COUNTIF(A2:A100;A2:A100))

Confirm with Ctrl+Shift+Enter

For each cell, it counts how many times it occurs, and summes the inverses of all these values. Suppose some string or number occus 5 times. Its inverse is 0.2 which get summed 5 times, so 1 is added. In the end it gives the number of different values.

Note: doesn't work when blanks occur!

1

Found two resources for you:

http://www.excelforum.com/excel-worksheet-functions/365877-count-distinct-values.html

and

http://www.cpearson.com/excel/Duplicates.aspx

You should be able to find a workable solution from there.

Sux2Lose
  • 3,367
0

I would recommend a user-defined function in VBA to provide this capability if you can. I believe this one is reasonable and portable and all that, that I have been using:

Function countUnique(ByRef inputRange As Range) As Long
  Dim uniqueDict As Object
  Set uniqueDict = CreateObject("scripting.dictionary")
  For Each cc In inputRange.Cells
    If Not uniqueDict.exists(cc.Value) Then
      uniqueDict.Add cc.Value, cc.Value
    End If
  Next cc 'cell
  countUnique = uniqueDict.Count
End Function

Then just call that function as normal in your desired cell with: '=countUnique(<MY_RANGE>)'

0

Try this link. This shows how to count unique values in a list omitting blank cells.

http://www.functioninexcel.com/lists-arrays/count-unique-values-in-a-list/

= sum( if( frequency( match( List , List , 0 ) , match( List , List , 0 )) > 0 , 1 ))

Where "List" is your range of cells for example:

List = $A$2:$A$12 OR- List = offset($A$1,,,match( rept("z",255) , $A:$A )) -OR- List = offset($A$1,,,match( value(rept("9",255)) , $A:$A ))

0

=SUM(IF(FREQUENCY(IF(SUBTOTAL(3,OFFSET(A2:A100,ROW(A2:A100)-ROW(A2),0,1)),MATCH("~"&A2:A100,A2:A100&"",0)),ROW(A2:A100)-ROW(A2)+1),1))

Be sure to hit CONTROL+SHIFT+ENTER after pasting this formula. This is for a range of A2:A100, adjust the range accordingly.

Vlada
  • 1