ABC analysis is a popular technique to understand and categorize inventories. Imagine you are handling inventory at a plant that manufactures high-end super expensive cars. Each car requires several parts (4,693 to be exact) to assemble. Some of these parts are very costly (say few thousand dollars per part), while others are cheap (50 cents per part). So how do you make sure that your inventory tracking efforts are optimized so that you waste less time on 50 cent parts & spend more time on costly ones?
This is where ABC analysis helps.
We group the parts in to 3 classes.
- Class A: High cost items. Very tight control & tracking.
- Class B: Medium cost items. Tight control & moderate tracking.
- Class C: Low cost items. No or little control & tracking.
Given a list of items (part numbers, unit costs & number of units needed for assembly), how do we automatically figure which class each item belongs to?
And how do we generate below ABC analysis chart from it?
![]()
That is what we are going to learn. So grab your inventory and follow along.
(related: ABC Analysis page on Wikipedia)
ABC Analysis using Excel – Step by step tutorial
1. Arrange the inventory data in Excel
Pull all the inventory (or parts) data in to Excel. Your data should have at least these columns.
- Part Name
- Unit cost
- # of units (if this is blank, just type 1 in all rows)

Once the data is in Excel, turn it in to a table by pressing CTRL+T. Lets call our data as inventory. You can set the table name from Design tab.
(Related: Introduction to Excel Tables)
2. Calculate extra columns needed for ABC classification
Now comes the fun part. Crunching the inventory data with formulas. Yummy!
Total Cost: This is just a multiplication of unit cost & # of units columns
Rank: We need to figure out what rank each total cost is (in the total cost column). We can use RANK formula for this.
=RANK([@[Total Cost]],[Total Cost],0) will tell us the rank for each total cost.
Cumulative Units: Once we know the rank of each item, next we need to figure out how many total units are needed for items ranked less or equal.
For example, The number (#) of the third part (PT3959-waes) is 3. Cumulative units for this is 91. This means, 91 is the total number of units for first three ranked parts (parts # 8, 9, and 16).
The formula for this is, =SUMIFS(['# Units],[Rank],"<="&[@['#]])
Remember, [@[‘#]] refers to running numbers (1,2,3….4692,4693)
Cumulative Units %: This is a percentage of cumulative units in total. The formula is simply,
=[@[c Units]]/MAX([c Units])
[Related: using structural references in Excel – video]
Cumulative Cost & Cumulative Cost %:
These are similar calculations (instead of units, we calculate cost)
Explanation of these calculations:
See below animation to understand how the numbers are crunched.

3. Create Inventory Distribution Chart
Select cumulative units & cumulative cost % columns and create an XY chart. Make sure cumulative units is on horizontal (X) axis and cumulative cost % is on vertical (Y) axis.
Our curve should look something like this.

4. Set up ABC classification thresholds
Now we need to decide what is the threshold for classes A,B & C.
For most situations, Class A tends to be top 10% of the items.
Class B would be next 20%
Class C would be the last 70%.
But these numbers may change depending on your industry, manufacturing settings.
Lets say, some where in our spreadsheet, user has defined the thresholds for the classes in a range like this:

So $O$7:$O$9 contains the thresholds.
Next to this range, calculate additional numbers (for plotting A, B & C markers and boxes) like this:

Examine the download file for exact formulas.
5. Add the ABC items & % total cost columns to chart
Add the extra data to the chart (by right clicking on chart and going to select data box & clicking “Add” button).
Once the new series is added, make sure you format it as markers only so that we get something like this.
6. Add Error bars to the ABC markers to get boxes
This step involves adding error bars to ABC marker series and customizing them.
In Excel 2013: Add error bars by clicking on the + button next to chart
In earlier versions: Do this from layout ribbon
Once error bars are added, customize them (select and press CTRL+1). Set error amount to Custom and select the calculated error values as shown below.

Once added, format the error bars to show no cap and change line color to something pleasant.
Now we have boxes on the chart.

7. Clean up the chart, add labels & titles
This is where get creative. After some clean up, we can arrive at something like this.
![]()
Download ABC Inventory Analysis Template Workbook
Click here to download ABC Inventory Analysis workbook. It contains sample data & chart. Examine the formulas & chart settings to learn more. Or if you are in a hurry, replace the sample data with your inventory details and get instant results.
Do you use ABC analysis for inventory tracking & control?
I will be honest. I have never worked as inventory controller in a super-car manufacturing plant. That said, I run a business and we do have inventory. Not physical but digital inventory. So I often use analysis like ABC or pareto to quickly figure out where I should focus my efforts.
What about you? Do you use techniques like ABC analysis to narrow down to a few items that matter most? How do you do it in Excel? Please share your tips & experiences using comments.
Add few more techniques to your inventory
Feeling low on your Excel skills inventory? Stock up with below goodies.
- Pareto Analysis in Excel – How to & tutorial
- Analyzing competition using charts – case study
- Track employee vacations & productivity [dashboard & tutorial]
- Track annual goals & achievements















59 Responses to “Robust Dynamic (Cascading) Dropdowns Without VBA”
downloaded workbook doesn't work for me. it's always missing the first selection.
so, If I choose fruit, apples is not in the dropdown. if I choose vegetables, beets is not in the dropdown
@Gary, you are right, I try to anticipate the reply of Jeff.
Here’s the right formula, enter into the Name Manager while cell B8 was selected:
=IF(ISBLANK(C8),IF(DataEntry[#Headers] B:B = DataEntry[[#Headers],[Main Category]],OFFSET(ValidationLists[[#All],[Main Categories]],1,,COUNTA(ValidationLists[Meat])),OFFSET(ValidationLists,,MATCH(A8, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(A8, ValidationLists[#Headers],0)-1,,1))-1,1)))
UFFF ... i'm sorry ... forget my previous comment 🙁
Here’s the right formula, enter into the Name Manager while cell B8 was selected:
=IF(ISBLANK(C8),IF(DataEntry[#Headers] B:B = DataEntry[[#Headers],[Main Category]],OFFSET(ValidationLists[[#All],[Main Categories]],1,,COUNTA(ValidationLists[Meat])),OFFSET(ValidationLists,,MATCH(A8, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(A8, ValidationLists[#Headers],0)-1,,1)),1)))
the errors were due to the fact that ValidationLists does not include the header (as I had initially interpreted)
Great formula as an always Roberto. However, I think it still need some VBA to clean the subcategory selection if the user delete the previous category.
Regards
Ciao Elias! the formula was born from a discussion with Jeff, everyone added something then he wrote this post and he explained the formula ... he gave all the credit to me ... but the merit is more his ... I've only made a mess with these Excel Tables (I'm sorry) 🙂
anyway thanks
This post was borne out of a whole bunch of misunderstandings! When we'd all got to the bottom of them, something beautiful emerged from the dust. 😉
Gary: Thanks for the heads up. Have fixed post and sample file.
Elias: No VBA necessary as users CANNOT delete upstream categories without FIRST manually cleaning out downstream categories. Give the sample file a spin.
Hi Jeff,
Open the file->go to B8 and press the delete key. Do I missing something?
Also, the new file’s link is giving and error.
Regards
No, it's me that's missing something...I misunderstood what you were saying. So yes, you'd need VBA to do that, along the lines per my previous post. But this is still a great non-VBA solution, apart from that.
Link fixed.
Cheer Elias.
Great....i was looking something like this in past but end up with only VBA solutions which i really did not liked them because if anyone unknowingly chnage the upper LOV, All the sub selection get vanished and if the person do not know what those LOV, He/She can only hit his head.
What a fantastic solution. I'm currently replacing VBA routines with non-VBA ones and this formula has become a major part of my re-modelling. Thank you so much for debating, creating and sharing this formula.
LeonK
Kuldeep and LeonK: Thanks for you kind comments. Without comments like yours, I tend to think that noone finds this stuff useful.
[…] http://chandoo.org/wp/2014/02/25/robust-dynamic-cascading-dropdowns-without-vba/?utm_source=feedburn… […]
Great solution! shame I needed it 6 months ago, but I'm sure i'll find another use for it soon!
Certainly do find it useful, keep the awesome posts coming!
Nice work, Jeff and Roberto. The VBA-free cascading data validation is a worthy goal.
At my previous job I regularly sent out Excel surveys to dozens of recipients, and of course couldn't hazard the maintenance nightmare of VBA. I came up with a version of dependent dropdowns that wasn't as self-correcting as this, but uses Conditional Formatting to alert the user, and ultimately, the analyst, that something is amiss. If anybody's interested it's at http://yoursumbuddy.com/user-friendly-survey-without-vba/.
Hey, that's cool, Doug. Will add link to that in the main article.
Thanks Jeff!
[…] Weir explains Robert Mensa’s technique for creating robust dynamic drop downs, without VBA. Just remember, the best we can do is build things that are idiot resistant, not idiot […]
Thanks Jeff and Roberto, this is exactly what I was looking for. The timing it's like a miracle! 🙂
I noticed that the validation is not consistent, in some cells I can type anything I want, but in others the validation rule works. I just copied the cell from the one that was working to the rest and now all are fine. I hope I didn't mess up anything by doing that.
Thanks again,
Pablo
[…] Howdy folk. Jeff Weir here. You might remember me from shows such as Handle volatile functions like they are dynamite, Did Jeff just Chart, and Robust Dynamic (Cascading) Dropdowns Without VBA. […]
Guys, does this work with subcategories beyond 3, per the example? I have a flow chart decision tree with 6 subcategories. My customers are basic users who don't want to read my guidelines or decision tree. I thought dynamic dependent drop downs the best option for this situation. However, I can't seem to find anything on the web that shows beyond 3 categories. If anyone can help show how it could work with the learning/example that Jeff published above, I would be grateful...or if there are better options then drop downs...
Leonard - yes it can. As per the original article: 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 Jeff!
Even though I am basic beginner, I managed to emulate and then modify. Maybe it say somewhere, but I discovered that if your last column in the validation table isn't filled in as far as the 1st column, then you won't get the full first drop down list. I basically created an extra end column that I filled in with bogus numbers so it would work.
Thanks again!
[…] Dependent Data Validation (Cascading Data Validation) […]
I just implemented this mechanism and it works perfectly. When I close the file and try to open it again, it just crashes Excel, and the file become useless.
Tested in two different machines and got the same result.
Anyone with the same problem?
Tks
Enzo
Hi Enzo. Not sure what's going on there. I'll flick you an email, in the case that you want to send me the file to look at.
Hey,
I did this equation on a template and it worked out well. I set up three different sections with no problem. A few months later when I tried to add two more sections to a different tab, it will not work. Well, at first it worked but then out of the blue the formula is not working. But only for that section. This is what I am typing in with the proper adjustments for the cell I am entering. Also, not sure if this is a part of the problem, I am using macros to dynamically rebuild the ValidationListsD table in the formula.
=IF(ISBLANK('Budget Details'!H11),IF(DataEntryD1[#Headers] 'Budget Details'!G:G = DataEntryD1[[#Headers],[SC Account Name]],OFFSET(ValidationListsD[[#All],[SC Account Name]],1,,COUNTA(ValidationListsD[SC Account Name])),OFFSET(ValidationListsD,,MATCH('Budget Details'!F11,ValidationListsD[#Headers],0)-1,COUNTA(OFFSET(ValidationListsD,,MATCH(‘Budget Details’!F11,ValidationListsD[#Headers],0)-1,,1)),1)))
Oh and my starting cell for this one is G11.
Hi -
Thanks for the example - something I could never have done myself 🙂
Fine article and excellent solution for cascading validation lists. Once I found it I couldn't resist trying it. After a while, then, i bumped into an apparently unsolvable problem: when I try copying the sheet which contains DataEntry table, the validation list wouldn't work. I have the ValidationLists in a different sheet.
Of course, copying the worksheet forces excel to copy the ValName range which remains with the same name but scoped to the new sheet instead of the workbook. The DataEntry table becomes DataEntry2 instead. I thought the problem was that ValName scoped to workbook in the first place, so that having 2 different range named the same, one being scoped to the workbook was the issue. So I decided to change the scope of ValName to the worksheet before copying. The result was the same: validation lists do not appear on the new sheet, while still working fine on the original one.
Is there anything I am missing or is just that the operation doesn't have an easy solution (meaning I need to set up the whole thing everytime a copy the sheet)?
@Walter
Your correct
Named Formula are sheet specific and copying sheets can create these issues
You can setup a new Named Formula and relink it on the new worksheet eg: ValName2
Thanks. I thought so.
Hi Guys! try this..
Let us assume you have the main dropdown in cell A1 and its dependent dropdown in cell B1. Also, let us assume that the name of your main validation list is "list1", which means that under validation criteria for cell A1, you Allow List and in source you type"=list1". So, instead of "=list1", try this:
Under validation criteria for cell A1, Allow - List. In Source, type the following formula...
=IF(B1"","",list1)
THAT IS IT! So long as cell B1 is not empty you will not be able to input any value in cell A1.
Cmt...that works fine for two level dropdowns, where you have set up named ranges ahead of time. But my approach can handle any number of cascading levels (provided all the category names are unique) without having to set up individual named ranges. All you need to do is simply add subcategories to the right hand side of the validations table (Table1). There's more on this in the original article I link to at the top.
That is AWESOME!!! I am not VBA yet but needed to impress by boss 😀 AND I DID!!! I did impress myself though as well lol! Biggest thanks to you, Chandoo!!! You rock!
This is exactly what I was looking for, except for one issue, I would likre my data input to be on a different sheet to the source table, and I can't seem to make it work...help?
I have tried the formula. My data input is on Opportunity Data sheet from K3:M9999 and my Validation Lists are on DB Sheet from B37:W55. I have "First_Header", "ProductData" and "ValidationLists" in the Name Manager. I tried the formula as: =IF(ISBLANK(Opportunity_Data!L3),IF(ProductData[#Headers] DB!B:B=ProductData[[#Headers],[Customer Billing Plant]],OFFSET(ValidationLists[[#All],[Customer Billing Plant]],1,,COUNTA(ValidationLists[Customer Billing Plant])),OFFSET(ValidationLists,0,MATCH(DB!A36, ValidationLists[#Headers],0)-1,COUNTA(OFFSET(ValidationLists,,MATCH(Sheet1!A36, ValidationLists[#Headers],0)-1,,1)),1))). I am continuously getting the error message regarding incorrect formula with the ValidationLists[[#All] highlighted. Can you please help me?
One more simplest way is to use INDIRECT function.
Yes, you can use INDIRECT. But you have to set up a seperate named range for every possible combination, and you can't use spaces (meaning in the example above you would have to use Ozark_Beauty instead of Ozark Beauty). So if you have more than a couple of levels of cascading dropdowns, the INDIRECT approach soon becomes unwieldy.
Whereas my approach can handle any number of cascading levels (provided all the category names are unique) without having to set up individual named ranges. All you need to do is simply add subcategories to the right hand side of the validations table (Table1). There's more on this in the original article I link to at the top.
I'm working on adapting this to my form. I'm just getting into using VBA and advanced formulas, literally like three days ago! I was wondering if this will work with my project. I have a very simple form that I created using one downstream dropdown to capture a group and subgroup. I only have the one table where my source data is pulled from. There are no headers in my data entry (form) area either. Just want to make sure its possible. I'm hoping to understand this better once my Vyvanse kicks in!
Kind regards
Yes, this should work. Setting it up can be a bit complicated, so if you get stuck, perhaps the best way to proceed is to download the example, and change it to suit your needs.
Hi Chandoo,
Your formulas have worked wonders for me, however after finally being able to apply this "Robust-dynamic-cascading-dropdowns-without-vba", it seems I could not get the dropdowns to work if I duplicate the worksheet and rename. When I pull up the Name Manager, it seems the originally created table and Name Ranges are scoped to Workbook, and new Names exist scoped to specific Worksheet.
Not sure if I make any sense, but in simple terms, I duplicated sheet 1, rename to sheet 2, click on the same cell with data validation, no drop-down appears.
Any idea?
Hi Jim. I'm the author of this guest post, not Chandoo. You'll simply have to create new names that don't conflict with the old.
Hi Jeff, sorry I didn’t notice... anyway, thanks for the reply, just realised the sheet names and formulas will then have to match accordingly, it works fantastic now! A thousand sincere thanks!!! 😉
Hi Jeff,
Thanks for this post, this was very helpful. I am trying to tweak this formula to accommodate a similar dynamic drop-down structure, but in a different format. My DataEntry table must be formatted a certain way to meet upload requirements.
In my case on the DataEntry table, my "Main Category' drop downs are the table headers (So picture Fruits, Vegetables, and Other Stuff, in B7:D7) and my dependent sub-category drop-downs (only using 1) are in the rows directly underneath (ex. Apples, Beets, Bread as selections in B8:D11)
My Validation table has my Main Category selections as column headers with all the sub-category values listed underneath. (I hadnt considered an Initial List since I only have 1 dependent drop-down list)
I can change the validation table in any way I want but the DataEntry table must stay in this format. Is there a way to rearrange the formula to accommodate this while maintaining functionality?
Thanks!
Michael
I'm afraid not, Michael. You'll have to research for a different approach.
In this case, you can use the example demonstrated here:
https://chandoo.org/wp/cascading-drop-down/
Hi Chandoo,
Thanks for this, unfortunately I cannot use this as I will need to copy the validation over to multiple columns to the right, and also have the dependent drop down validation copied down to multiple rows. So I wont be able to have the IFERROR formula that displays the red X next to my drop-downs, nor can I put it underneath. Similarly I will need to format my validation values as a table so I can add new items to each drop-down as I please.
Based on this criteria, is VBA my only option here?
Hi Chandoo,
I use Excel for Mac 2016, so when I try to paste my version of the suggested formula the range of cells box truncates it to 255 characters max (my formula has 455 characters).
Is there a way to get around this situation?
I tried splitting it up in two and using CONCATENATE to combine it together but it didn't work. Maybe I'm doing it or there's a more clever way to circumvent this limitation...
Hi! This solution is perfect for me! I am trying to use Cascading Drop-downs on a protected sheet and don't want to get into VBA to get around that. I would only need to adapt the Headings and Category names.
I can do this easily and it works perfectly on the worksheet I downloaded from you.
However - I think I am having the same trouble as Leonardo above - When I try to copy the sheet into my existing workbook, it fails. It says I am missing a parenthesis. I am also using Excel for Mac 2016. But I don't understand why it works on the worksheet I downloaded, but not when trying to integrate it into a new workbook. Thanks for any help!
Actually I figured it out - if I "copied" your worksheet into mine, the problems occurred. If I "moved" the worksheet into mine, it worked perfectly, thanks again for providing this innovative solution, now I can use these lists on a protected workbook with no VBA to work around!
Hi everyone,
First of all, thank you for this article, it is really insightful.
I have a question regarding this topic tho.
My question is "How many levels of dynamic (cascading) dropdowns can you construct ?".
In order terms, would it be possible to add a 4th level with illegal characters in the example above ?
I tried to research that really hard but could not find anything. Any help is welcome.
Thank you,
Pierre
Hi, I am looking for a formula where the cell content changes from selecting the options in a dropdown. For example: when I select week as an option in the dropdown then my dashboard will give me report week wise information. From Cell A5 to A15 the weeks should be reflecting and based on that weeks the other column cells should give the info. Likewise when I select the option as Month then the same cells A5 to A15 should show the months and based on the month the other column cells will give the report. And other this is, only the available week or month should reflect in the A5 to A15 Cells from the dump.
Kindly request to help me in this as I have stuck with the dashboard which I need to complete and share with clients.
Hi Thomas... Thanks for your comments. Please refer to automatic month rollover page for information on how to calculate month dates based on starting month. You can tweak this logic with an IF formula so that when "Weeks" is selected in the drop down, you will have weeks in A5:A15 and months otherwise.
Automatic Rolling Months in Excel [Formulas]
Thank you so much Chandoo. It's helpful.
Hi Chandoo, I have attached the dashboard via email. Please check.
I need help!
I have 2 columns one with date which can repeat and another with date that vary along the day as multiple tests are executed during the day. I need a cascading dropdown, than upon selection of the date, user's can choose the time at which the report was executed to look at the data.
my 2 tables look like this:
Date Hour
20/10/2020 13:45
20/10/2020 15:34
07/10/2020 20:00
09/10/2020 20:45
09/10/2020 21:45
How would the formulas look for a scenario where I don't have and categories listed on the top row?
You may want to refer to my latest post "two level dropdowns" for another way dealing with this problem. link here - Two-level Data Validation [Excel Trick]