Making a dependent (cascading) drop down list in Excel

A while ago we started to explore the capabilities of Excel Data Validation and learned how to create a simple drop-down list in Excel based on a comma-separated list, range of cells or a named range.

Today, we are going to investigate this feature in-depth and learn how to create cascading drop down lists that display choices depending on the value selected in first dropdown. To put it differently, we will make an Excel data validation list based on the value of another list.

How to create multiple dependent dropdown in Excel

Making a multi-level dependent drop-down lists in Excel is easy. All you need is a few named ranges and the INDIRECT formula. This method works with all versions of Excel 365 - 2010 and earlier.

1. Type the entries for the drop-down lists

First off, type the entries you want to appear in the drop-down lists, each list in a separate column. For example, I'm creating a cascading dropdown of fruit exporters and column A of my source sheet (Fruit) includes the items of the first dropdown and 3 other columns list the items for the dependent dropdowns.
Type the entries you want to appear in the main and dependent drop-down lists.

2. Create named ranges

Now you need to create names for your main list and for each of the dependent lists. You can do this either by adding a new name in the Name Manager window (Formulas tab > Name Manager > New) or typing the name directly in the Name Box.
Creating a named range

Note. Please pay attention that if your first row is sort of column header like you see in the screenshot above, you shall not include it in the named range.

For the detailed step-by-step instructions please see How to define a name in Excel.

Things to remember:

  1. The items to appear in the first drop-down list must be one-word entries, e.g. Apricot, Mango, Oranges. If you have items consisting of two, three or more words, please see How to create a cascading dropdown with multi-word entries.
  2. The names of the dependent lists must be exactly the same as the matching entry in main list. For example, the dependent list to be displayed when "Mango" is selected from the first drop-down list should be named Mango.

When done, you may want to press Ctrl+F3 to open the Name Manager window and check if all of the lists have correct names and references.
Verifying the ranges' names and references

3. Make the first (main) drop-down list

  1. In the same or in another spreadsheet, select a cell or several cells in which you want your primary drop-down list to appear.
  2. Go to the Data tab, click Data Validation and set up a drop-down list based on a named range in the usual way by selecting List under Allow and entering the range name in the Source box.
    Select the cell(s) in which you want your primary drop-down list to appear and apply Excel Data Validation.

    For the detailed steps, please see Making a drop down list based on a named range.

    As the result, you will have a drop-down menu in your worksheet similar to this:
    The primary drop-down list in Excel

4. Create the dependent drop-down list

Select a cell(s) for your dependent drop-down menu and apply Excel Data Validation again as described in the previous step. But this time, instead of the range's name, you enter the following formula in the Source field:

=INDIRECT(A2)

Where A2 is the cell with your first (primary) drop-down list.
Set up the dependent drop-down list.

If cell A2 is currently empty, you will get the error message "The Source currently evaluates to an error. Do you want to continue?"

Safely click Yes, and as soon as you select an item from the first drop-down menu, you will see the entries corresponding to it in the second, dependent, drop-down list.
The dependent drop-down list in Excel

5. Add a third dependent drop-down list (optional)

If needed, you could add a 3rd cascading drop-down list that depends either on the selection in the 2nd drop-down menu or on the selections in the first two dropdowns.

Set up 3rd dropdown that depends on 2nd list

You can make the drop-down list of this type in the same fashion as we've just made a second dependent drop-down menu. Just remember the 2 important things discussed above, which are essential for the correct work of your cascading drop-down lists.

For instance, if you want to display a list of regions in column C depending on which country is selected in column B, you create a list of regions for each country and name it after the country's name, exactly as the country appears in second dropdown lists. For instance, a list of Indian regions should be named "India", a list of Chines regions - "China", and so on.

After that, you select a cell for the 3rd dropdown (C2 in our case) and apply Excel Data Validation with the following formula (B2 is the cell with the second drop-down menu that contains a list of countries):

=INDIRECT(B2)
Creating a 3rd dropdown that depends on the selection in the 2nd list

Now, each time you select India under the list of countries in column B, you will have the following choices in the third drop-down:
A 3rd dropdown depending on the selection in the 2nd drop-down menu.

Note. The displayed list of regions is unique for each country but it does not depend on the selection in the first drop-down list.

Create a third dropdown dependent on the first two lists

If you need to create a cascading drop down menu that depends on the selections both in the first and second drop-down lists, then proceed in this way:

  1. Create additional sets of named ranges, and name them for the word combinations in your first two dropdowns. For example, you have Mango, Oranges, etc. in the 1st list and India, Brazil, etc. in the 2nd. Then you create named ranges MangoIndia, MangoBrazil, OrangesIndia, OrangesBrazil, etc. These names should not contain underscores or any other additional characters.
    Create additional sets of named ranges.
  2. Apply Excel Data Validation with the INDIRECT SUBSTITUTE formula that concatenates the names of the entries in the first two columns, and removes the spaces from the names. For example, in cell C2, the data validation formula would be:

    =INDIRECT(SUBSTITUTE(A2&B2," ",""))

    Where A2 and B2 contain the first and second dropdowns, respectively.

    As the result, your 3rd drop-down list will display the regions corresponding to the Fruit and Country selected in the first 2 drop-down lists.
    A third dropdown dependent on the selections in the first two lists

This is the easiest way to create cascading drop-down boxes in Excel. However, this method has a number of limitations.

Limitations of this approach:

  1. The items in your primary drop-down list must be one-word entries. See how to create cascading drop-down lists with multi-word entries.
  2. This method won't work if the entries in your main drop-down list contain characters not allowed in range names, such as the hyphen (-), ampersand (&), etc. The solution is to create a dynamic cascading dropdown that does not have this restriction.
  3. Drop-down menus created in this way are not updated automatically i.e. you will have to change the named ranges' references every time you add or remove items in the source lists. To get over this limitation, try making a dynamic cascading drop down list.

Create cascading drop-down lists with multi-word entries

The INDIRECT formulas that we used in the example above can handle one-word items only. For example, the formula =INDIRECT(A2) indirectly references cell A2 and displays the named range exactly with the same name as is in the referenced cell. However, spaces are not allowed in Excel names, which is why this formula won't work with multi-word names.

The solution is to use the INDIRECT function in combination with SUBSTITUTE like we did when creating a 3rd dropdown.

Suppose you have Water melon among the products. In this case, you name a list of water melon exporters with one word without spaces - Watermelon.

Then, for the second dropdown, apply Excel Data Validation with the following formula that removes the spaces from the name in cell A2:

=INDIRECT(SUBSTITUTE(A2," ",""))
Creating a cascading drop-down list with multi-word entries

How to prevent changes in the primary drop down list

Imagine the following scenario. Your user has made the selections in all of the drop-down lists, then they changed their mind, went back to the first list, and chose another item. As the result, the 1st and 2nd selections are mismatched. To prevent this from happening, you may want to block any changes in the first drop-down list as soon as a selection is made in the second list.

To do this, when creating the first dropdown, use a special formula that will check whether any entry is selected in the second drop down menu:

=IF(B2="", Fruit, INDIRECT("FakeList"))

Where B2 contains the second dropdown, "Fruit" is the name of the list that appears in the first drop-down menu, and "FakeList" is any fake name that does not exist.
Preventing changes in the primary drop down list

Now, if any item is selected in the 2nd drop-down list, no choices will be available when the user clicks on the arrow next to the first list.

Creating dynamic cascading drop-down lists in Excel

The main advantage of a dynamic Excel dependent drop-down list is that you are free to edit the source lists and your drop-down boxes will get updated on the fly. Of course, creating dynamic dropdowns requires a bit more time and more complex formulas, but I believe this is a worthy investment because once set up, such drop-down menus are real pleasure to work with.

As with almost anything in Excel, you can achieve the same result in several ways. In particular, you can create a dynamic dropdown using a combination of OFFSET, INDIRECT and COUNTA functions or a more resilient INDEX MATCH formula. The latter is my preferred way because it provides numerous advantages, the most essential of which are:

  1. You have to create 3 named ranges only, no matter how many items there are in the main and dependent lists.
  2. Your lists may contain multi-word items and any special chars.
  3. The number of entries can vary in each column.
  4. The entries' sort order does not matter.
  5. Finally, it's very easy to maintain and modify the source lists.

Okay, enough theory, let's get to practice.

1. Organize your source data in a table

As usual, the first thing for you to do is to write down all the choices for your drop-down lists in a worksheet. This time, you will have store the source data in an Excel table. For this, once you have entered the data, select all of the entries and press Ctrl + T or click Insert tab > Table. Then type a name of your table in the Table Name box.

The most convenient and visual approach is to store the items for the first drop-down as table headers, and the items for the dependent dropdown as table data. The screenshot below illustrates the structure of my table, named exporters_tbl - the fruit names are table headers and a list of exporting countries is added under the corresponding fruit name.
Organize the source data in a table.

2. Create Excel names

Now that your source data is ready, it's time to set up named references that will dynamically retrieve the correct list from your table.

2.1. Add a name for the table's header row (main dropdown)

To create a new name that references the table header, select it and then either click Formulas > Name Manager > New or press Ctrl + F3.

Microsoft Excel will use the built-in table reference system to create the name of the table_name[#Headers] pattern.
Create a name for the table's header row.

Give it some meaningful and easy to remember name, e.g. fruit_list, and click OK.

2.2. Create a name for the cell containing the first drop-down list

I know that you don't have any dropdown yet :) But you have to choose the cell to host your first dropdown and create a name for that cell now because you will need to include this name in the third name's reference.

For example, my first drop-down box is reside in cell B1 on Sheet 2, so I create a name for it, something simple and self-explanatory like fruit:
Create a name for the cell containing the primary drop-down list.

Tip. Use appropriate cell references to copy drop-down lists across the worksheet.

Please be sure to read the following few paragraphs carefully because this a very useful tip you that don't want to miss. Thanks a lot to Karen for posting it!

If you plan to copy your drop-down lists to other cells, then use mixed cell references when creating the name for the cell(s) with your first drop-down list.

For the drop-downs to copy correctly to other columns (i.e. to the right), use relative column (without the $ sign) and absolute row (with $) references like = Sheet2!B$1.

As the result, B1's dependent drop down list will appear in cell B2; C1's dependent drop-down will display in C2, and so on.
Coping dependent drop-down lists to other columns.

And if you plan to copy the dropdowns to other rows (i.e. down the column), then use absolute column (with $) and relative row (without $) coordinates like = Sheet2!$B1.
Coping dependent drop-down lists to other columns

To copy a drop-down cell in any direction, use a relative reference (without the $ sign) like = Sheet2!B1.

2.3. Create a name to retrieve the dependent menu's entries

Instead of setting up unique names for each of the dependent lists like we did in the previous example, we are going to create one named formula that is not assigned to any particular cell or a range of cells. It will retrieve the correct list of entries for the second dropdown depending on which selection is made in the first drop-down list. The main benefit of using this formula is that you won't have to create new names as you add new entries to the first drop-down list - one named formula covers them all.

You create a new Excel name with this formula:

=INDEX(exporters_tbl,,MATCH(fruit,fruit_list,0))

Where:

  • exporters_tbl - the name of the table (created in step 1);
  • fruit - the name of the cell containing the first drop-down list (created in step 2.2);
  • fruit_list - the name referencing the table's header row (created in step 2.1).

I gave it a name exporters_list, as you see in the screenshot below.
Create a name to use for the dependent dynamic menu.

Well, you have already done the major part of the work! Before getting to the final step, it may be a good idea to open the Name Manager (Ctrl + F3) and verify the names and references:
Open the Name Manager and verify the names and references.

3. Set up Excel Data Validation

This is actually the easiest part. With the two named formulas in place, you set up Data Validation in the usual way (Data tab > Data validation).

  • For the first drop-down list, in the Source box, enter =fruit_list (the name created in step 2.1).
  • For the dependent drop-down list, enter =exporters_list (the name created in step 2.3).

Setting up Excel Data Validation for the dynamic cascading drop-down list

Done! Your dynamic cascading drop-down menu is accomplished and will update automatically reflecting the changes you've made to the source table.
Dynamic cascading drop down menu in Excel

This dynamic Excel dropdown, perfect in all other respects, has one shortcoming - if the columns of your source table contain a different number of items, the blank rows will appear in your menu like this:
Blank rows appear in the dependent drop-down menu.

Exclude blank rows from the dynamic cascading dropdown

If you want to clean any blank lines in your drop-down boxes, you will have to take a step further and improve the INDEX / MATCH formula used to create the dependent dynamic drop-down list.

The idea is to use 2 INDEX functions, where the first gets the upper-left cell and the second returns the lower-right cell of the range, or the OFFSET function with nested INDEX and COUNTA. The detailed steps follow below:

1. Create two additional names

Not to make the formula too bulky, create a couple of helper names with the following simple formulas first:

  • A name called col_num to reference the selected column number:

    =MATCH(fruit,fruit_list,0)

  • A name called entire_col to reference the selected column (not the column's number, but the entire column):

    =INDEX(exporters_tbl,,col_num)

In the above formulas, exporters_tbl is your source table's name, fruit is the name of the cell containing the first dropdown, and fruit_list is the name referencing the table's header row.

2. Create the named reference for the dependent dropdown

Next, utilize either of the below formulas to create a new name (let's call it exporters_list2) to be used with the dependent drop-down list:

=INDEX(exporters_tbl,1,col_num) : INDEX(exporters_tbl, COUNTA(entire_col), col_num)

=OFFSET(INDEX(exporters_tbl,1,col_num),0,0,COUNTA(entire_col))

3. Apply Data Validation

Finally, select the cell containing the dependent dropdown and apply Data Validation by entering = exporters_list2 (the name created in the previous step)in the Source box.

The screenshot below shows the resulting dynamic drop-down menu in Excel where all blank lines are gone!
 The dynamic cascading drop-down menu in Excel without any blank lines

Note. When working with dynamic cascading drop down lists created with the above formulas, nothing prevents the user from changing the value in the first dropdown after making the selection in the second menu, as a result, the choices in the primary and secondary dropdowns may mismatch. You can block changes in the first box after a selection is made in the second one by using either VBA or complex formulas suggested in this tutorial.

This is how you create an Excel data validation list based on the values of another list. Please feel free to download our sample workbooks to see the cascading drop-down lists in action. Thank you for reading!

Practice workbook for download

Cascading Dropdown Sample 1- easy version
Cascading Dropdown Sample 2 - advanced version without blanks

329 comments

  1. I want to create drop down menus for a consumer to choose from (I have them created). Once they select what they want I want to be able to gather and list information in a new sheet that is gathered from multiple different sheets within the same project. I want to basically write an if/then statement that if they select this from the drop down list and something from a different drop down list then a master list appears with what they need. It's kind of a generic example but anything helps.

  2. @Eric remove the "$" from the dynamic location of the cell. Refer to Karen's comment (third from top). She faced same issue for columns and removed $ from the column letter. For rows, keep the $ for row letter but remove it from row number

    So your reference to the first cell would become from
    = Sheet2!$B$1

    to
    = Sheet2!$B1

    I have tried this and it works a treat!!

    • I am also facing the same problem.
      @Fawwad removing the "$"from the dynamic location of the cell is not working. Please advise if any alternate solution. Thanks !

  3. Using your instructions above, I’ve been able to create my dynamic, cascading validation successfully. Then I copied the validation into subsequent rows. My problem is that when I’ve selected from the dropdowns in the first row, the dependent dropdowns for subsequent rows are stuck matching the first row. Can you tell me what I’m doing wrong? Thanks!

  4. Is there a way to automatically update the exporter cell to the first item in the list once the fruit is selected?

  5. In a drop down list how to select a name starting from letter 'T" quickly a particular name from a huge drop down list.

  6. Hi,
    Thank you for a good description, but i have a question, how can i use this multilevel drop-down list not for one cell, do it for more than 100 cells at once.
    I want to make a list for 100 product, and ask people to fill other fields like that you teach. but I cant do it for 100 products one by one. Help me !!

    • I am having same problem as Saleh, how can we fill the multilevel drop-down so it can work for hundreds or thousands rows and not be dependent on what the 1st cell's selection is? Right now when you fill the row it only brings the drop down list from the 1st selected cell and building this formula row by row can't be the only way to do this repeatedly is it? HELP!!

  7. how can i return a certain data using VLOOKUP??? for example using just an id number i have to return the name of that id number user? is that possible in data validation???

  8. Hi,

    Instead of single value / item, i wish to display some bullet points for 2nd dependent drop down against selection in the first dropdown.

    Please reply ASAP.

  9. Hi,

    Is there a way to create a single or multiple substitution teachers table with
    alternative pop-up options in the time-table.

    • Hello Sangita,

      Please specify what you mean by "alternative pop-up options".

  10. Is it possible to exclude blank rows which appear through the data list for example in your data table if A2 was blank, currently this would appear as a gap in the drop down list which I wanted to avoid.

    Thanks

    • Hello Matt,

      Regrettably, there is no quick and simple way to fulfill this task. You'll definitely need to create a temporary table and copy all non-blank rows there.

    • Put in your data validation list instead of exporters_list this string:
      =OFFSET(exporters_list;0;0;COUNTA(exporters_list);1)

  11. Is it possible to apply this to multi select drop downs? So, I would select Apricots and Mango (using a VBA script) and then see the related suppliers to both Apricots and Mango?

    Thanks a lot!

  12. Svetlana,
    I am working on a spreadsheet and I was wondering if it is possible to apply dynamic cascading lists to 3rd or 4th dependent lists. Is this possible, and if so, how would I go about doing it?

    • I am looking for this sort of thing too.

  13. Svetlana - I have got the drop down box process down, and have been able to make them dependent. My question is: Is there a way for me to make this applicable to an entire column, without manually changing the data validation in each cell. Example being, I want column C drop boxes (from row 2 to 10,000) to be dependent on column B drop boxes, ie drop box cell C25 would be dependent on drop box in cell B25. Right now I can only get everything in column C to tie to B2...

    Thanks!

    • Yes,
      Using the example I added columns going across so the change for you will be slightly different.
      The key is the Name "col_num" in the example. It uses the =MATCH(fruit,fruit_list,0) which references the named cell "fruit". This needs to be changed to reference the cell relative to the current cell (The cell where the second list is being used.
      I changed this to use the INDIRECT function to reference the cell one row up so my full function used in the "col_num" name is: =MATCH(INDIRECT("R[-1]C[0]",FALSE),fruit_list,0)

      The "R[-1]C[0]" is the relative reference looking at the value in the cell one row up in the same column. If you have your selections going down in two columns then your relative reference in the INDIRECT will look one cell to the left in the same row or "R[0]C[-1]"

      • Hi,
        I followed thoroughly your instructions and they work just great on my desktop Excel. However it doesn't work on the Excel iPad version (also not in Excel online). Whereas the static/fixed reference (ie "=MATCH(fruit,fruit_list,0)") works both on desktop as well as on iPad. Any ideas it isn't working with the INDIRECT function?
        Would there be any other ways to reference a cell relatively to the current one?
        Thanks!

        • Hi Raimonds,

          Unfortunately, we can’t say for sure why the solution doesn’t work on the Excel iPad (in Excel online) and can’t suggest an alternative. The point is that the functions are very limited in Excel for iPad and Excel online. Microsoft is constantly trying to improve both versions, but it is still not possible to fulfill some complex tasks there.

  14. Hello guys,
    question related to - dynamic cascading drop-down lists
    I followed the steps, done = working for the first cell (B1 in your example)

    How you copy it to the entire column? I tried normal drag (select the corner bottom-right and drag below) and I destroyed the results in the 2nd column ....same thing happened when I did it in your sample
    Since I need hundreds of rows daily, doing B1 procedure in all manually is not possible
    Thanks for the great help you provide so far

  15. I was Struggling for dependent list -- how to create in excel /// After 1 and half year ... I got this from here .............!!!
    O My Good.

    Thank YOu very very very Much ......... :)

  16. Hi,
    I have made three dynamic named ranges using offset formula. All these three lists are on different worksheets. I want to make a dependent dynamic dropdown on a 4th sheet. is it possible ? and if yes, how?

    for ex: store1, store2, store3 these are three named ranges on sheet a , b, c respectively. now i want to make a dependent dropdown in which first dropdown should have store1, store2 , store 3 and the second dropdown must have the items listed in these.

  17. Hi,

    Instead of preventing changes to a cell once a selection has been made; what if we wanted all the responses to be cleared when a user has made a selection for 1, 2, 3 etc. and then decides to go back to 1 to change the response.

    For instance, I've got three drop down lists in C1, C2 & C3 and then want C2 & C3 reset to blank, when I change C1; or maybe C3 to blank, when I change C2. The point is to reset the responses provided after the new target cell. Is there anyway to achieve this?

    Thanks a lot in advance.

    • Try using macros: Right-click the sheet and select view code. Copy and paste the below text. Enable macros.

      Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Address = "$C$1" Then
      Worksheets("Sheet1").Range("C2,C3").ClearContents
      End If
      If Target.Address = "$C$2" Then
      Worksheets("Sheet1").Range("C3").ClearContents
      End If
      End Sub

      • How would you alter the code below if I have more than one lkinked data validations on one worksheet?

        For example I have the same situation as below but in columns D, E, F, etc.?

        Thanks

        Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "$C$1" Then
        Worksheets("Sheet1").Range("C2,C3").ClearContents
        End If
        If Target.Address = "$C$2" Then
        Worksheets("Sheet1").Range("C3").ClearContents
        End If
        End Sub

        • I'm running into the same issues as Ron. I have 1000+ rows that have multiple dependent drop-down lists; how do I edit the code so that it applies to all rows?

      • Hi, If I have named my sheets - ie I've called mine Analysis so I just substitute "Sheet1" with "Analysis" or do I need to keep the sheet number?

        Also how do I actually get this to work - do I need to run it? or save it as a macro name?

        Many thanks
        Marcia

    • I am looking drop down list and if I go to list of drop down and select one. I need another drop down from that drop down list. Can it will be possible

  18. I tried this for my project and found I could not fill to the right to copy the data validation across.

    So for instance in your example I had entries at B1 and B2. I then entered another fruit at C1 (different to the fruit entered at B1). I found that B1's dependent drop down list was appearing in cell C2 instead of the dependent drop down list for C1 as I wanted.

    I fixed this by removing the absolute reference in Step 2.2 as follows
    = Sheet2!B$1 //ie no $ before the B
    I was then able to fill the data validation from B2 to the right, so that C2 was dependent on C1; D2 was dependent on D1 etc.

    I'm not sure if any of this made sense. I hope it has.

    I have to thank you very, very much for this instruction. It has been a great help.

    • Awesome! that was my issue, thanks!

    • Thank you! That was my problem too!

    • HI Karen
      How can these drop downs work in another sheets (of same workbook)

    • Nice! I also had this issue, since I am doing this in a form... So for "fruit" I named an interval like "=Sheet2!$B5"

      This way all the cells in the columns are now working well. Hey, Svetlana, maybe it would be worth it to add this to your tutorial, since many people seem to need it variable and not just for a single cell.

      Cheers guys!

  19. I need help with part of you tutorial.
    In creating a dynamic cascading drop down list in excel,
    under 2.3. Create a name to retrieve the dependent menu's entries.

    Which cell or range of cells gets =INDEX(exporters_tbl,,MATCH(fruit,fruit_list,0)) as its name.

    Where do i place this name

    • Hello Ferrol,

      This is a very good question. This name is not assigned to any particular cell or a range of cells. In fact, this is a named formula that retrieves the correct list from your table depending on which selection is made in the first dropdown.

      The main benefit of using this formula is that you don't have to create an individual name for each entry, one named formula covers them all.

      You create this name in the same way as the two previous ones (steps 2.1 and 2.2) by clicking Formulas > Name Manager > New, or by pressing Ctrl + F3 and then clicking New.

      • Dear Svetlana,
        I tried Step 2.3 - and it keeps throwing me error.
        In Name Manager - the Refers To section keeps on putting quote around INDEX ie. ="Index(...)"
        If I delete the quote, it says There's a problem with this formula and I cannot save it.
        Hence the Value in Name Manager doesn't evaluate.
        I copied your example to the tee and I'm using Excel 2016
        Is there a solution for this?
        Many thanks.

  20. Hi

    Thanks for the example. My question is how do you prevent someone changing the fruit cell once the exporter cell is chosen?

      • I was able to prevent changes in first drop-down after they select a choice in second thanks to the advice. But now, I can enter things off the drop-down menu. Did I inadvertently turn something on?

        Thanks

Post a comment



Thank you for your comment!
When posting a question, please be very clear and concise. This will help us provide a quick and relevant solution to
your query. We cannot guarantee that we will answer every question, but we'll do our best :)