Robust Dynamic (Cascading) Dropdowns Without VBA

Share

Facebook
Twitter
LinkedIn

Recently I posted about how you could construct dynamic (cascading) dropdowns that could easily handle multiple levels, like this:
Chandoo_CascadingDropdowns_Earliglow

…and we saw that users could subsequently change upstream dropdowns in a way that would make downstream choices invalid, like this:
Chandoo_CascadingDropdowns_Embarrassing
In my previous post I used some VBA to clear out any ‘downstream’ choices if anything ‘upstream’ changed:
Chandoo_CascadingDropdowns_Downstream Reset

Updated for 2024:

Please see my latest article on Dependent Drop-downs using XLOOKUP to implement a simpler and scalable technique. It works great when you have two or multiple levels and can be expanded to an entire table column or sheet column.

A much simpler alternative

My sample file drew on Roger Govier’s excellent approach on the Contextures website, which used two dynamic named ranges to feed the data validation lists, one called MainList and one called SubList. Roberto commented that you could achieve pretty much the same thing with no VBA and with just one validation formula. His approach is pure genius!

Here’s a sample file that utilizes Roberto’s approach:

Click here to download the file

This approach uses a validation formula with a couple of relative references in it. Relative references look for cells that are some predetermined distance left/right and up/down from the active cell. Here’s his formula, which was entered into the Name Manager while cell B8 was selected:
=IF(ISBLANK(Sheet1!C8),IF(DataEntry[#Headers] Sheet1!B:B = DataEntry[[#Headers],[Main Category]],OFFSET(ValidationLists[[#All],[Main Categories]],1,,COUNTA(ValidationLists[Main Categories])),OFFSET(ValidationLists,0,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,,1)),1)))

This formulas assumes:

  • You use Excel Tables for both the Validation List and the data entry area, and so uses the associated Structured References that Table functionality allows.
  • Your validation table is called ValidationLists
  • Your data entry table where the dropdowns are is called table is called DataEntry.
  • The column containing your initial dropdowns is called ‘Main Category’
  • The validation list in your validation table that contains your initial categories is called ‘Main Categories’

You will have to amend this formula accordingly if your tables or initial columns have different names.

The relative reference in this formula checks both the cell to the immediate left AND the cell to the immediate right of your current selection. Entering relative references into the Name Manager can be tricky…you first need to select the cell where the formula was originally created – in this case B8 – before you fire up the Name Manager dialog box. (Note that it doesn’t actually matter whether your own file has anything in C8 or not, or whether in fact your dropdowns are somewhere else entirely…rather it’s just that the above formula happens to refer to A8 and C8, and because we want our formula to always reference the cell on the immediate left and immediate right, then we’ve got to select the cell B8 which is in the middle.

Excel Tables – known as ListObjects to VBA developers – were introduced in Excel 2007, and are a very powerful and simple way to store things like lists, chart data, and PivotTable data…especially if you might need to add more data to your spreadsheet at a later date, and want to avoid having to repoint all your formulas to include the additional data. If you’re not familiar with Excel Tables – or you don’t know what that Table1[#Headers] guff above means – then I strongly suggest you check out Chandoo’s Introduction to Structural References or give GOOGLE a spin.

How does this awesome beast work?

Let’s step through it, bit by bit. Note that I’ve put some extra spaces in after each opening formula bracket, purely so this formula will wrap nicely on your monitor. Excel just ignores these extra spaces, so don’t bother taking them out.

=IF(ISBLANK(Sheet1!C8),IF(DataEntry[#Headers] Sheet1!B:B = DataEntry[[#Headers],[Main Category]],OFFSET(ValidationLists[[#All],[Main Categories]],1,,COUNTA(ValidationLists[Main Categories])),OFFSET(ValidationLists,0,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,,1)),1)))

That first bit in bold above checks the cell on the immediate right. If that cell on the right is not blank, then that means that the user has already made ‘downstream’ selections. We don’t want the user to change this ‘upstream’ dropdown without clearing those out. Thanks to the IF statement, if that’s the case then none of the rest of the formula gets executed, and the formula just returns FALSE. Data validation can’t handle this FALSE, so users can click on the dropdown button all they like, but nothing will come up. Consequently, the user simply can’t change this ‘upstream’ selection until they’ve first cleared out any selections they previously made in the cells to the right. Pure genius.

Here’s what that looks like:
Chandoo_Robust Dropdowns without VBA_No dropdown
Chandoo_Robust Dropdowns without VBA_Retrospective change
Sweet! Okay, let’s take a look at the rest of the formula:

=IF(ISBLANK(Sheet1!C8),IF(DataEntry[#Headers] Sheet1!B:B = DataEntry[[#Headers],[Main Category]],OFFSET(ValidationLists[[#All],[Main Categories]],1,,COUNTA(ValidationLists[Main Categories])),OFFSET(ValidationLists,0,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,,1)),1)))

That bit in bold above checks whether the dropdown is the Main Category column. It does this using the INTERSECT operator, which is a space between two references (in this case of DataEntry[#Headers] B:B the INTERSECT operator is the space between DataEntry[#Headers] and the column reference B:B. Such a space tells Excel to go to the overlap or intersection of those two references, which in this case is the junction between the header row and the column that our dropdown is in.

  • If the current dropdown is in the Main Category column, then this bold bit:
    =IF(ISBLANK(Sheet1!C8),IF(DataEntry[#Headers] Sheet1!B:B = DataEntry[[#Headers],[Main Category]],OFFSET(ValidationLists[[#All],[Main Categories]],1,,COUNTA(ValidationLists[Main Categories])),OFFSET(ValidationLists,0,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,,1)),1)))
    …serves up just the list containing our initial categories (i.e. ‘Fruit’, ‘Vegetables’, or ‘Other Stuff’ in this example).
  • If the current dropdown is not in the Main Category column, then this bold bit:
    =IF(ISBLANK(Sheet1!C8),IF(DataEntry[#Headers] Sheet1!B:B = DataEntry[[#Headers],[Main Category]],OFFSET(ValidationLists[[#All],[Main Categories]],1,,COUNTA(ValidationLists[Main Categories])),OFFSET(ValidationLists,0,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(Sheet1!A8, ValidationLists[#Headers],0)-1,,1)),1)))
    …serves up the particular list relevant given the previous choice made in the dropdown to the left.

Wicked, eh!

Normally I don’t advocate the use of volatile functions such as OFFSET if there is a non-volatile alternate (and you’ll hear more about volatility from me in a forthcoming post). But as Roberto points out in his original comment, in this case it doesn’t matter…choices made via dropdowns are not considered volatile by Excel, even if the formulas used to populate that dropdown are volatile.

Like Roger’s approach, Roberto’s approach can handle any number of cascading levels, provided all the category names are unique. All you need to do is simply add the new subcategories to the right hand side of the validations table.

Thanks Roberto…I learned a lot from those comments. Readers, be sure to visit the Frankens Team and check out the crazy things Roberto, Kris & Gábor get up to with Excel.

Download the sample file

Here’s a sample file that utilizes Roberto’s approach:

Click here to download the file

Updates

Check out the updated 2024 version of this technique with XLOOKUP. The formulas are much simpler and it works with any level of validations.

You may also want to check out my good pal Doug Glancy’s approach to this. His version of dependent dropdowns uses Conditional Formatting to alert the user, and ultimately, the analyst, that something is amiss. Be sure to say hi to him in the comments while you’re there, and to subscribe to his blog. Anyone who makes up sample files about fictional International Pie Lovers Associations deserves our eyeballs!

About the Author.

Jeff Weir – a local of Galactic North up there in Windy Wellington, New Zealand – is more volatile than INDIRECT and more random than RAND. In fact, his state of mind can be pretty much summed up by this:

=NOT(EVEN(PROPER(OR(RIGHT(TODAY())))))

That’s right, pure #VALUE!

Facebook
Twitter
LinkedIn

Share this tip with your colleagues

Excel and Power BI tips - Chandoo.org Newsletter

Get FREE Excel + Power BI Tips

Simple, fun and useful emails, once per week.

Learn & be awesome.

Welcome to Chandoo.org

Thank you so much for visiting. My aim is to make you awesome in Excel & Power BI. I do this by sharing videos, tips, examples and downloads on this website. There are more than 1,000 pages with all things Excel, Power BI, Dashboards & VBA here. Go ahead and spend few minutes to be AWESOME.

Read my storyFREE Excel tips book

Overall I learned a lot and I thought you did a great job of explaining how to do things. This will definitely elevate my reporting in the future.
Rebekah S
Reporting Analyst
Excel formula list - 100+ examples and howto guide for you

From simple to complex, there is a formula for every occasion. Check out the list now.

Calendars, invoices, trackers and much more. All free, fun and fantastic.

Advanced Pivot Table tricks

Power Query, Data model, DAX, Filters, Slicers, Conditional formats and beautiful charts. It's all here.

Still on fence about Power BI? In this getting started guide, learn what is Power BI, how to get it and how to create your first report from scratch.

35 Responses to “Quick and easy Gantt chart using Excel [templates]”

  1. "Please share your experiences and ideas using comments"

    For those willing to go VBA, XL can do far more w/Gantt Charts. Compare to PapaGantt. https://sites.google.com/site/beyondexcel/project-updates/papagantt-thebigdaddyofxlganttcharts

    While making PapaGantt was neither quick nor easy, using PapaGantt is both, not just for displaying Gantts, but for scheduling tasks as well.

  2. Stef@n says:

    is it possible to get a xls(m) file ?
    instead of a zip-file with .xml-files ?
    i cannot open it with excel :/
    Regards
    Stef@n

  3. Darren "AusSteelMan" says:

    Thanks very much for this workbook idea.

    To slightly up-scale functionality I added:
    1. conditional format for when the cell value =2 to be red which could be used for critical path or other activity highlighting needs (milestones perhaps)
    2. conditional format for when the cell value =c to be green which could be used for showing activity progress
    3. conditional format for the same range where formula =DATE(YEAR(D$5),MONTH(D$5),DAY(D$5))=TODAY() and set custom to ;;; and cell fill colour to a light blue. This will highlight today down the whole table to allow quick assessment of activity progress to plan. Anything not green upto where the date indicator is shows activity is behind the plan. Opposite for tasks ahead of the plan.
    (There is probably a better way to get the same result but this works for now. If there is please post for us to share.)

    Hope this made enough sense.

    Also, thanks Craig for the link. I'll have a better look soon.

    Regards,
    Darren

  4. Hey Chandoo,

    I actually made one of these for a friend of mine but added an extra level of automation.

    Rather than putting in 1 on all the dates the activity occurs, I added a column for start and end date of each project. Then I used formula along the lines of :

    =IF(AND(DateAtTop >= Start Date, DateAtTop <= End Date),1,"")

    Then used the same conditional formatting where 1 was coloured.

    I thought this was a nice touch, especially if a project lasts for many days.

    Let me know what you think 😉

    Lucas

    P.S. First time I've posted here, love your work btw!

  5. […] via Quick and easy Gantt chart using Excel [templates]. […]

  6. Prahlad Gorur says:

    Excellent, thanks for this tip and expample.
    I had a monthly reporting template very similar to this, but was done in excel which needed more manual inputs.
    I used your exmaple and updated my monthly group reporting plan.
    I further devided the day into 4 quarters to make it easy for us to followup on different tasks.
    Now, I just have to update the start date, and everything gets udpated by itself in fraction of a second.
    Thanks once again. love your daily udpates.

  7. Prajay Kumar says:

    Hi Chandoo,

    Can you guide on preparing an indian version of the captioned sheet. We have saturdays working :-(, and only one day weekly off on sunday.

    Regards-Prajay

  8. Hi Chandoo,very useful post.i need gantt chart for inventory module.

  9. […] Quick and easy Gantt chart using Excel […]

  10. Maria says:

    Hi.

    Really usefull post. I would like to know if i can also include weekends.

    Thank you

  11. Shafeeq says:

    Hi Chandoo, thank you for the great job, I was wondering if you can customize this sheet for Inventory planning purposes?!

    thank you indeed

  12. Leyum says:

    This was so helpful. ive been through about 10 different tutorial type things and this has to be the best so far, helped me out a great deal. and now my boss is happy i can make gantt charts!

    thanks

  13. David says:

    This's a great post, thanks for sharing

  14. Steven says:

    Hi Chandoo,

    Thanks for the excel tutorial. I wanted to make a simple modification, however it will cause issues with the duration part. I created another rule/cell marked 2. For my project I want to show a projected timeline and then an actual timeline. The issue is that the duration is being logged for when I enter 2, which I want to be projected and not actual. Will you please assist in letting me know how I can create a duration for both project and actual on the same line?

    Thank you,
    Steven

  15. Joe says:

    Showing vertical line between every week is very useful for me, I used to do it manually. Thanks so much!!

    But how about, my gantt chart included Saturday & Sunday, and I want to show the vertical line after Sunday, could any expert teach me how to fix it. Thanks again.

  16. Helen N says:

    This was so helpful - thank you! I had a bit of trouble with the end of the week conditional formatting over-writing the filled cells but switching the order of the rules sorted it out. Needed to put together a gantt chart quickly for an important bid at short notice and this was just the job - thanks for taking the time to post it. Much appreciated.

  17. Alina says:

    This is the first time I'm reading a tutorial that actually makes sense 🙂 This is absolutely great, with only one minor issue I can't seem to figure out on my own. How do I include weekends in (or instead of) the Workday formula? Thank you!

  18. […] This template I made myself but I inspired from Chandoo.org. […]

  19. Harrison says:

    Hi,

    Sometimes I must work at weekends - it is possible to modify the dates so that you can include Sat + Sun as well?

    Thanks,
    H

  20. Stuart says:

    Nice gantt chart template chandoo, simple but useful

  21. Kirstin says:

    Thank you so much for this excellent guide! I have adapted this to show scheduled activities at multiple project sites weekly over the course of the year, including active and proposed work. With just a tiny bit of tweaking to your tutorial, I was able to create a chart that suited my needs perfectly!

  22. Somnath says:

    Thank you very much for idea sharing .very innovative workday formula is showing 5 days but i want 6 days , is there any other option plz reply..

  23. Somnath says:

    i got it friends..

    =WORKDAY.INTL(F4,1,11)

    hhhhhh

  24. Cynthia says:

    Hi thanks a lot for the tuto!! It helped me a lot!!
    But can you tell me how can I add a vertical line representing today on it?

    • Hui... says:

      @Cynthia

      Open the template
      Select D7:DS26
      Goto Conditional formatting
      New Rule
      Use a Formula
      =D$5=today()
      then set the format as a Red Right Hand Border only
      Apply
      Do not select stop here for the rule

  25. Muriel says:

    Hi Chandoo,

    I purchased your Project Management templates a month ago and have not had the chance to thank you for the great templates. Thank you!!!!! It has saved me a lot of time creating and re creating templates. Unfortunately, I had to do a lot of customization but it's not that bad. I am now in the process of customizing my GANTT which my boss thinks is too granular. He doesn't want to see a weekly grant. Only the months should be showing. I have researched and researched but to no avail. Do you have any examples I can look at?

  26. Nadine says:

    Hi Chandoo,
    thanks so much for all your tips on Gantt Table.
    I'm actually building one at the moment and want to use the conditional formatting. However, I always get into trouble with that when I have to add new lines. I don't know the final size of my table yet and I eventually also want other people to be able to work with it.
    Conditional formatting tends to "split up" into various "applies to" ranges when you insert a new row or copy and past values from somewhere.
    I'm sure you've come across this issue already... So far I couldn't find a feasible solution to this. I was wondering if you had an idea / suggestion for me?

    Thanks so much!!!
    Nadine

Leave a Reply