You are on page 1of 19

# How to extract a unique distinct list from a column

Overview Unique distinct values are all cell values but duplicate values are removed.

Thanks to Eero, who contributed the original array formula! Example sheet - How to remove duplicate values Column A contains names, some cells have duplicate values. An array formula in column B extracts an unique distinct list from column A.

Thanks, Eero!

## How to create an array formula

1. Copy above array formula. 2. Double click cell B2. 3. Paste (Ctrl + v). 4. Press and hold Ctrl + Shift. 5. Press Enter.

## 6. Release all keys. and copy cell B2 down as far as necessary.

Named ranges
In excel you can name a cell range, a constant or a formula. You can then use the named range in a formula, making it easier for you to read and understand formulas. Example List : A2:A20 Tip! Use dynamic named ranges to automatically adjust cell ranges when new values are added or removed. How to create a named range 1. Select cell range A2:A20 2. Type List in name box 3. Press Enter

Array formula and named range in cell B2: =INDEX(List,MATCH(0,COUNTIF(\$B\$1:B1,List),0)) Excel 2007 users can remove errors using iferror() function:

=IFERROR(INDEX(List,MATCH(0,COUNTIF(\$B\$1:B1,List),0)),"") + CTRL + SHIFT + ENTER and copy it down as far as necessary. The formula is an array formula. To create an array formula you press Ctrl + Shift + Enter after you have entered the formula. Excel 2003 users can remove errors using isna() function: =IF(ISNA(INDEX(List, MATCH(0, COUNTIF(\$B\$1:B1, List), 0))), "", INDEX(List, MATCH(0, COUNTIF(\$B\$1:B1, List), 0))) + CTRL + SHIFT + ENTER and copy it down as far as needed. How to handle blank cells in a range =INDEX(List,MATCH(0,IF(ISBLANK(List),"",COUNTIF(\$B\$1:B1,List)),0)) + CTRL + SHIFT + ENTER and copy it down as far as needed. Thanks Sean! A somewhat shorter array formula: =INDEX(List,MATCH(0,(List="")+COUNTIF(\$B\$1:B1,List)),0)) + CTRL + SHIFT + ENTER and copy it down as far as needed. How the array formula in cell B2 works Step 1 - Create an array with the same size as the list =INDEX(List,MATCH(0,COUNTIF(\$B\$1:B1,List),0)) COUNTIF(range,criteria) Counts the number of cells within a range that meet the given condition COUNTIF(\$B\$1:B1,List) returns an array containing either 1 or 0 based on if \$B\$1:B1 is found somewhere in the array List . COUNTIF(\$B\$1:B1,List) becomes COUNTIF("Unique distinct list",{Federer,Roger; Djokovic,Novak; Murray,Andy; Davydenko,Nikolay; Roddick,Andy; DelPotro,JuanMartin; Federer,Roger; Davydenko,Nikolay; Verdasco,Fernando; Gonzalez,Fernando; Wawrinka,Stanislas; Gonzalez,Fernando; Blake,James; Nalbandian,David; Robredo,Tommy; Wawrinka,Stanislas; Cilic,Marin; Stepanek,Radek; Almagro,Nicolas} ) and returns: {0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}

This means the cell value in \$B\$1:B1 cant be found in any of the cells in the named range List. If it had been found, somewhere in the array the number 1 would exist. Step 2 - Return the position of an item that matches 0 (zero) 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\$1:B1,List),0) becomes MATCH(0,{0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0},0) and returns 1. Step 3 - Return a cell 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. =INDEX(List,1) becomes =INDEX({Federer,Roger; Djokovic,Novak; Murray,Andy; Davydenko,Nikolay; Roddick,Andy; DelPotro,JuanMartin; Federer,Roger; Davydenko,Nikolay; Verdasco,Fernando; Gonzalez,Fernando; Wawrinka,Stanislas; Gonzalez,Fernando; Blake,James; Nalbandian,David; Robredo,Tommy; Wawrinka,Stanislas; Cilic,Marin; Stepanek,Radek; Almagro,Nicolas}, 1) and returns "Federer, Roger" Relative and absolute cell references When you copy the array formula down the countif formula range (\$B\$1:B1) expands. This is created by using relative and absolute references. The first cell, B2: COUNTIF(\$B\$1:B1,List) Second cell, B3: COUNTIF(\$B\$1:B2,List) and so on.

## Create a dynamic ranged name

In this post I am going to explain the dynamic named range formula in Sam's comment. The formula adds new rows and columns instantly to the named range. This makes the named range dynamic meaning you dont need to adjust cell references every time you add a new row or column to the list. The formula takes care of only one list per sheet.

## How to create a named range in excel 2007

1. Click "Formulas" tab on the ribbon.

2. Click "Name Manager". 3. Create a new named range and name it. 4. Type the formula below in "Refers to:" window: 5. Click close button.

## Named range forumla:

=Sheet1!\$A\$1:INDEX(Sheet1!\$1:\$65535, COUNTA(Sheet1!\$A:\$A), COUNTA(Sheet1!\$1:\$1))

Explaining formula
Step 1 - Count the number of cells in column A that are not empty =Sheet1!\$A\$1:INDEX(Sheet1!\$1:\$65535, COUNTA(Sheet1!\$A:\$A), COUNTA(Sheet1!\$1:\$1)) becomes =Sheet1!\$A\$1:INDEX(Sheet1!\$1:\$65535, 4, COUNTA(Sheet1!\$1:\$1)) Step 2 - Count the number of cells in row 1 that are not empty =Sheet1!\$A\$1:INDEX(Sheet1!\$1:\$65535, COUNTA(Sheet1!\$A:\$A), COUNTA(Sheet1!\$1:\$1)) becomes =Sheet1!\$A\$1:INDEX(Sheet1!\$1:\$65535, 4, 3) Step 3 - Return a reference of the cell at the intersection of a particular row and column =Sheet1!\$A\$1:INDEX(Sheet1!\$1:\$65535, COUNTA(Sheet1!\$A:\$A), COUNTA(Sheet1!\$1:\$1)) becomes =Sheet1!\$A\$1:\$C\$4 This cell reference changes whenever new rows or columns are added or removed.

## Possible scenarios when to use named ranges

Formulas, making them dynamic and easier to read and understand. Charts (How to create a dynamic chart) Pivot tables (Create a dynamic pivot table and refresh automatically in excel)

COUNTA(value1,[value2],) Counts the number of cells in a range that are not empty 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

## Creating a dependant drop down list containing unique distinct values

Here is a list of order numbers and products.

We are going to create two drop down lists. The first drop down list contains unique distinct values from column A. The second drop down list contains unique distinct values from column B, based on chosen value in the first drop down list. Create a dynamic named range 1. Click "Formulas" tab 2. Click "Name Manager" 3. Click "New..." 4. Type a name. I named it "order". (See attached file at the end of this post)

5. Type =OFFSET(Sheet1!\$A\$2,0,0,COUNTA(Sheet1!\$A\$2:\$A\$1000)) in "Refers to:" field. 6. Click "Close" button Create a unique distinct list from column A 1. Select Sheet2 2. Select cell A2 3. Type "=INDEX(order,MATCH(0,COUNTIF(\$A\$1:A1,order),0))" + CTRL + SHIFT + ENTER 4. Copy cell A2 and paste it down as far as needed. Create a dynamic named range to get unique distinct list 1. Select Sheet2 2. Click "Formulas" tab 3. Click "Name Manager" 4. Click "New..." 5. Type a name. I named it "uniqueorder". (See attached file at the end of this post) 6. Type =OFFSET(Sheet2!\$A\$2, 0, 0, COUNT(IF(Sheet2!\$A\$2:\$A\$1000="", "", 1)), 1) in "Refers to:" field. 7. Click "Close" button Create drop down list 1. Select Sheet1 2. Select cell D2 3. Click Data tab 4. Click Data validation button 5. Click "Data validation..." 6. Select List in the "Allow:" window. 7. Type =uniqueorder in the "Source:" window 8. Click OK! Here is a picture of what we have accomplished so far.

How to create a secondary unique list based on only one chosen cell value in first drop down list
Create a dynamic named range 1. Click "Formulas" tab 2. Click "Name Manager" 3. Click "New..." 4. Type a name. I named it "product". (See attached file at the end of this post) 5. Type =OFFSET(Sheet1!\$B\$2,0,0,COUNTA(Sheet1!\$B\$2:\$B\$1000)) in "Refers to:" field. 6. Click "Close" button Create a unique distinct list from column B 1. Select Sheet2 2. Select cell B2 3. Type "=INDEX(product, MATCH(0, COUNTIF(\$B\$1:B1, product)+(order<>Sheet1!\$D\$2), 0))" + CTRL + SHIFT + ENTER 4. Copy cell B2 and paste it down as far as needed. Create a dynamic named range to get unique distinct list 1. Select Sheet2 2. Click "Formulas" tab 3. Click "Name Manager" 4. Click "New..." 5. Type a name. I named it "uniqueproduct". (See attached file at the end of this post)

6. Type =OFFSET(Sheet2!\$B\$2, 0, 0, COUNT(IF(Sheet2!\$B\$2:\$B\$1000="", "", 1)), 1) in "Refers to:" field. 7. Click "Close" button Create drop down list 1. Select Sheet1 2. Select cell D5 3. Click Data tab 4. Click Data validation button 5. Click "Data validation..." 6. Select List in the "Allow:" window. 7. Type =uniqueproduct in the "Source:" window 8. Click OK!

Download example workbook unique distinct dependent lists.xls (Excel 97-2003 Workbook *.xls) Download example workbook with a third column of data unique-distinct-dependent-lists1 three columns.xls (Excel 97-2003 Workbook *.xls)

Related article: Create a drop down list containing only unique distinct alphabetically sorted text values using excel array formula

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 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 COUNT(value1;[value2]) Counts the number of cells in a range that contain numbers OFFSET(reference,rows,cols, [height],[width]) Returns a reference to a range that is a given number of rows and columns from a given reference MATCH(lookup_value;lookup_array; [match_type]) Returns the relative position of an item in an array that matches a specified value COUNTIF(range,criteria) Counts the number of cells within a range that meet the given condition COUNTA(value1,[value2],) Counts the number of cells in a range that are not empty

## Dependent Drop Down Lists AddIn

Dependent drop down lists is an AddIn for Excel 2007/2010 that lets you easily create drop down lists (comboboxes, form controls) in Microsoft Excel.

## What are dependent drop down lists?

A dependent drop down list changes its values automatically depending on selected values in previous drop down lists on the same row.

Example
The first drop down list in the picture above contains values from "Region" column. The second drop down list contains values from "Country" column and the third from City column. Now depending on the selected value in the first drop down list, the second and third drop down lists change their values automatically. In the picture above, the first drop down list has the value "Europe" selected, the second "France and in the third you can choose between "Lyon" or "Paris". You can see how the columns are related to each other if you examine the table above.

Features

Utilizes a pivot table to quickly filter and sort values for maximum speed The drop down lists are populated using Visual Basic for Applications No excel formulas Easily copy values: Each drop down list is linked to the cell behind. You can create as many drop down lists you want You can send workbooks containing dependent drop down lists to friends, colleagues etc, as long as they can open macro-enabled workbooks.

For simplicity, your data set must be an excel table. That is easily created if you dont know how. A vba macro is required in your workbook. The AddIn shows you how in a few simple steps.

Create a drop down list containing only unique distinct alphabetically sorted text values

## Array formula in cell B2

=INDEX(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0))
How to create an array formula 1. Select cell B2 2. Type above array formula 3. Press and hold Ctrl + Shift 4. Press Enter once 5. Release all keys How to copy array formula 1. Select cell B2 2. Copy (Ctrl + c) 3. Select cell range B3:B6 4. Paste (Ctrl + v)

## Explaining array formula in cell B2

=INDEX(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0)) Step 1 - Convert text to numbers =INDEX(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0)) COUNTIF(range,criteria) counts the number of cells within a range that meet the given condition COUNTIF(List, ">"&List)+1

becomes COUNTIF({"DD";"EE";"FF";"EE";"GG";"BB";"FF";"GG";"DD";"TT";"FF";"VV";"VV";"FF"}, ">"&{"DD";"EE";"FF";"EE";"GG";"BB";"FF";"GG";"DD";"TT";"FF";"VV";"VV";"FF"})+1 becomes {11;9;5;9;3;13;5;3;11;2;5;0;0;5}+1 becomes {12;10;6;10;4;14;6;4;12;3;6;1;1;6} Step 2 - Identify previous unique text values above current cell =INDEX(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0)) COUNTIF(range,criteria) counts the number of cells within a range that meet the given condition NOT(COUNTIF(\$B\$1:B1, List)) becomes NOT(COUNTIF("Unique list sorted alpabetically", {"DD";"EE";"FF";"EE";"GG";"BB";"FF";"GG";"DD";"TT";"FF";"VV";"VV";"FF"})) becomes NOT({0;0;0;0;0;0;0;0;0;0;0;0;0;0}) becomes {1;1;1;1;1;1;1;1;1;1;1;1;1;1} Step 3 - Calculate maximum number in array =INDEX(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0)) MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1)) becomes MAX({1;1;1;1;1;1;1;1;1;1;1;1;1;1}*({12;10;6;10;4;14;6;4;12;3;6;1;1;6}) and returns 14. Step 4 - Convert maximum number into Boolean value =INDEX(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0)) IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1) becomes IF(14={12;10;6;10;4;14;6;4;12;3;6;1;1;6}, 0, 1) and returns this array: {1;1;1;1;1;0;1;1;1;1;1;1;1;1} Step 4 - Return the relative position of an item in an array

=INDEX(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0)) MATCH(lookup_value;lookup_array; [match_type]) returns the relative position of an item in an array that matches a specified value MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0) becomes MATCH(0, {1;1;1;1;1;0;1;1;1;1;1;1;1;1}, 0) and returns value 6. Step 5 - Return a value of the cell at the intersection of a particular row and column 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(List, MATCH(0, IF(MAX(NOT(COUNTIF(\$B\$1:B1, List))*(COUNTIF(List, ">"&List)+1))=(COUNTIF(List, ">"&List)+1), 0, 1), 0)) becomes =INDEX(List, 6) becomes =INDEX({"DD";"EE";"FF";"EE";"GG";"BB";"FF";"GG";"DD";"TT";"FF";"VV";"VV";"FF"}, 6) and returns value BB.

## Create a dynamic named range

1. Click "Formulas" tab 2. Click "Name Manager" 3. Click List 4. Type =OFFSET(Sheet1!\$A\$2, 0, 0, COUNT(IF(Sheet1!\$A\$2:\$A\$1000="", "", 1)), 1) in "Refers to:" field. 5. Click "Close" button

Named range
List (dynamic) What is named ranges?

How to create a drop down list with values updated dynamically in excel 2007
1. Click Data tab 2. Click Data validation button 3. Click "Data validation..." 4. Select List in the "Allow:" window. See picture below. 5. Type =OFFSET(\$B\$2, 0, 0, COUNT(IF(\$B\$2:\$B\$1000="", "", 1)), 1) in the "Source:" window 6. Click OK!

Create-a-drop-down-list-containing-only-unique.xls (Excel 97-2003 Workbook *.xls)

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 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 SMALL(array,k) returns the k-th smallest row number in this data set. ROW(reference) returns the rownumber of a reference MATCH(lookup_value;lookup_array; [match_type]) Returns the relative position of an item in an array that matches a specified value COUNTIF(range,criteria) Counts the number of cells within a range that meet the given condition COUNT(value1;[value2]) Counts the number of cells in a range that contain numbers OFFSET(reference,rows,cols, [height],[width]) Returns a reference to a range that is a given number of rows and columns from a given reference

## Array formula in cell B2:B8000:

=FilterUniqueSort(\$A\$2:\$A\$8212)
How to create array formula 1. Select cell range B2:B8000 2. Type array formula above 3. Press and hold Ctrl + Shift 4. Press Enter once 5. Release all keys VBA code You can find the selectionsort function here: Using a Visual Basic Macro to Sort Arrays in Microsoft Excel
Function FilterUniqueSort(rng As Range) Dim ucoll As New Collection, Value As Variant, temp() As Variant ReDim temp(0) On Error Resume Next For Each Value In rng If Len(Value) > 0 Then ucoll.Add Value, CStr(Value) Next Value On Error GoTo 0 For Each Value In ucoll temp(UBound(temp)) = Value ReDim Preserve temp(UBound(temp) + 1) Next Value

ReDim Preserve temp(UBound(temp) - 1) SelectionSort temp FilterUniqueSort = Application.Transpose(temp) End Function Function SelectionSort(TempArray As Variant) Dim MaxVal As Variant Dim MaxIndex As Integer Dim i, j As Integer ' Step through the elements in the array starting with the ' last element in the array. For i = UBound(TempArray) To 0 Step -1 ' Set MaxVal to the element in the array and save the ' index of this element as MaxIndex. MaxVal = TempArray(i) MaxIndex = i ' Loop through the remaining elements to see if any is ' larger than MaxVal. If it is then set this element ' to be the new MaxVal. For j = 0 To i If TempArray(j) > MaxVal Then MaxVal = TempArray(j) MaxIndex = j End If Next j ' If the index of the largest element is not i, then ' exchange this element with element i. If MaxIndex < i Then TempArray(MaxIndex) = TempArray(i) TempArray(i) = MaxVal End If Next i End Function

Where to copy vba code? 1. Press Alt + F11 2. Insert a module into your workbook 3. Copy (Ctrl + c) above code into the code window Download excel 97-2003 *,xls file

Create-a-drop-down-list-containing-only-unique_vba.xls

Recommended categories