This site will look better if you upgrade to a browser that supports web standards.
Lets take a look at the variable rate tax formula
   =SUMPRODUCT(--(A1>{6000;20000;50000;60000}),(A1-{6000;20000;50000;60000}),{0.17;0.13;0.12;0.05})
					which applies to these marginal tax bands:
Taxable Income Marginal Low Threshold High Threshold tax rate $ 0 $ 6,000 0% $ 6,001 $20,000 17% $20,001 $50,000 30% $50,001 $60,000 42% $60,001 and over 47%
The formula looks imposing, but it's actually not too complicated. Here's how we can break it down:
The first argument,
    --(A1>{6000;20000;50000;60000})
					creates a 4-element array that compares the top of each of the first 4 brackets to A1, returning TRUEs or FALSEs for each comparison. For example, if A1=15000, then the array would be evaluated as
    {A1 > 6000; A1 > 20000; A1 > 50000; A1 > 60000}
					or
   {TRUE;FALSE;FALSE;FALSE}
					Similarly, if A1=55000, the array returned would be {TRUE;TRUE;TRUE;FALSE}.
When a boolean value is used in a math function, XL coerces TRUEs to 1 and FALSEs to 0. The double unary-minus (-) operators are the fastest way to do the coercion. So
     --{TRUE;FALSE;FALSE;FALSE}
					is first evaluated as
     -{-1; -0; -0; -0}
					which then resolves to
     {1;0;0;0}
					The second argument,
    (A1-{6000;20000;50000;60000})
					creates a 4-element array that subtracts the top of each of the first 4 brackets from A1, to return the amount in A1 above that bracket. If A1=15000, the array would be evaluated as
    {15000 - 6000; 15000 - 20000; 15000 - 50000; 15000 - 60000}
					or
    {9000;-5000;-35000;-45000}
					and if A1=55000, the array would be evaluated as
    {55000 - 6000; 55000 - 20000; 55000 - 50000; 55000 - 60000}
					resulting in
    {49000;35000;5000;-5000}.
					When these two arrays are multiplied within SUMPRODUCT(), the result is the amount to be taxed at the next highest rate. For A1=15000:
    {1;0;0;0} * {9000;-5000;-35000;-45000}
					which is multiplied as
    {1 * 9000; 0 * -5000; 0 * -35000; 0 * -45000}
					which results in the array
    {9000;0;0;0}
					For A1=55000:
    {1;1;1;0} * {49000;35000;5000;-5000}
					is multiplied as
    {1 * 49000; 1 * 35000; 1 * 5000; 0 * -5000}
					which results in the array
    {49000;35000;5000;0}
					Taking the latter case, since the first two values are the total amounts above the 0% and 17% brackets, respectively, we can't just multiply $49,000 by 17% and add $35,000 times 30%, because $35,000 of the $49,000 would then be taxed at 17% + 30% or 47%.
The trick is to multiply each amount by the change in marginal tax rates. That way, all $49,000 has the 17% applied, but only $35,000 of that has the additional 13% applied to make a total of 30%. Extending that, the third argument is made up of
    {17% - 0%; 30% - 17%; 42% - 30%; 47% - 42%} = {0.17;0.13;0.12;0.05}
					(when entered directly, the values must be entered in decimal form, not percentages). Note that if the marginal tax rate for a higher income bracket was lower than that of the previous bracket (!) the array value would be negative.
SUMPRODUCT() now completes the multiplication:
   {49000;35000;5000;0} * {0.17;0.13;0.12;0.05}
					multiplies as
   {49000 * 0.17; 35000 * 0.13; 5000 * 0.12; 0 * 0.05}
					resulting in the array
   {8330;4550;600;0}
					and then sums them
8330 + 4550 + 600 + 0
for a total tax of $13,480.
This page last updated 
© Copyright 2001 - 2004 McGimpsey and Associates. Except where noted, all code on this site may be distributed under the Gnu GPL. Acknowledgement is appreciated.
Back to Using SUMPRODUCT()...