Unique distinct values from multiple columns using array formula
Question: I have cell values spanning over several columns and I want to create a unique list from that range. How?
Answer:
Thanks to Eero, who contributed the original array formula!
Unique distinct text values from range tbl_text, array formula in B13:
Copy cell B13 and paste it down as far as necessary.
Unique distinct num values from range tbl_num, array formula in D13:
Copy cell D13 and paste it down as far as necessary.
Explaining array formula in cell B13
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
The array formula has two parts. One part returns row numbers and the other part returns column numbers. Let us begin with the first part, returning row numbers.
Step 1 - Find new unique distinct text values
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
COUNTIF(range,criteria) - Counts the number of cells within a range that meet the given condition
COUNTIF($B$12:B12, tbl_text)=0
becomes
COUNTIF("Text", {"Apple","Banana","Lemon";"Orange","Lemon","Apple";"Lemon","Banana","Orange"})=0
becomes
{0,0,0;0,0,0;0,0,0}=0
becomes
{TRUE,TRUE,TRUE;TRUE,TRUE,TRUE;TRUE,TRUE,TRUE}
Step 2 - Convert boolean array to row numbers
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
IF(logical_test;[value_if:true];[value_if_false]) checks whether a condition is met, and returns one value if TRUE, and another value if FALSE
IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)
becomes
IF({TRUE,TRUE,TRUE;TRUE,TRUE,TRUE;TRUE,TRUE,TRUE}, {2;3;4}-MIN({2;3;4})+1)
becomes
IF({TRUE,TRUE,TRUE;TRUE,TRUE,TRUE;TRUE,TRUE,TRUE}, {2;3;4}-MIN({2;3;4})+1)
becomes
IF({TRUE,TRUE,TRUE;TRUE,TRUE,TRUE;TRUE,TRUE,TRUE}, {2;3;4}-2+1)
becomes
IF({TRUE,TRUE,TRUE;TRUE,TRUE,TRUE;TRUE,TRUE,TRUE}, {1;2;3}) and returns {1,1,1;2,2,2;3,3,3}
Step 3 - Extract smallest value in array
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
MIN(number1,[number2])
Returns the smallest number in a set of values. Ignores logical values and text
MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1))
becomes
MIN({1,1,1;2,2,2;3,3,3}) and returns 1.
Step 4 - Part two, identify array values in current row
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
INDEX(array,row_num,[column_num]) returns a value or reference of the cell at the intersection of a particular row and column, in a given range
INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1))
becomes
INDEX(tbl_text, MIN({1,1,1;2,2,2;3,3,3}), , 1))
becomes
INDEX(tbl_text, 1, , 1)) returns array {"Apple", "Banana", "Lemon"}
Step 5 - Find new unique distinct text values in current row
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
COUNTIF(range,criteria) counts the number of cells within a range that meet the given condition
COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1))
becomes
COUNTIF("Text", {"Apple", "Banana", "Lemon"}) and returns {0,0,0}
Step 6 - Find a new unique distinct text value in current row
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
MATCH(lookup_value;lookup_array; [match_type]) returns the relative position of an item in an array that matches a specified value
MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0)
becomes
MATCH(0, {0,0,0}, 0) returns 1.
Step 7 - All together
=INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
becomes
=INDEX(tbl_text, 1, 1) returns value "Apple" in cell B13.
Explaining array formula in cell D13
=LARGE(IF(COUNTIF($D$12:D12, tbl_num)=0, tbl_num, ""), 1)
Step 1 - Remove previously extracted values above current cell with an array with boolean values
=LARGE(IF(COUNTIF($D$12:D12, tbl_num)=0, tbl_num, ""), 1)
COUNTIF(range,criteria) - Counts the number of cells within a range that meet the given condition
COUNTIF($D$12:D12, tbl_num)=0
becomes
{0,0,0;0,0,0;0,0,0}=0
becomes
{TRUE,TRUE,TRUE;TRUE,TRUE,TRUE;TRUE,TRUE,TRUE}
Step 2 - Convert boolean values to numeric values
=LARGE(IF(COUNTIF($D$12:D12, tbl_num)=0, tbl_num, ""), 1)
IF(logical_test;[value_if:true];[value_if_false]) checks whether a condition is met, and returns one value if TRUE, and another value if FALSE
IF(COUNTIF($D$12:D12, tbl_num)=0, tbl_num, "")
becomes
IF({TRUE,TRUE,TRUE;TRUE,TRUE,TRUE;TRUE,TRUE,TRUE}, {1, 2, 1;2, 4, 3;1, 3, 1}, "")
becomes
{1, 2, 1;2, 4, 3;1, 3, 1}
Step 3 - Convert boolean values to numeric values
LARGE(array,k) returns the k-th largest row number in this data set.
=LARGE(IF(COUNTIF($D$12:D12, tbl_num)=0, tbl_num, ""), 1)
becomes
=LARGE({1, 2, 1;2, 4, 3;1, 3, 1}, 1) returns 4 in cell D13.
Download excel sample file for this article.
Unique-distinct-values-from-multiple-columns-using-array-formulas.xls
(Excel 97-2003 Workbook *.xls)
Functions in this article
ROW(reference) Returns the rownumber of a reference
ROWS(array) returns the number of rows in a reference or an array
COUNTIF(range,criteria)
Counts the number of cells within a range that meet the given condition
IF(logical_test;[value_if:true];[value_if_false])
Checks whether a condition is met, and returns one value if TRUE, and another value if FALSE
MATCH(lookup_value;lookup_array; [match_type]
Returns the relative position of an item in an array that matches a specified value
INDEX(array,row_num,[column_num])
Returns a value or reference of the cell at the intersection of a particular row and column, in a given range
LARGE(array,k) returns the k-th largest row number in this data set.
MIN(number1,[number2])
Returns the smallest number in a set of values. Ignores logical values and text
This blog article is one out of thirteen articles on the same subject "unique".
- How to extract a unique distinct list from a column in excel
- Extract a unique distinct list from two columns using excel 2007 array formula
- Extract a unique distinct list from three columns in excel
- Extract distinct unique sorted year and month list from a date series in excel
- Create a unique distinct list from a date range in excel
- Unique values from multiple columns using array formulas
- Extract a unique distinct list sorted from A-Z from range in excel
- Sort a range by occurence using array formula in excel
- Filter unique distinct values from two ranges combined in excel 2007
- Create a unique list and sort by occurrances from large to small
- Unique list to be created from a column where an adjacent column has text cell values
- Create unique list from column where an adjacent column meets criteria
- How to create a unique distinct list where other columns meet two criteria
External resources:
Identifying Unique Values In An Array Or Range (VBA function)
Related blog posts
- Extract unique values from a range using array formula in excel
- Extract a unique distinct list from two columns using excel 2007 array formula
- Filter unique distinct text values using “begins with” criterion in a range using array formula in excel
- Filter unique distinct list sorted based on sum of adjacent values using array formula in excel
- Unique distinct list from a column sorted A to Z using array formula in excel







June 13th, 2009 at 2:26 pm
A slightly different approach to extract unique items from a N*M table (named as "tbl" in the formula).
So type say "Unique items from the table" in A1 and enter the following formula as an array into A2 and copy it down as far as necessary.(it is supposed column A to be free)
=INDEX(tbl,MIN(IF(COUNTIF($A$1:A1,tbl)=0,ROW(tbl)-MIN(ROW(tbl))
+1)),MATCH(0,COUNTIF($A$1:A1,INDEX(tbl,MIN(IF(COUNTIF($A$1:A1,tbl)=0,ROW(tbl)-MIN
(ROW(tbl))+1)),,1)),0),1)
June 23rd, 2009 at 9:55 pm
Thank you! Your formula is working perfectly! No need for a "helper" column!
August 25th, 2010 at 11:53 am
Hi,
How I can extend "tbl_text" as reported in your example??
I need to enlarge that range for a bigger table.
Thanks,
August 25th, 2010 at 12:16 pm
Fabio,
Use "Name Manager" to change range.
http://office.microsoft.com/en-us/excel-help/define-and-use-names-in-formulas-HA010147120.aspx
August 25th, 2010 at 12:30 pm
It works now!
Many thanks,
Fabio
November 26th, 2011 at 12:30 am
If a blank cell is located anywhere in the tbl, the formula returns the blank. I guess technically a blank is a unique value in the tbl but I'm trying to make sure only relevant numbers are returned. Any thoughts on how to correct this?
November 30th, 2011 at 3:33 pm
Curious,
Download example file:
Unique-distinct-values-from-multiple-columns-using-array-formulas-without-blanks.xls