I have a spreadsheet that I am making that looks as follows:
Index Diff Exc Sym Sec Result Criteria Met
3.42 -2.07 0.86 0.92 1.83 1.95
-0.38 -2.93 0.87 0.23 -2.01 0.09
-2.67 -1.84 0.87 -2.49 -3.48 1.32
-0.65 -0.98 0.46 0.98 -2.01 0.00
-0.73 -2.79 -1.07 -2.15 -1.44 -0.10
0.15 2.33 -0.46 -0.66 3.17 0.38 0.38
0.90 -3.68 -0.72 -1.01 -1.36 1.69
0.68 -1.12 -0.36 0.73 -1.34 -0.29
-1.19 -1.70 -0.56 -1.31 1.45 0.49
-0.45 -0.69 -0.56 -1.22 0.00 -0.49
2.94 8.38 2.21 6.25 4.96 1.74
-1.04 7.36 2.59 3.00 2.17 2.97
1.21 1.73 3.05 1.48 3.56 0.77
-1.10 1.86 0.60 1.18 1.07 -0.49
-0.89 -3.19 -1.78 -2.24 -4.26 -0.81
-1.17 -3.44 0.11 -1.22 3.66 0.36
0.52 0.92 -1.02 0.38 1.96 -1.40 -1.40
-0.90 3.01 -0.86 0.62 0.97 -0.50 -0.50
2.78 1.46 0.00 0.47 1.95 0.84
Max Min
Index 2.00 -2.00
Diff 10.00 0.00
Exc 0.00 -10.00
Sym 10.00 -10.00
Sec 20.00 0.00
Under the headings Index, Diff, Exc, Sym, Sec, Result is all data, In the criteria met column i have a formula that checks if the prior headings fall within the Max and Min limits of the smaller table underneath, and if they do it posts the result, if they dont all fall within the Max and Min boundaries it leaves it blank. I did that by using this formula:
=IF(AND(A3<$B$24,A3>$C$24,B3<$B$25,B3>$C$25,C3<$B$26,C3>$C$26,D3<$B$27,D3>$C$27,E3<$B$28,E3>$C$28),F3,"")
copied down the criteria met column. It works perfectly fine for what I want it to achieve but as this spreadsheet grows and I add more columns it seems like it will be incredibly inefficient and prone to alot of human error. Is there a way to achieve the same results but by using a more efficient formula?
a picture for reference as well:
Try this array formula:
=IF(SUM((A3:E3<=TRANSPOSE($B$24:$B$28))*(A3:E3>= TRANSPOSE($C$24:$C$28)))=COLUMNS(A3:E3),F3,"")
Being an Array Formula it must be confirmed with Ctrl-Shift-Enter when exiting Edit mode. When done correctly Excel will automatically put {} around the formula to denote an array formula.
One caveat, the Columns to be compared need to be in the same order as the min/max rows.
Also, as has been stated by nearly everyone if the Min Max were transposed to rows from column it would alleviate needing to use a CSE array formula. The following would work:
=IF(SUMPRODUCT((A5:E5>=$A$3:$E$3)*(A5:E5<=$A$2:$E$2))=COLUMNS(A5:E5),F5,"")
Try something like this:
=IF(PRODUCT(IF(ROW>TRANSPOSE(MIN),1,0),IF(ROW<TRANSPOSE(MAX),1,0))=1,RESULT,"")
In this example, A11:E11 is a row of data with RESULT in F11 and the MAX and MIN criteria are in $B$27:$B$31 and $C$27:$C$31, respectively.
=IF(PRODUCT(IF(A11:E11>TRANSPOSE($C$27:$C$31),1,0),IF(A11:E11<TRANSPOSE($B$27:$B$31),1,0))=1,F11,"")
Enter the expression as an array formula (CTRL-SHIFT-ENTER). Make sure to use a relative reference for each row of data and absolute references for the MAX and MIN criteria. Then copy/paste to evaluate other rows. Modifying this formula to accommodate additional columns of data can be done by extending the ranges.
If you are permitted to transpose the range that holds the MAX and MIN criteria to the same orientation as the data, the TRANSPOSE functions in this solution can be eliminated and the spreadsheet layout will be cleaner.
Hope that helps
How about:
=IF(AND(A3=MEDIAN(A3,B$24,C$24),B3=MEDIAN(B3,B$25,$C$25),C3=MEDIAN(C3,B$26,$C$26),D3=MEDIAN(D3,B$27,$C$27),E3=MEDIAN(E3,B$28,$C$28)),F3,"")
I would also move the criteria table into a separate tab to avoid that you have to adjust the loacation of the min/max values in your formula every time you add new rows to your data table.
Often in Excel, in order to simplify your formulas, you need to make your layout a little more complex. Without writing any vba, my approach would be ...
1) I would transpose your min / max layout and have them align with the columns of data.
2) Insert another sheet to hold intermediate calculations.
Here's Sheet1 ...
and here's Sheet2 ...
In Sheet2, cell B5 contains a typical formula ...
=IF(AND(Sheet1!B5<Sheet1!B$2,Sheet1!B5>Sheet1!B$3),1,0)
In Sheet2, cell G5 (and down) contains ...
=PRODUCT(B5:F5)
In Sheet1, cell H5 (and down) contains ...
=IF(Sheet2!G5=0,"",Sheet2!G5*G5)
It could omit the logic and you could make the sheet settings to not display 0 values.
If you add columns (e.g. insert columns between Sheet1 column F and G):
- add Max and Min values for new columns on Sheet1
- insert the same columns on Sheet2
- drag the formula from column F on sheet2 to the new columns on Sheet2
- verify the Product formula in the "Result" column on Sheet2 contains the new columns on Sheet2.
This method helps identify exactly what caused you to fail to meet your criteria.
Related
I have 3 columns and multiple rows and the structure of the columns/rows needs some changes. Since there is alot of rows i would want to do it with a formula or other to achieve the results and not manually change it.
Original:
Currency
Date
Value
EUR
2022-05-30
0.93
DKK
2022-05-30
1.93
SEK
2022-05-30
2.92
EUR
2022-05-31
0.95
DKK
2022-05-31
1.93
SEK
2022-05-31
2.93
EUR
2022-06-01
0.98
DKK
2022-06-01
1.93
SEK
2022-06-01
2.95
Expected:
Date
EUR
DKK
SEK
2022-05-30
0.93
1.93
2.93
2022-05-31
0.95
1.93
2.92
2022-06-01
0.98
1.93
2.95
So for each line there is originally a currency with a date and value. For each currency there is a new row (with same date). What i need is one date-row with multiple currency in one row (make currencies a column instead of rows)
I tried the Transponer in excel but it did not get me the result i wanted. This is what Transponer got me:
DKK
EUR
SEK
2022-05-30
2022-05-30
2022-05-30
1.93
0.93
2.93
The easiest way to achieve your aim, is to use a PivotTable.
To do it only using formulas.
In Excel for O365.
Extract a unique list of dates by using the UNIQUE function for the date column.
=SORT(UNIQUE(B2:B10))
Extract a unique list of currencies by using the UNIQUE function and then transpose it with the TRANSPOSE function to populate the column headings for the currencies.
=TRANSPOSE(UNIQUE(A2:A10))
Then use XLOOKUP with multiple criteria and ranges to return the matching exchange rates.
The ampersand & symbol is used to join the lookup_value and lookup_array allowing multiple criteria.
=XLOOKUP(G$1&$F2,$A$2:$A$10&$B$2:$B$10,$C$2:$C$10,0)
I would like to run a regression in excel using LINEST function combined with INDIRECT. I need to select the time series between dates and multiply Y and X with an Index before I run the regression.
Date | Y | X | Index
30/06/1990 1.21 2.20 -
30/09/1990 0.73 1.33 -
31/12/1990 -0.07 1.31 -
31/03/1991 1.64 0.80 1.00
30/06/1991 -0.14 0.61 1.00
30/09/1991 4.13 2.37 1.00
31/12/1991 0.71 0.78 1.00
31/03/1992 0.95 0.78 -
30/06/1992 1.61 0.78 -
By using the above data, I need to use the LINEST function from 31/03/1991 until 30/06/1992 but for dates only when the index is 1.
My idea was to use INDIRECT to specify the date range, multiply the LINEST( INDIRECT(Y)*INDIRECT(Index),INDIRECT(X)*INDIRECT(Index),0,0) but I have a error.
Thank you for your help
If the cells in the target range will always be consecutive, try...
H2, confirmed with CONTROL+SHIFT+ENTER:
=SMALL(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,ROW($A$2:$A$10)))),1)
I2, confirmed with CONTROL+SHIFT+ENTER:
=LARGE(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,ROW($A$2:$A$10)))),1)
J2, confirmed with just ENTER:
=LINEST(INDEX($B:$B,H2):INDEX($B:$B,I2),INDEX($C:$C,H2):INDEX($C:$C,I2),0,0)
Otherwise, try the following instead...
H2, confirmed with CONTROL+SHIFT+ENTER:
=LINEST(N(OFFSET($B$2:$B$10,SMALL(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,ROW($B$2:$B$10)-ROW($B$2)))),ROW(INDIRECT("1:"&SUM(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,1))))))),0,1)),N(OFFSET($C$2:$C$10,SMALL(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,ROW($C$2:$C$10)-ROW($C$2)))),ROW(INDIRECT("1:"&SUM(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,1))))))),0,1)),0,0)
However, for Excel 2010 and later, MODE.MULT can be used instead...
H2, confirmed with CONTROL+SHIFT+ENTER:
=LINEST(INDEX($B:$B,N(IF(1,MODE.MULT(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,ROW($A$2:$A$10)*{1,1}))))))),INDEX($C:$C,N(IF(1,MODE.MULT(IF($A$2:$A$10>=F2,IF($A$2:$A$10<=G2,IF($D$2:$D$10=1,ROW($A$2:$A$10)*{1,1}))))))),0,0)
Hope this helps!
Im trying to find matches between column B and C when the value in A is above a certain threshold.
0.99 p269 p269
0.99 p312 p312
0.64 p249 p249
0.64 p247 p247
0.09 p243 p284
I'm trying the Countifs method but it doesnt work.
=COUNTIFS(
A1:A31968,">" & F2,
B1:B31968,C1:C31968
)
The first part works (F2 is my treshold), but the I want to check all rows.
So when my threshold is 0.5 I want 4 as a result. When the threshold is 0.08 I still want 4 because the labels of the fifth row don't match. How do I do this?
One option would be to add a fourth column to spreadsheet in column D containing the following formula:
=IF(B1=C1, 1, 0)
Here is what your spreadsheet looks like now:
A B C D
0.99 p269 p269 1
0.99 p312 p312 1
0.64 p249 p249 1
0.64 p247 p247 1
0.09 p243 p284 0
In other words, if columns B and C agree, there is a 1 otherwise 0. Then, you can use the following COUNTIFS formula:
=COUNTIFS(A1:A5,">0.5",D1:D5,"=1")
Here we check the 0.5 threshhold on column A as you were already doing, but we also check that the B and C values are in agreement.
The other option is to use a pseudo-array formula
=SUMPRODUCT((A1:A5>F2)*(B1:B5=C1:C5))
to combine the two conditions. It doesn't have to be entered as an array formula, but may have performance issues if used on several thousand rows of data.
I have a list of numbers that I need to count, however I need to count the 0.00 but not the 0's. For example:
0
0.00
2.85
6.68
1.35
3.27
5.24
5.42
3.32
7.20
0
0
I would need this to count 9 and exclude the three 0's
I have tried using a COUNTIF formula but it seems to be treating the 0.00 and 0 in the same way which isn't giving me the result I need.
Any help would be appreciated as I'm unable to think of any other way around this.
If you format the list of numbers as Text then the COUNTIF formula will respect the difference between 0 and 0.00. See this example below.
Both B1 and E1 have a similar formula:
=COUNTIF(D1:D12,"<>0")
But the range D1:D12 has been given a format of text and so includes the 0.00 therefore giving the answer you want - 9.
I have a massive amount of data which I would like to calculate some simple statistics (sum, mean, max). The data is grouped in columns and what I would like to do is calculate these statistics for the data in groups of sixteen columns. It is possible to manually select the columns to process but given the massive amount of data (365 columns x 601552 rows), I'm very likely to make mistakes. What I've been trying to figure out is how to get Excel to displace the cells selected each time the calculation is done. I know this entails the use of offset function but I can't figure out how to make it work. Any pointers will be highly appreciated. Thanks!
EDIT:
Essentially the data looks as follows:
LAT LONG 1 2 3 4 … 365
-40 -20 10.50 0.00 1.70 0.00 … 0.00
-40 -19.9 19.00 5.00 0.00 0.00 … 9.30
-40 -19.8 0.00 0.00 0.00 5.60 … 0.00
-40 -19.7 12.00 3.40 0.00 0.00 … 0.00
… … … … … … … …
40 55 0.00 0.00 7.60 7.00 … 0.00
It is basically 365 days worth of rainfall for a large group of coordinates. What I want to do is collate basic stats (sum, mean and maximum rainfall) for each coordinate in 16-day aggregates (which comes to 22 full 16 day aggregates plus one with 13 or 14 days depending on whether it is a leap year). The formula I'm using right now is =SUM(OFFSET(C2,,,1,16)) which works fine for the first column (reference cell C2) but I want to copy this across the entire sheet. I think there is a way to get it to increment the reference cell by 16 each time but I can't seem to figure that out.
Here is a proof of concept of what you might be after. I've set it up to calculate statistics on a four-day cycle, but you should be able to extend it to a 16-day cycle:
I copied the "labels" (LAT/LONG values) to duplicate the index.
The formula in cell D17 is
=IF(MOD(COLUMN()-2,4)=0,AVERAGE(OFFSET(D17,-15,-3,1,4)),
IF(MOD(COLUMN()-2,4)=3,MEDIAN(OFFSET(D17,-15,-2,1,4)),
IF(MOD(COLUMN()-2,4)=2,MAX(OFFSET(D17,-15,-1,1,4)),"")))
where the condition is meant to only show a specific statistics based on the column you're in. The syntax OFFSET(<ref>,<rows>,<cols>,<height>,<width>) selects a range (<rows>,<cols>) from <ref> with a height of <height> and width <width>. So, for cell D17, OFFSET(D17,-15,-3,1,4) selects the 1x4 range with a top-left corner in C2.
You can use the same formula to obtain the column labels MAX, MEDIAN, AVG, ...