lookup value in a non-standard table - excel

I am trying to use VLOOKUP-like functionality on a table that I have which unfortunately doesn't have the layout that is standard for VLOOKUP function.
Layout is as below:
Dealership 1 | Dealership 2 | Dealership 3
Make | Discount 1 | Website 1 | Discount 2 | Website 2 | Discount 3 | Website 3
Hyundai | 20% | www1 | 30% | www3 | 10% | www4
BMW | 10% | www1 | 15% | www3 | 3% | www4
Honda | 20% | www1 | 50% | www3 | 70% | www4
So Normally would I would do is VLOOKUP the whole array for rows that match the make I am looking for and output the discount I am looking for. However, I want to specify which Dealership I am getting the discount from as well.

You would use the MATCH as your third Criterion:
=VLOOKUP(I2,$A:$G,MATCH(J2,$1:$1,0),FALSE)
The MATCH() returns the column in which the Dealership is found. And uses that in the VLOOKUP to denote in which column the discount is found.

You can use the INDEX and MATCH combination to get a value in a 2D range
The formula I used here was
=INDEX($B$2:$G$4,MATCH($B$7,$A$2:$A$4,0),MATCH("Discount "&$B$8,$B$1:$G$1,0))

Related

EXCEL: SUMIFS criterion applied to a INDEX MATCH search equals a value

I've spent pretty much all day trying to figure this out. I've read so many threads on here and on various other sites. This is what I'm trying to do:
I've got the total sales output. It's large and the number of items on it varies depending on the time frame it's looked at. There is a major lack in the system where I cannot get the figures by region. That information is not stored in the system. The records only store the customer's name, the product information, number of units, price, and purchase date. I want to get the total number of each item sold by region so that I can compare item popularity across regions.
There are only about 50 customers, so it is feasible for me to create a separate sheet assigning a region to the customers.
So, I have three sheets:
Sheet 1: Sales
+-----------------------------------------------------+
|Customer Name | Product | Amount | Price | Date |
-------------------------------------------------------
| Joe's Fish | RT-01 | 7 | 5.45 | 2020/5/20 |
-------------------------------------------------------
| Joe's Fish | CB-23 | 17 | 0.55 | 2020/5/20 |
-------------------------------------------------------
| Mack's Bugs | RT-01 | 4 | 4.45 | 2020/4/20 |
-------------------------------------------------------
| Joe's Fish | VX-28 | 1 | 1.20 | 2020/5/13 |
-------------------------------------------------------
| Karen's \/ | RT-01 | 9 | 3.45 | 2020/3/20 |
+-----------------------------------------------------+
Sheet 2: Regions
+----------------------+
| Customer | Region |
------------------------
| Joe's Fish | NA |
------------------------
| Mack's Bugs | NA |
------------------------
| Karen's \/ | EU |
+----------------------+
And my results are going in Sheet 3:
+----------------------+
| | NA | EU |
------------------------
| RT-01 | 11 | 9 |
+----------------------+
So looking at the data I made up for this question, I want to compare the number of RW-01's sold in North America to those sold in Europe. I can do it if I add an INDEX MATCH column to the end of the sales sheet, but I would have to do that every time I update the sales information.
Is there some way to do a SUMIFS like:
SUMIFS(Sheet1!$D:$D,Sheet1!$A:$A,INDEX(Sheet2!$B:$B,MATCH(Sheet1!#Current A#,Sheet2!$A:$A))=Sheet3!$B2,Sheet1!$B:$B,Sheet3!$A3)
?
I think it's difficult to do it with a SUMIFS because the columns you're matching have to be ranges, but you can certainly do it with a SUMPRODUCT and COUNTIFS:
=SUMPRODUCT(Sheet1!$C$2:$C$10*(Sheet1!$B$2:$B$10=$A2)*COUNTIFS(Sheet2!$A$2:$A$5,Sheet1!$A$2:$A$10,Sheet2!$B$2:$B$5,B$1))
I don't recommend using full-column references because it could be slow.
BTW I was assuming that there were no duplicates in Sheet2 for a particular combination of customer and region - if there were, you could use
=SUMPRODUCT(Sheet1!$C$2:$C$10*(Sheet1!$B$2:$B$10=$A2)*
(COUNTIFS(Sheet2!$A$2:$A$5,Sheet1!$A$2:$A$10,Sheet2!$B$2:$B$5,B$1)>0))
EDIT
It is worth using a dynamic version of the formula, though it is not elegant:
=SUM(Sheet1!$C2:INDEX(Sheet1!$C:$C,MATCH(2,1/(Sheet1!$C:$C<>"")))*(Sheet1!$B2:INDEX(Sheet1!$B:$B,MATCH(2,1/(Sheet1!$B:$B<>"")))=$A2)*
(COUNTIFS(Sheet2!$A$2:INDEX(Sheet2!$A:$A,MATCH(2,1/(Sheet2!$A:$A<>""))),Sheet1!$A2:INDEX(Sheet1!$A:$A,MATCH(2,1/(Sheet1!$A:$A<>""))),Sheet2!$B$2:INDEX(Sheet2!$B:$B,MATCH(2,1/(Sheet2!$B:$B<>""))),B$1)>0))
As you would need to make the match in memory I don't think it's feasible in Excel, you'll have to use a vba dictionary.
On the other hand, if the number of columns is fixed in your sales sheet, you can just format as table and add your index match in F.
When updating the sales data delete all lines as of line 3 and copy paste the update value. Excel will automatically apply the index match on all rows.

Return the running total of a specific item # from a non-static list of multiple item #'s

I am trying to create a simplified logistics spreadsheet that has a static tab of items (titled 'Items available') and their available quantities that, for each item, displays the running total of that item in inventory by referencing another tab ('Released & added') of items and their continually added & subtracted quantities.
The 'Released & added' tab will be a dynamic one and will use positive integers when a part quantity is being added and negative integers when they are being reduced. A formula that counts the number of rows in the dynamic tab in order to determine the table set first would be preferable, but for my own purposes, setting lookup range to a static quantity such as 2000 would suffice.
I have tried using various formulas that utilize INDEX and MATCH, however, I cannot seem to find a solution that properly hashes the table array in the released & added tab and it looks to me as if the AGGREGATE function may be required to do so.
Sheet1:
| Part Code | Available quantity |
|-----------|--------------------|
| ABC123 | Should be 35 |
| XYZ321 | Should be 21 |
| EFG456 | Should be 25 |
Sheet2:
| Part Code | Released / Added |
|-----------|------------------|
| ABC123 | 55 |
| XYZ321 | 28 |
| ABC123 | -12 |
| EFG456 | 35 |
| EFG456 | -10 |
| XYZ321 | -7 |
| ABC123 | -8 |
Right, you seem to benefit from using SUMIF()
The formula used in B2 translates to:
=SUMIF(Sheet2!$A$2:$A$8,Sheet1!A2,Sheet2!$B$2:$B$8)

Formula to get the month of the last value

I have sales data by customer as follows:
| - | A | B | C | D | E | F | G |
|---|---------------|--------|--------|--------|--------|--------|--------|
| 1 | Customer Name | Jan-18 | Feb-18 | Mar-18 | Apr-18 | May-18 | Jun-18 |
| 2 | Mr.A | 1000 | 500 | 0 | 200 | 0 | 0 |
| 3 | Mr.B | 0 | 300 | 200 | 0 | 0 | 100 |
I need the formula to know the last sales of the respective customer booked (the name of the month)
in this case, Mr. A last order is in Apr-18 while Mr.B is in Jun-18.
I have 2,000 plus customer and sales data since Apr 2016 up to last month, it will be a huge time saving to have a formula to help.
Assuming your 'months' are dates, not Text. Courtesy #barry houdini:
=LOOKUP(2,1/(B2:G2<>0),B$1:G$1)
in Row2 and copied down to suit, formatted mmm-yy.
Ref
An alternative to using LOOKUP() as in this answer, not sure what impact it has performance-wise as both need to create an array but I would take a stab in the dark that this is less performant:
=INDEX($B$1:$G$1,,MAX((B2:G2<>0)*COLUMN(B2:G2)-1)) - Ctrl+Shift+Enter
Ofcourse this could be edited to a dual lookup on the customer too:
=INDEX($B$1:$G$1,,MAX(INDEX(($B$2:$G$3<>0)*COLUMN($B$2:$G$3)-1,MATCH("Mr.B",$A$2:$A$3,0),0)))
This doesn't require the CSE as INDEX() handles the array manipulation

Calculations that have variable cells in Excel

I thought I understood Excel well enough until my boss asked me to do something in excel that involved MATCH and INDEX and for the life of me I can't figure out how those functions work. Perhaps more appropriately, I can't figure out how they're working in the spreadsheet I'm looking at. I'll just walk you through carefully what I'm trying to do.
I start by creating a drop down list which is no problem. The drop down list is a list of what is essentially probability tables. To skip past some irrelevant math, each table will have a single number that is generated from all of the numbers in the table that will be used in some calculations in other parts of the spreadsheet. Each of these tables will also have a name (top cell) that matches an entry in the drop down list.
[If anyone knows how to format this question so that it is a little easier to follow my question please, please feel free to tell me how. I don't know how to format stackexchange questions for excel worth anything.]
So ultimately, I have two main tables that are preforming calculations. The calcuations themselves are irrelevant. What is relevant is that I need to be able to add in a value into the calculation that can change depending on what is selected from the drop down list. So let me try to give an example.
Lets say I have this table:
| Month | Balance | Interest Rate |
|:--------:|:-------:|:-------------:|
| January | 100.00 | 1% |
| February | 101.00 | 1% |
| March | 102.01 | 1% |
| April | 103.03 | 1% |
| May | 104.06 | 1% |
| June | 105.10 | 1% |
I want the interest rate to be dependent on the drop down list so that perhaps I have set up where my drop down lists is generated from a table of cells that is something like this:
| Interest Rate |
|:-------------:|
| Low |
| Medium |
| High |
And I have three tables labeled "Low", "Medium", and "High". Each of these tables will preform some calculation to get the final Interest Rate result that will be the number that shows up in the top table. So that if I select "High", my table will look like this instead.
| Month | Balance | Interest Rate |
|:--------:|:-------:|:-------------:|
| January | 100.00 | 5% |
| February | 105.00 | 5% |
| March | 110.25 | 5% |
| April | 115.76 | 5% |
| May | 121.55 | 5% |
| June | 127.63 | 5% |
I'm pretty sure I need index and match functions to do this. I'll even put in a formula that is doing something close to what I'm doing but I can't seem to decipher how everything is working.
=INDEX($U$13:$BM$416,MATCH(D12,$T$13:$T$416,0),MATCH($A$13,$U$11:$BM$11,0) + 1) * SUM(P:P)
I know that that doesn't mean much when you can't see the worksheet, but that formula is doing very close to what I need to do. I guess my ultimately question is just if anyone will help walk me through how I could accomplish this in Excel?
EDIT: Here's a better glimpse
Lets say I have these 3 tables that show interest rates for various different things (e.g. Auto Loan, Mortage, Credit Cards). The "######"s are just showing that there are values in those cells that are used to calculate the numbers at the bottom (0.01, 0.03, etc.). Lets also say that the range in excel for these 3 Data Tables is A1:I6.
| | DataTable 1 | | | DataTable 2 | | | DataTable 3 | |
|:------------:|:---------------:|:-------------:|:------------:|:---------------:|:-------------:|:------------:|:---------------:|:-------------:|
| Low,Interest | Medium,Interest | High,Interest | Low,Interest | Medium,Interest | High,Interest | Low,Interest | Medium,Interest | High,Interest |
|--------------|-----------------|---------------|--------------|-----------------|---------------|:-------------|-----------------|---------------|
| ####### | ####### | ####### | ####### | ####### | ####### | ####### | ####### | ####### |
| ####### | ####### | ####### | ####### | ####### | ####### | ####### | ####### | ####### |
| 0.01 | 0.03 | 0.05 | 0.02 | 0.04 | 0.06 | 0.10 | 0.20 | 0.30 |
I have a drop down list in A8 that contains the values Data Table 1, Data Table 2, and Data Table 3.
Lets say I have another table (Range is K1:M14) that looks like the 1st table in this question.
| Month | Balance | Medium Interest |
|:---------:|:-------:|:---------------:|
| January | $100.00 | 3% |
| February | $103.00 | 3% |
| March | $106.09 | 3% |
| April | $109.27 | 3% |
| May | $112.55 | 3% |
| June | $115.93 | 3% |
| July | $119.41 | 3% |
| August | $122.99 | 3% |
| September | $126.68 | 3% |
| October | $130.48 | 3% |
| November | $134.39 | 3% |
| December | $138.42 | 3% |
I wrote a formula that would determine how the 3% gets into the Medium Interest column.
=INDEX($A$6:$I$6,MATCH($A$8,$A$1:$I$1,0),MATCH($M$2,$A$2:$I$2,0))
It works when I choose Data Table 1 in the drop down list. It correctly places 3% which is the medium interest rate for Data Table 1 but when I choose either of the other 2 data tables, I get an invalid cell reference error. This is essentially what I need to do in my real spreadsheet.
Not sure I can say how to do what you want, but I can at least explain MATCH and INDEX and what your formula is doing with them - hopefully that will be enough!
MATCH(what,in_where,match_type) will return the index of what in the array/range in_where based on the match_type. The "best" match_type is 0 - like in your example - which means "exact match". The other options are 1 for "less than" and -1 for "greater than" - both requiring you in_where to be sorted...
So you first example MATCH(D12,$T$13:$T$416,0) is looking for the exact value that is in D12 in the range $T$13:$T$416.
INDEX(in_where,row,column) will return the value in the array/range in_where at row row and column column.
In your example, you are looking in the range $U$13:$BM$416 with the row/column given by the MATCHes... The first MATCH is looking for D12 roughly in column T and the second is looking for A13 roughly in row 11. (I.e. it looks like your "table" has headers in row 11 and "keys" in column T and you are searching for the intersection of their locations.) The +1 in the column will be to correctly align the index returned by the MATCH and the the column number for the INDEX...
Without seeing this (e.g. file somewhere like dropbox, or a screengrab) it is hard to say more - but I hope this helps!
Btw - INDEX & MATCH as a combination can also be a good replacement of VLOOKUP if your "key" column is to the right of the "value" column that you want (or if you have a wide table and any change within it force loads of recalculations)
UPDATE based on second part of question
The new example gives the formula: =INDEX($A$6:$I$6,MATCH($A$8,$A$1:$I$1,0),MATCH($M$2,$A$2:$I$2,0))
INDEX will return the value for the given row/column. In this example your "table" is a single row $A$6:$I$6 so you would need to give just row 1 here - you aren't looking in a grid, but just a list.
So, you are looking to find the interest value for the interest level (Low/Medium/High at the top of your table) in the right DataTable (selected from a drop down). There are a few ways to do this, depending on the control you have...
Create a real data grid with Low/Medium/High down the side, 1/2/3 along the top and the % inside - then use INDEX as originally planned... MATCH the selections to the row/column
If that is a bit much to do, how about creating a new "compound key" to your table... e.g. Row 2 could contain 1_Low, 1_Medium, 1_High, 2_Low, etc. You then use just one search, but with a concatenated key : =INDEX($A$6:$I$6,1,MATCH($A$8 & "_" & $M$1,$A$2:$I$2,0))
Otherwise, you would first need to find "DataTable 1" in the first header row and use that to restrict the range to search for the interest rate level header... It is a bit more complicated and would depend more on the details of your tables (e.g. are they all the same number of columns - Low/Medium/High - or do some have Very High)
The formula for the 3% in the Medium Interest column should be:
=INDEX(A6:I6,,MATCH(A8,A1:I1,0)+1)
This formula returns the value in the index array A6:I6. Since there is only one row of data in the array A6:I6, it is not necessary to specify the row position for the index function. That is why there are two commas together - the row reference is missing and is not necessary. MATCH supplies the column number reference for the function based on your drop down list, which will be the values 1, 4, or 7 and then +1 to move over one more column. MAKE SURE that in cell A1 you have "DataTable 1", in cell D1 have "DataTable 2", and cell G1 have "DataTable 3".

Complex lookup in Excel

I have a worksheet which contains a list of parameters 'Parameters':
A | B | C | D | E |
Manufacturer | Item Type | Price From | Price To | Percentage |
Apple | Mobile Phone | 0.00 | 99.99 | 50% |
Apple | Mobile Phone | 100.00 | 149.99 | 45% |
Apple | Tablet | 0.00 | 99.99 | 65% |
I have another worksheet which contains a list of retail items 'Retail Stock':
A | B | C | D |
Manufacturer | Item Type | Purchase Price | Retail Price |
Apple | Mobile Phone | 80.00 | ? |
Apple | Mobile Phone | 120.00 | ? |
Apple | Tablet | 95.00 | ? |
What I need to do in column D of 'Retail Stock' Worksheet, I need to pull back the relevant Percentage from the parameters worksheet in order to work out the Retail Price.
To find the percentage I need to do a lookup on Parameters worksheet, passing Manufacturer, Item Type and Purchase Price.
Please can someone advise on this,
I appreciate my question may need more padding to get the right answer, so if you need any more information, please ask.
You could use SUMIFS:
=SUMIFS(Parameters!E:E,Parameters!A:A,A2,Parameters!B:B,B2,Parameters!C:C,"<="&C2,Parameters!D:D,">="&C2)
I don't think there can be overlaps in prices as this wouldn't make much sense to me, so the above should give you the appropriate percentage.
Format as appropriate.
Note: If there is no match, then the function will return 0.
SUMIFS will take the sum from the column E of Parameters, provided that:
Column A is equal to A2,
Column B is equal to B2,
Column C is below C2,
Column D is above C2
here will only ever be one match, there will be no overlap in parameters
Try this one:
=SUMPRODUCT((Parameters!$A$2:$A$100=A2)*
(Parameters!$B$2:$B$100=B2)*
(C2>=Parameters!$C$2:$C$100)*
(C2<=Parameters!$D$2:$D$100)*
(Parameters!$E$2:$E$100)
)
for non matching rows formula returns 0

Resources