For example, let's say we have a cell A1 with =SEARCH("h", "hello"), which would obviously return 1. Suppose we make another cell B1 with =INDEX(C1:D100, 1, A1).
Would the formula in B1 reevaluate the formula in A1? In other words, would the formula in B1 evaluate as =INDEX(C1:D100, 1, 1) or =INDEX(C1:D100, 1, SEARCH("h", "hello"))?
This may seem like a trivial question, but the examples are an extreme simplification; in my workbook, I'm searching for text across an entire sheet, whose results I use to feed a few thousand INDEX formulas in another sheet. And I'm worried about performance issues if every single cell is going to reevaluate the searches for itself.
Excel is optimised to recalculate only when required.
See Charles Williams' article about Excel's smart recalculation for details.
In short, a formula is only recalculated if any of its precedents change. Let's change your example in cell A1 to =countif(B:B,A2).
The index function takes the output of A1 without re-running the countif. But, if a value in column B changes, or if the value in A2 changes, the countif will recalculate and after that the Index will recalculate.
Related
I am creating a report document which will automatically calculate the total marks earned by a student in a classroom. The values to be multiplied are in cell B22 and E22 of Sheet1, Sheet2, Sheet3 and to display the result in Sheet4. Sheet1, Sheet2 and Sheet 3 have the same formatting and design. What is the method or Formula that can be used to multiply;
B22*E22 in Sheet1 which will display the result in sheet4,
and when i use the auto fill handle on the cell containing the result in sheet4, excel should follow that pattern to multiply the same cells across the various sheets automatically;
let's say
B22*E22 in Sheet2
B22*E22 in Sheet3
and so on...
I have tried calculating it manually;
Let's say on Sheet4 in Cell A1, i used
='Sheet1'!B22*'Sheet1'!E22
in Cell A2, ='Sheet2'!B22*'Sheet2'!E22
in Cell A3, ='Sheet3'!B22*'Sheet3'!E22
and it worked. But the problem here is that, this work is purely manual and time consuming since i have a lot of sheets (about 62 sheets) and a lot of other cell calculations to make similar to that above (in other workbooks).
When i input the formula ='Sheet1'!B22*'Sheet1'!E22 in cell A1,
i tried using the auto fill handle to drag and fill the cells A2 and A3.
But it didn't work as excel keeps changing the cell references.
This is the formula i used which works on Sheet4
in A1 ='Sheet1'!B22*'Sheet1'!E22
When i use the auto fill handle, to fill the formula and have the values in
A2, this is what it gives ='Sheet1'!B23*'Sheet1'!E23
A3, this gives ='Sheet1'!B24*'Sheet1'!E24
I want a formula or method through which when i use the field handle, excel should Maintain the Cells reference for calculation (Multiplication), that is,
B22 and E22
and rather change the sheets instead. That is,
On Sheet4, in cell A1: ='Sheet1'!B22*'Sheet1'!E22
A2: ='Sheet2'!B22*'Sheet2'!E22
A3: ='Sheet3'!B22*'Sheet3'!E22.
The formulae above is the result i expect to have.
But the actual output is
On Sheet4, in cell
A1: ='Sheet1'!B22*'Sheet1'!E22
A2: ='Sheet1'!B23*'Sheet1'!E23
A3: ='Sheet1'!B24*'Sheet1'!E24.
Any help/clue will be highly appreciated!
Thanks in advance.!
=INDIRECT("'Sheet"&ROW(A1)&"'!B22")*INDIRECT("'Sheet"&ROW(A1)&"'!E22")
Place the above formula in an empty cell then copy down.
The INDIRECT function converts text with references to an excel reference. Something to be aware of though is that INDIRECT is a volatile function. This is not the end of the world. A volatile function simply means it recalculates anytime anything in the workbook changes. A regular function will only recalculate when something that affects it changes. In other words, if you have a workbook full of volatile functions you may notice some performance issues with the workbook due to all the calculation happening anytime a cell was changed
Update
Apparently I should listen to my own write up. INDIRECT converts references. Apparently it will not work with the math operator. So use indirect for each reference and keep your math operators out of the indirect.
The above image shows a copy and paste of the above formula. IF the sheet does not exist it will toss an error as it does not have an address to find.
So lots of options shown working, B22 left blank to prove calculation works.
Used multiply instead of add as that was what you had, also changed "" to 0 to get the correct functionality.
I have a table that somewhat looks like this:
I am trying to spread the values on column B using an IF-AND function so that it would pull the values from column A until it reaches a new value in the column.
I have tried =IF(AND(A2="",A3="",A1<>""),A1,A2) for cell A2, but while the function recognizes the beginning of a new value, it ends up in 0s all in between.
How should I adjust the function to be able to fill the cells with corresponding values? I appreciate the help.
If you're willing to enter a value in B1 by hand, starting in B2 you can use:
=IF(A2="",B1,A2)
If not, and if you don't mind using a volatile* formula, starting in B1 you can use:
=IF(A1="",OFFSET(A1,-1,1),A1)
*Note: a volatile formula is one which causes an entire workbook to recalculate whenever any change is made. This can significantly slow down a workbook.
The adjusted formula is =IF(A2="",B1,A2). It basically pulls the value from above if the cell to the left is empty, and if it isn't empty, it pulls the value from the cell to the left.
The corrected formula
The title pretty much says it. I need to transfer certain cells from one cell to another without the coordinates of the cells changing after an insert operation.
In ex., I want the value of cell B3 of Sheet1 to transfer to cell A2 of Sheet2. If I insert a column on the left of B3, the previous B3 will become C3 and you now have a new B3 in which you can add a new value. I want my A2 to still receive the value of B3, but the new B3, not the old B3 with is now C3.
If I go with +Sheet1!B3, after the insertion of the column it will become +Sheet1!C3. I want it to remain to +Sheet1!B3.
I tried with $, +Sheet1!$B$3, but it still changes.
You can use the indirect function in excel.
+INDIRECT("Sheet1!B3")
With the caveat that you never change the location of column A you could do the following:
=INDEX(Sheet1!$A:$$ZZ,ROW(B3),2)
Caveat: as set up will only work for cells between and including columns A and ZZ. the ZZ reference will increase as columns get added. If you have columns outside of ZZ initially, then you will have to adjust the final column reference to suit your needs.
INDEX gave me some errors in the function (probably on my end), but I managed to solve it using INDIRECT.
Ty for the feedback, #AlexCollins #ForwardEd
I am working on a personal budget sheet in excel, and it's formatted based on my pay dates, to provide more drilled-down information. I have attached an example of it below for reference.
I would like to put a formula into J2, J3, and J4 which will take the data in cells C9:C26 and H9:H16, match it to the date in cells D2:D4, then subtract the expenses in D9:D26 and I9:I16 from E2, E3, and E4.
As you can see, I have just individually summed the cells; however, I would like a formula to be able to adjust as I change the value in cells C9:C26 and H9:H16.
I have found that I can do it with ONE cell, but not multiple or a range. This is the formula I used, and I cannot find a way to make it apply to the entire range of cells: =IF(C14=D3,E3-D14)
I've also tried: =IF(C9:C25=D3,E3-D9:D25) -- I know this formula doesn't work and why. I cannot figure out how to get column C to correspond with column D.
The Budget Sheet
You just need to use SumIf().
In cell J2, put this formula: =SumIf($C$9:$C$25,$I2,$D$9:$D$25)+SumIf($H$9:$H$25,$I2,$I$9:$I$25) and drag down the three cells.
With that, you can add E2-[formula] to subtract all that from E2. Or of course, just do e2-J2 instead. I think that should do what you're looking for. If it's not quite it, let me know and I can tweak.
If you plan to have more than 1 criteria go with SUMIFS
Yes, with S
I am attempting to use an IF statement to check whether the sum of two cells from another Excel sheet is greater than or equal to 1.
For a sheet called Test1 with the values of interest in column C, this is what I have so far, which works fine:
=IF((Test1!C1+Test1!C2>=1),1,0)
In column B on a second sheet that I'll call Test2, I want to copy this formula down 200,000 rows. However, if the aforementioned formula is in cell B1, for the formula in B2 I would like the formula to read:
=IF((Test1!C3+Test1!C4>=1),1,0)
I want to copy the formula down the column so that the second cell reference in the formula in the first row does not become the first cell reference in the formula in the second row (eg. it would go C1+C2, then C3+C4, C5+C6, etc.).
I have tried manually entering the formula for a few rows, highlighting those, and copying them down but can't get the desired cell reference pattern. If I highlight and drag these first three formulae down another three rows, C4 and C5 are repeated and not in the correct pair.
=IF((Test1!C1+Test1!C2>=1),1,0)
=IF((Test1!C3+Test1!C4>=1),1,0)
=IF((Test1!C5+Test1!C6>=1),1,0)
=IF((Test1!C4+Test1!C5>=1),1,0)
=IF((Test1!C6+Test1!C7>=1),1,0)
=IF((Test1!C8+Test1!C9>=1),1,0)
I have tried using OFFSET() within this formula but couldn't get it to work. I am basically just wanting to add 1 to each of the cell references in the formula, as compared to the previous row (but not to actually add 1 to the value of that cell, as would happen with C1+1 for example).
Any insight would be greatly appreciated!
If you plan on copying this down 200K rows then you will want the absolute simplest formula that accomplishes the stagger. Avoid the volatile OFFSET function or be prepared to spend a lot of time waiting for random calculation cycles to complete. A volatile function will recalculate whenever anything in the workbook changes; not just when something changes that involved the formula in the cell.
=--(SUM(INDEX(Test1!C:C, (ROW(1:1)-1)*2+1), INDEX(Test1!C:C, (ROW(1:1)-1)*2+2))>=1)
The following formula should do the trick:
=(SUM(INDIRECT("C"&ROW()*2-1);INDIRECT("C"&ROW()*2))>=1)*1
And that's the version using IF:
=IF(SUM(INDIRECT("C"&ZEILE()*2-1);INDIRECT("C"&ROW()*2))>=1;1;0)
You say I am basically just wanting to add '1' to each of the cell references in the formula but appear to be incrementing by 2, so I am confused but an option might be to apply you existing formula to 400,000 rows, together with =ISODD(ROW()) in another column, then filter on that other column to select and delete those showing FALSE.
Excel's autofill won't do the 2-cell shift that you're looking for. You can use the functionality that is there.
Put =IF((Test1!C1+Test1!C2>=1),1,0) in the top cell and drag a copy to the second row (it will be =IF((Test1!C2+Test1!C3>=1),1,0) but that's okay). Now, put 'A' and 'B' in the next column. Select all 4 cells and copy them down 400k rows.
Use filter to delete rows flagged with 'B' and delete the blank rows.
(Select blank rows with [F5] click Special and select Blanks, then right-click and delete)
Here is all you need. It's fast and nonvolatile.
=--(SUM(INDEX(Test1!C:C,ROW(1:1)*2-2):INDEX(Test1!C:C,ROW(2:2)*2-2))>=1)
Copy it down as far as you like.