Look up formula works well except for one column - excel
I have an excel file that has been uploaded here
http://www58.zippyshare.com/v/99974349/file.html
The formula works great except for a column with descending values.
=INDEX(
INDIRECT("'"&LOOKUP(B5,TblA)&"'!A6:A36"),
LOOKUP(9.99999999999999E+307,
SEARCH("-"&C8&"-","-"&INDIRECT("'"&LOOKUP(B5,TblA)&"'!C6:C36")&"-"),
ROW(C6:C36)-ROW(C6)+1))
Let me explain the excel file.
I have one main sheet 'Report' and 4 other sheets correspond to 4 age groups. - 4.2.0 to 4.7.30, 4.8.0 to 5.1.30, 5.2.0 to 5.7.30 and 5.8.0 to 6.1.30. Depending on the Age (B5) in the sheet 'Report', I select one of the 4 sheet to pick values from. I pick the correct sheet using a Table Name TblA which contains all sheet names and is defined from A24 to B27 in the sheet 'Report'.
In the sample sheet that is uploaded, B5 contains the value 5.7 which means we have to select the sheet 5.2.0 to 5.7.30.
Now from the sheet 5.2.0 to 5.7.30, I have to seek the respective Standard Score (1st column) for every Raw Score entered in 'Report'.
Here are the steps:
A. Enter Raw scores in sheet 'Report' C7 to C15
B. Search Respective sheet depending on age (B5 cell), in our case 5.2.0 to 5.7.30 since age is 5.7
C. Populate Standard score from Raw scores by picking the corresponding column in the 4 sheets. For example, if Raw Score of Col1 is 25 (C7), then pick the Standard score of Col1 from 5.2.0 to 5.7.30 and enter in D7 and so on.
D. This way all standard scores are filled in D7 to D15.
The formula works great except for D13 in sheet 'Report' since if you observe ColD in 5.2.0 to 5.7.30, it is in descending order.
How do I change the formula to accomodate this unique column?
Well, it's not really the order that's causing the error, it's because you don't have any results! The formula you use is trying to find -159- which it cannot find at all in the age sheet. You really need something to look into ranges, so that if you have 159, it will return a positive result when you try to match against 139-160.
I have made a formula building it from smaller ones, but when assembled, the repeating units make it daunting... Also, it's an array formula, so you need to use Ctrl+Shift+Enter for it to work as intended. You can still drag the formula down.
=INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!A6:A36"),
IFERROR(
MATCH(
C7,
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)*1,
0
),
MATCH(
1,
IF(
1*LEFT(
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
),
FIND(
"-",
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
),
FIND(
"-",
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
)+1,
100
)>=C7,
1,
0
)
,0
)
)
)
The single line version...
=INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!A6:A36"),IFERROR(MATCH(C7,INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0))*1,0),MATCH(1,IF(1*LEFT(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))-1)<=C7,1,0)*IF(1*MID(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))+1,100)>=C7,1,0),0)))
You can notice that there are some repeating blocks, namely:
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36")
For the sheet name;
INDEX(
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
Which is a larger block to make the formula a bit more flexible (it automatically picks the correct column e.g. if you change B8 Exclusion to Col1, the formula will automatically adjust itself)
If I call the first Sheet and the second Column, it becomes much shorter and perhaps easier to understand:
=INDEX(
Sheet,
IFERROR(
MATCH(
C7,
Column*1,
0
),
MATCH(
1,
IF(
1*LEFT(
Column,
FIND(
"-",
Column
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
Column,
FIND(
"-",
Column
)+1,
100
)>=C7,
1,
0
)
,0
)
)
)
Or
=INDEX(Sheet,IFERROR(MATCH(C7,Column*1,0),MATCH(1,IF(1*LEFT(Column,FIND("-",Column)-1)<=C7,1,0)*IF(1*MID(Column,FIND("-",Column)+1,100)>=C7,1,0),0)))
Disclaimer: I'm not sure if there are any way to make this even shorter, but I guess that as long as it's working right now ^^
You can download your updated sheet here.
Explanation:
As I mentioned before, the formula is based off several smaller ones and quite a few repeats of those.
INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36")
As you already know (it's a variation of a part of your own formula), this gives the area containing all the different ages. Using it and the below, we get this:
INDEX(
INDIRECT('"&LOOKUP($B$5,TblA)&"'!B6:J36"),
0,
MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)
)
Into:
INDEX(
'Sheet'!B6:J36,
0,
MATCH(B7,'Sheet'!B5:J5,0)
)
Index will thus look into the range 'Sheet'!B6:J36, 0 indicates it will take any column(s) and MATCH(B7,'Sheet'!B5:J5,0) returns the nth column by taking the value of B7 (in the case of your spreadsheet, Col1) and looking it into 'Sheet'!B5:J5 which gives 1. The above will thus return the range 'Sheet'!B6:B36. Let's put it in the formula:
=INDEX(
'Sheet'!A6:A36,
IFERROR(
MATCH(
C7,
'Sheet'!B6:B36*1,
0
),
MATCH(
1,
IF(
1*LEFT(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)+1,
100
)>=C7,
1,
0
)
,0
)
)
)
This formula is itself a giant INDEX formula, with range 'Sheet'!A6:A36 and row number as the big IFERROR group. The first part of the IFERROR() gets evaluated first:
MATCH(
C7,
'Sheet'!B6:B36*1,
0
)
This should be easy enough to understand. It looks for the raw score (from C7) into the range we obtained earlier, times 1 to convert everything to number (you can't look up numbers and text and expect a match). So that if there's an exact match of a number, it will return the row number of the found raw score and feed it to the INDEX(). For example, if the first row is returned, we get:
=INDEX('Sheet'!A6:A36,1)
Which is 'Sheet'!B6. If however there's no match (i.e. the raw score cannot be found), MATCH will return an error. And that's when the second part of the IFERROR comes into play:
MATCH(
1,
IF(
1*LEFT(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)-1
)<=C7,
1,
0
)*
IF(
1*MID(
'Sheet'!B6:B36,
FIND(
"-",
'Sheet'!B6:B36
)+1,
100
)>=C7,
1,
0
)
,0
)
This MATCH tries to find 1 within what seems to be two IFs; the first one being:
IF( 1*LEFT('Sheet'!B6:B36,FIND("-",'Sheet'!B6:B36)-1)<=C7 , 1 , 0)
FIND("-",'Sheet'!B6:B36)-1 gets the position of the last character before the - in the column 'Sheet'!B6:B36.
With those values, this FIND would return:
12-13 -> 2
145-155 -> 3
1567-1865 -> 4
The IF thus becomes:
IF( 1*LEFT('Sheet'!B6:B36,{2,3,4})<=C7 , 1 , 0)
Notice the braces here; they indicate an array and that's why this is an array formula. LEFT then extracts all the characters before the - (remember your other question, I answered with a technique very similar to this):
12-13 -> 2 -> 12
145-155 -> 3 -> 145
1567-1865 -> 4 -> 1567
Which is...
IF( 1*{12,145,1567}<=C7 , 1 , 0)
Again, 1* converts those to actual numbers because LEFT be default returns text characters. It's important here to do this because we're going to use the comparator <=, so that if the value to the left of C7 (the raw score), then the IF should return 1, else, it should return 0. Let's say that the raw score was 154. The results would be:
IF( {12,145,1567}<=154 , 1 , 0)
IF( {TRUE,TRUE,FALSE} , 1 , 0)
{1,1,0}
I just realised that the formula can be made a little shorter xD Anyway, we'll see that later. The next IF behaves in a similar fashion, but checks for the value at the right of the -:
IF( 1*MID('Sheet'!B6:B36,FIND("-",'Sheet'!B6:B36)+1,100)>=C7 , 1 , 0)
With...
FIND MID('Sheet'!B6:B36, X, 100)
12-13 -> 4 -> 13
145-155 -> 5 -> 155
1567-1865 -> 6 -> 1865
You can notice that this formula will stop working if you have something above 100 character long here. Anyway, the IF thus becomes:
IF( {13,155,1865}>=154 , 1 , 0)
IF( {FALSE,TRUE,TRUE} , 1 , 0)
{0,1,1}
Now that we have these, the MATCH from before becomes:
MATCH( 1 , {1,1,0}*{0,1,1} , 0)
Some simple math makes this into:
MATCH( 1 , {0,1,0} , 0)
And what is the position of the 1 in there? That's right, position 2!
Our original formula this becomes:
=INDEX( 'Sheet'!A6:A36 , IFERROR( #Error! , 2 ) )
So that if nothing was found at first, it will return an error (#N/A in this case) and instead return 2. =INDEX( 'Sheet'!A6:A36 , 2 ) gives 'Sheet'!A7.
And the slightly shorter version is:
=INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!A6:A36"),IFERROR(MATCH(C7,INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0))*1,0),MATCH(1,(1*LEFT(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))-1)<=C7)*(1*MID(INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)),FIND("-",INDEX(INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B6:J36"),0,MATCH(B7,INDIRECT("'"&LOOKUP($B$5,TblA)&"'!B5:J5"),0)))+1,100)>=C7),0)))
I actually removed the inner IFs, because (a>b)*(c>b) already returns 0s and 1s since TRUE multiplied by TRUE gives 1 in excel.
In Excel 2007 the formulae are returning a lot of circular reference warnings, so it may be worth adding a tag for your Excel version. Mine is Excel 2007 but with it the results you want seem achievable as below:
To shorten the formulae and reduce computation I have added in Report C5 "Table" and in D5 =VLOOKUP(B5,TblA,2,1).
I have also inserted a column immediately to the right of ColumnH ("ColD") in 5.2.0 to 5.7.30 and applied Text To Columns on Column H, with - as the delimiter.
I then applied to Report E7 and copied down to E15:
=INDEX(INDIRECT("'"&D$5&"'!A6:A36"),MATCH(C7,INDIRECT("'"&D$5&"'!"&CHAR(ROW()+59)&"6:"&CHAR(ROW()+59)&"36"),0))
and adjusted the 59s to 60s in the last three rows. Such adjustment would not be necessary if ColumnI were moved far enough to the right.
In E13 I changed the match from exact to next higher (final 0 to -1).
For Figures I cheated and changed K23 in 5.2.0 to 5.7.30 to 22 from 21-22, but such banding could, for other columns, be treated in much the same way as I did for ColD.
Related
Excel formula to sum an array based on multiple criteria of arrays -- Fantasy Football
I have 2 tables and need to use criteria from table1 (Team) to look up information from Schedule2 (Team's Schedule for the year) and then use that array from Schedule2 to find the matches in table1 (opponents) and pair that with the criteria of matching the position within table 1 (position = position) to then sum up the associated numbers that match (2021 opp position points) to calculate the expected total points for the year. In English: use the team to look up the schedule, use the schedule to look up the array of opponents the team has for the year, use the array of opponents for the year to find the opponents in table1, and then match the position of the current row to the position that is playing each of those opponents, and then sum up the associated points. Goal: This is to calculate a forecast of each team's position's total points for the year based on how many points their opponents for the year are currently giving away to each position. Explained Example: So if Dallas WR plays NYG, MIA, WAS, and MIA again, sum up the total points NYG, MIA, WAS, and MIA are currently giving to WRs they are currently play against. FYI WR = Wide Receiver RB = Running Back, TE = Tight End D/ST = Defense string, QB = Quarterback I can't use helper cells and need a single formula. Schedule2 will give duplicate values (Some teams play the same team twice and each of those values need to be calculated and not considered unique and not counted just once. The current formula I have is below but it only seemed to work for one row and didnt work when I drug it down to the row below. could be a referencing issue but I didnt notice anything that would cause this. The first part of the formula is meant to get the total for the non-duplicated values and the second is meant to get the duplicated values. = SUM( IF( ISERROR( MATCH( Table1[[#All],[Position]],G14,0) * MATCH(Table1[[#All],[Opponent]],INDEX(Schedule2,0,MATCH(Table1[#Team],Schedules!$AU$3:$CA$3,0)),0) ), 0, Table1[[#All],[2021 Opp Position]])) + SUM( IF( ISERROR( MATCH( Table1[[#All],[Opponent]], IF( COUNTIF( INDEX( Schedule2, 0, MATCH(Table1[#Team],Schedules!$AU$3:$CA$3,0) ), INDEX(Schedule2,0,MATCH(Table1[#Team],Schedules!$AU$3:$CA$3,0)))=2, INDEX(Schedule2,0,MATCH(Table1[#Team],Schedules!$AU$3:$CA$3,0)), ""), 0 ) * MATCH(Table1[[#All],[Position]],G14,0) * MATCH(Table1[[#All],[Opponent]],INDEX( Schedule2, 0, MATCH(Table1[#Team],Schedules!$AU$3:$CA$3,0) ),0) ), 0, Table1[[#All],[2021 Opp Position]] ) )
SWITCH True Multiple column and criteria in Power BI
I have a two different columns are one is name and another one is ID. The Name column contain text and number and the length of characters not always same. ID column contain number only. 1.If ID column contain 38 and Name column contain "-" then Train. 2.If ID column contain 56 and Name column contain "-" then Air. 3.If ID column contain 38 and Name column does not contain "-" then Road. 4.If ID column contain 56 and Name column does not contain "-" then Road. In Excel I am applying the following formula =IF(A3="","",IFERROR(IF(REPLACE(A3,1,SEARCH("-",A3),)+0,IF(B3&""="38","TRAIN",IF(B3&""="56","AIR","ROAD"))),"ROAD")) in order to get the result. I want calculated column.
this might be implemented in DAX as a calculated column that uses the SWITCH statement SWITCH( TRUE(), T[ID] = 38 && SEARCH( "-", T[NAME], 1, 0 ) > 0, "Train", T[ID] = 56 && SEARCH( "-", T[NAME], 1, 0 ) > 0, "Air", T[ID] IN { 38, 56 } && SEARCH( "-", T[NAME], 1, 0 ) = 0, "Road" ) The default (no matching conditions) is to return BLANK() Nested IFs could also be used, it is a matter of taste
Structured referenced table formula with filtered rows
I can't find the solution to this. Excel table with 3 Columns: [#ID] -> counter of rows [value] -> just a nunch of positives a negatives numbers [negative] -> 1 when value column is negative 0 when positive and cumulating negative streak Formulas [#ID] = ROW()-ROW(['# ID])+1 [negative] = IF([#['# ID]]=1,IF([#value]<0,1,0),IF([#value]<0,1+OFFSET([#negative],-1,0)),0)) How can keep this working when filtering some rows? Without filter With filter
Assuming the Table starts at row 3 or higher try this formula: = IF( [#value] >= 0, 0, IF( [#['# ID]] = 1, 1, SUM( 1, OFFSET( [#negative], IF( SUBTOTAL( 9, C2:C$3 ) = SUBTOTAL( 9, C$3:C3 ), -2, -1 ), 0 ) ) ) ) Suggest to see the following pages for additional information about the functions used: Excel functions (alphabetical) SUBTOTAL function OFFSET function
Extracting multiple numerical values from a carriage return-separated list in a cell
I have a table filled with cells formatted like this: ---(cell)--- 3 x item 2 x another item 299 x yet another item (... - variable amount of items here) 4 x the last item in this cell ---(end of cell)--- All items are separated with carriage returns (=CHAR(10)). I need to extract the numbers and do various operations on them according to the item type. I'll take it one problem at a time and try to extract the numbers first. I'd use MID but it doesn't help with finding "the first set of numerical characters after a carriage return". Any idea?
Here's a collection of formulas that will get you started. I have the cell to analyze as A1, and table of analysis results in B7:I11. The columns B-I are Item#, Start, End, SubString, Delim, Quantity and Item. First, you can count the number of s in your cell nCRs: =LEN($A$1)-LEN(SUBSTITUTE($A$1,CHAR(10),"")) The number of items is the number of CRs plus 1: nItems: =LEN($A$1)-LEN(SUBSTITUTE($A$1,CHAR(10),""))+1 Note: to use the same tools on all items, I'm adding a CR to the beginning and end of the string. That way I'm always extracting sub-strings that are CR-delimited. To get the first item, put a 1 in B7: B7: 1 To get the start of the first sub-string, use SEARCH with start pos = 1 C7: =SEARCH(CHAR(10),CHAR(10)&$A$1&CHAR(10),1) Similarly get the end of the first sub-string with SEARCH starting to the right of where the first CR was found D7: =SEARCH(CHAR(10),CHAR(10)&$A$1&CHAR(10),C7+1) Now use MID to extract the text between two E7: =MID(CHAR(10)&$A$1&CHAR(10),C7+1,D7-C7) In F7 I have delimiter text (between item count and item description), assumed to be " x ": F7: =" x " In G7 find the location of the delimiter G7: =SEARCH(F7,E7,1) In H7 extract the text left of the delimiter (item count) and convert to a number H7: =VALUE(LEFT(E7,G7-1)) In I7 extract the item description I7: =RIGHT(E7,LEN(E7)-G7-LEN(F7)+1) To get the second (and subsequent) items, start the search for CR where the last CR was found. So in C8 C8: =SEARCH(CHAR(10),CHAR(10)&$A$1&CHAR(10),D7) Fill the formulas down to complete the table. Hope that helps
This solution assumes data with text string containing multiple items per cell and separated by carriage returns is located in Sheet1 at B6:C11 as shown in figure 1 (adjust ranges in formulas as required). Fig. 1 Objective as presented by OP: I need to extract the numbers and do various operations on them according to the item type. I'll take it one problem at a time and try to extract the numbers first. Yes, they're (numbers) always at the start of each carriage return, as exemplified. What I need to do is stuff like "sum all numbers", "sum all item A", "sum all item B" etc. This solution proposes a review the objectives in order to first work on the extraction of the items to create a table with all items, after this is achieved then all other goals can be workout in a simpler manner. First we add a column to the data in Sheet1. Enter this formula in C7 and copy till last record. =SUM(1+LEN($B7),-LEN(SUBSTITUTE($B7,CHAR(10),""))) Let’s create in Sheet2 a table to extract the items from the data in the Sheet1. The extraction table is located at B6:G55 and contains the following items (see Fig. 2): Itm.Nbr(+) : Enter this formula in B7 and copy till last record =IF( OR( B6 = SUM( Sheet1!$C$6:$C$11 ), B6 = "" ), "", - 1 + ROWS( B$6:B7 ) ) Line(+) : Enter this formula in B7 and copy till last record =IF( EXACT( C6, C$6 ), 2, IF( $B7 = "", "", IF( $B7 <= SUM( INDEX( Sheet1!$C$6:$C$11, 1 ) : INDEX( Sheet1!$C$6:$C$11, C6 ) ), C6, SUM( 1, C6 ) ) ) ) Itm.Lne(+) : Enter this formula in B7 and copy till last record = IF( EXACT( D$6, D6 ), 1, IF( $B7 = "", "", IF( $C7 = $C6, SUM( 1, D6 ), 1 ) ) ) Extracted Lines(+) : Enter this formula in B7 and copy till last record =IF( $B7 = "", "", CLEAN( IF( $D7 = 1, LEFT( INDEX( Sheet1!$B$6:$B$11, $C7 ), FIND( CHAR(10), INDEX( Sheet1!$B$6:$B$11, $C7 ) ) ), MID( LEFT( INDEX( Sheet1!$B$6:$B$11, $C7 ) & CHAR(10), SEARCH( CHAR(135), SUBSTITUTE( INDEX( Sheet1!$B$6:$B$11, $C7 ) & CHAR(10), CHAR(10), CHAR(135), $D7 ) ) ), SEARCH( CHAR(135), SUBSTITUTE( INDEX( Sheet1!$B$6:$B$11, $C7 ), CHAR(10), CHAR(135), - 1 + $D7 ) ), LEN( INDEX( Sheet1!$B$6:$B$11, $C7 ) ) ) ) ) ) Item : Enter this formula in B7 and copy till last record =IF( $B7 = "", "", IFERROR( MID( $E7, 3 + SEARCH( " x ", $E7 ), LEN( $E7 ) ), "!Err" ) ) Qty : Enter this formula in B7 and copy till last record =IF( $B7 = "", "", IFERROR( --TRIM( LEFT( $E7, FIND( " ", $E7 ) ) ), "!Err" ) ) (+) This working fields can be hidden Fig. 2
Errors when nesting IF() formulas
I'm just putting together a simple spreadsheet that calculates tax owed based on a few different bands. I have an 'Invoiced Amount' cell that takes up the yearly invoicing and then applies a tax rate to it based on the following conditions: If 'Invoiced Amount' is below 10, 600 then Tax Owed = 0 If 'Invoiced Amount' is above 10, 600 but less than 42, 386 then Tax Owed = ((Invoiced Amount - Tax Allowance)/100) * 20 If 'Invoiced Amount' is Equal to or greater than 42, 386 than Tax Owed = ((42, 386 - Tax Allowance)*20)+((InvoicedAmount - 42, 386)*40) I could be overlooking something really basic here, but just to be sure - Tax Allowance is 10, 600 - Anything over this up to 42, 386 is worked out at 20% tax, and then anything earn above 42, 386 is charged # 40% on top... The more I type this out the more confused I am. Anyway, Here is my excel formula: InvoicedTotal = P5 TaxAllowance (10600) ='UK Tax Figures'!C3 TaxAllowanceUpperBand (42386) ='UK Tax Figures'!G5 TaxAllowance Upper Band - Tax Allowance (31784) = H5 UpperTaxAllownace Band (42386.01) = ='UK Tax Figures'!F5 =IF ((P5)<’UK Tax Figures’!C3, 0, IF(P5>=’UK Tax Figures’!C3<'UK Tax Figures'!G5, ((P5-'UK Tax Figures'!C3)/100)*20, IF(P5>='UK Tax Figures'!F5, ((H5/100)*20)+((P5-'UK Tax Figures'!F5)*40)) At the moment I'm getting crazy unexpected values back, so the calculation is obviously VERY wrong... But I can't see the wood for the trees at the moment, so if anyone has any thoughts I would really appreciate it! Going a little crazy here at the moment!
Putting your formula into the Online Excel Formula beautifier I notice several problems with your formula: =IF ( ( P5 ) < ’UK Tax Figures’!C3 , 0 , IF( P5 >= ’UK Tax Figures’!C3 < UKTaxFigures!G5, ( ( P5 - UKTaxFigures!C3 ) / 100 ) * 20, IF( P5 >= UKTaxFigures!F5, ( ( H5 / 100 ) * 20 ) + ( ( P5 - UKTaxFigures!F5 ) * 40 ) ) First of all, you lack two closing parantheses Furthermore, you have an invalid conditional in P5>=’UK Tax Figures’!C3<'UK Tax Figures'!G5, you need to change this to AND(P5>=UKTaxFigures!C3;UKTaxFigures!C3<UKTaxFigures!G5). Taking a look at how you reference your worksheets above, I notice that it seems you have two different sheets - one with spaces between the words in the sheet names, and one without. I suspect this is not the case, so you should probably remove those spaces from the formula. You are also inconsistent with whether or not you use apostrophes (’) around your sheet-names. Trying out your formula in a cell, Excel didn't seem to like them, so they should probably go as well. there seems to be a return-value missing from your innermost if-statement if it is false. Guessing a bit at what you want the formula to return, I end up with this formula: =IF(P5<UKTaxFigures!C3;0;IF(AND(P5>=UKTaxFigures!C3;UKTaxFigures!C3<UKTaxFigures!G5);((P5-UKTaxFigures!C3)/100)*20;IF(P5>=UKTaxFigures!F5;((H5/100)*20)+((P5-UKTaxFigures!F5)*40);0))) Which looks like this in the beautifier: =IF( P5 < UKTaxFigures!C3; 0; IF( AND( P5 >= UKTaxFigures!C3; UKTaxFigures!C3 < UKTaxFigures!G5 ); ( ( P5 - UKTaxFigures!C3 ) / 100 ) * 20; IF( P5 >= UKTaxFigures!F5; ( ( H5 / 100 ) * 20 ) + ( ( P5 - UKTaxFigures!F5 ) * 40 ); 0 ) ) ) Is that something close to what you want? As a final word of advice it is an absolute pain to write a formula like that - instead you can try to build it bit by bit, storing each part of the formula in one cell to see if each of them works. Then you can cut and paste so that they all fit in one cell. I.e. if you in cell A1 store: =IF(P5>=UKTaxFigures!F5;((H5/100)*20)+((P5-UKTaxFigures!F5)*40);0) Then you can put =IF(AND(P5>=UKTaxFigures!C3;UKTaxFigures!C3<UKTaxFigures!G5);((P5-UKTaxFigures!C3)/100)*20;A1) in A2 and this =IF(P5<UKTaxFigures!C3;0;A2) in A3. If necessary you can pick the formulas even further apart to make them more readable. Then in the end you just copy the formulas from the cells, and replace the references with them. Please note that I am not 100 % certain that I got everything correct, without proper data it is somewhat difficult to keep track of all the parantheses and results. But this should at least give you a good starting point.