Question

I'm trying to find a way to from a Cell get the data from a cell in the Sheet that lies to the Left (down in the tray) of the current Sheet.

I know how to call to other sheets via

=Sheet1!A1

But now I need something best explained with

=Sheet[-1]!A1

Any ideas?

Was it helpful?

Solution

Using the tab order as a fundamental part of your calculations is a complicated and risky approach to Excel calculations. Excel offers many alternatives which you'd be better off using:

  1. A simplified version of belisarius's suggestion is: =INDIRECT(A1 & "!A2") where cell A1 has the name of your datasource sheet and A2 has the name of your target cell in your datasource sheet. If you know the name of your sheet of interest (or can look it up in some way), use this method.

  2. If you need to do this often, you might want to export the data into an actual database (i.e. MS Access). Then you can make standard SQL queries and import the results into your Excel file.

  3. If you absolutely want to go the VBA route, then you'd have to write some code that:
    3a. Grabs all the names of the active workbook and stores them in an array.
    3b. Identifies the index number of the currently active workbook in that array. Subtract 1 from that index to get the sheet to the left.
    3c. Gets the cell value from that sheet.

  4. You can also get freaky with Named Ranges. In Excel 2003, go to Insert->Name->Define, add a new Named Range and you can use that name in your calculations instead of referring to the cell by row and column.

Edit

The whole Idea with this one, is that you have the Sheets arranged, and are able to move them around, and that shall change the calculations. – Gnutt 1 hour ago

Please, please, don't do that. For starters, this isn't a standard method of interaction with a spreadsheet. Your end-users will likely be confused and may not even ask for clarification.

You'll want to explore the idea of data validation:

  1. Using Data->Validation, make a drop-down menu listing all the sheets in the workbook (if the names of all the sheets are static, you can just hardcode them, otherwise, you'll need some VBA to pull them).
  2. Then the user just picks the sheet of their choice and indirect() will automatically update everything.

Alternatively, you can also check out Tools->Scenarios. I don't know anybody who uses this feature, but you might be a good candidate for it. Basically, it lets you see the results of calculations using different datasets (i.e. "scenarios") so the user can go back and forth between them.

Using either of the 2 methods above, there's a good chance you can avoid VBA entirely, thus saving users that annoying warning message when they open your file.

OTHER TIPS

=INDIRECT("Sheet"&TEXT(VALUE(MID(CELL("filename",A8),FIND("]",CELL("filename",A8))+1,256))-1,"#")&"!A1")  

Caveats:

  1. Your workbook must be saved previously
  2. A8 may be replaced by a reference to ANY non-error cell

I know it's not seen here as good practice, but I want to do something similar. And it does replicate database functionality to an extent but I don't have the time or support to build one from scratch when there's something already half in place.

The reason I want to be able to do this is to create a summary table that links to all the worksheets in the workbook, and automatically extends if you insert a new worksheet. This is to manage a large sales / reporting spreadsheet with lots of different business units that all have the same structure (ie use the same worksheet format to report the same outcomes for different people. There is a high turnover. I want to have several summary sheets reporting different aspects of the source sheets. This is very time consuming to manage if recreating all of the tables each time.

You should be able to use the row() as an index marker to define the information that you want using something like REPLACE, OFFSET or INDEX but you can't as they only refer to 2D arrays.

Whereas Excel treats 3-D references as arrays for statistical functions it does not seem to do the same for reference functions. You might have SUM(sheetX:sheetY!A1) and be able to add a sheet in between, there is not (eg) a INDEX(sheetX:sheetY!A1,n) function. I've tried experimenting using these 2D functions as part of array formulas, and defining the 3D reference as an array or a named range... well it was worth a go :).

So I believe it's a valid action. I also believe there must be a way to do it, but for now I'm falling back on a UDF that has the risk of errors caused by calculation issues, or manipulating a Workbook_SheetChange function or similar. Or creating a single master sheet to control all the others which is populated by using a subroutine based on an array of all workbooks.

these functions work well for me. They get the worksheet index (the parent of the range you call them with), add or subtract from that index, and then create a range from that (relative) sheet and the address passed in.

Function relativeSheet(r As Range, iRelative As Integer)
   Application.Volatile
   relativeSheet = Sheets(r.Cells(1, 1).Parent.Index + iRelative).Range(r.Address)
End Function

Function prevSheet(r As Range)
    prevSheet = relativeSheet(r, -1)
End Function

Function nextSheet(r As Range)
    nextSheet = relativeSheet(r, 1)
End Function
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top