I have vlookups to pull specific data from a workbook and paste into a new workbook in the desired layout. The layout of the first workbook never changes however the name will change when i want to run this on a different file.
My current formula is =VLOOKUP(A3,[Workbook1.xlsx]Sheet1!$B$3:$XFD$7,2,FALSE)
I would really like it to reference A1 instead of Workbook1 so I could then just update the file name in A1 every time I want to analyse a different file. I should mention the Sheet name won't ever change.
I know you have to use INDIRECT but im unsure how it works. I did try =VLOOKUP(A3,INDIRECT(A1),$B$3:$XFD$7,2,FALSE) but then i'd too many arguments and when i removed the $B$3:$XFD$7 i lost the range i was searching in.
Thanks!
With INDIRECT you must create the whole string that denotes the range reference:
=VLOOKUP(A3,INDIRECT("'[" & A1 & "]Sheet1'!$B$3:$XFD$7"),2,FALSE)
One more note, that INDIRECT requires that the workbook be open to function, or will return an error.
Related
I'm trying to create a dynamic reference within a formula; meaning the referenced workbook and subsequent sheet name can be changed and the appropriate data loaded.
I'm aware that a static formula reference could be done as follows:
=SUM('C:\Reports\[SOTDJ17.xlsx]Summary'!C10:C25)
but I want to be able to change the workbook name, and it will reference information from that particular workbook and change the data. The workbook name
is stored in B5 and the sheet is stored in B8. I thought I might be able to use
something simple like:
=SUM('C:\Reports\[B5]B8'!C10:C25)
but it doesn't seem to work. Is there a syntax error or something else I am missing?
(I should note that I am trying to reference a closed workbook)
You'll want to use Indirect():
=SUM(INDIRECT("["&B5&"]"&B8&"!$C$10:$C$25"))
Note that the workbook you're referring to must be open.
Before I jump into a VBA solution, I wanted to know if it was possible to update a filename of a closed workbook I am referencing.
The formula reads,
=SUMIF('L:path\[filename - "&TEXT(WORKDAY(TODAY(),-1),"yyyymmdd")&".xlsx]Sheet'!$BF:$BF,"criteria",'L:path\[filename - "&TEXT(WORKDAY(TODAY(),-1),"yyyymmdd")&".xlsx]Sheet'!$DX:$DX)
To clarify, the path the filename would look something like this, This is the filename - yyyymmdd.xlsb
Someone at work said it's not possible to change the filename because it's a string. If that is the case could someone just expand on that a bit?
You can't really. If you have "Book1.xls" and "Book2.xls", what you can do it put this formula in book1:
=MID(CELL("filename",A1),FIND("[",CELL("filename",A1))+1,FIND("]", CELL("filename",A1))-FIND("[",CELL("filename",A1))-1)
This will return the name (only) of Book1. You could then reference that cell from Book2. HOwever, if you change Book1's name to something else, the reference will be broken and you will have to manually change the reference (pick the file from the update link manager). It seems excel uses absolute paths, including filename, to reference other workbook. You would need to have a way to store a flexible reference to that workbook into Book2. But the only way to do is VBA.
Interestingly however you can do that:
Create a reference in book2 pointing to a cell in book1. You get the value of that cell in book2.
Close everything.
Open only book1, edit the referenced cell. Close & save book1.
Book2, when you open it, will ask you if you want to update the link, and you can see the updated value even if book1 is still closed.
The other idea that I had was to use INDIRECT, like what is done there: using indirect function in Excel
But it won't work for closed workbook and that's one of your requirements.
So VBA it is.
I would like to set up Names for the drive, file path, Excel spreadsheet name and sheet name in cells in Excel, and then concatenate them together when referencing external cells. This will allow me to create macros that reference sheets dynamically in the sense that it does not matter where the spreadsheet is.
So far, I have the following:
Drive = C
Location = Users\ashleys\Desktop\New Quote Production\Quote Location 3\Ash
Name = Book3
Sheet = Sheet1
(Please note that the = sign above can be read as "assigned Name as")
I concatenate these together to create another Name (called Final) in the following fashion:
Final = "'"&Drive&":\"&Location&"["&Name&".xlsx]"&Sheet&"'!"
Final resolves to be the following:
C:\Users\ashleys\Desktop\New Quote Production\Quote Location 3\Ash\[Book3.xlsx]Sheet1'!
So, as far as I am concerned, so far so good!
However, I am embarrassingly stumbling at the last hurdle. when I use the Final defined Name in cell references, it does not resolve in the way I expect. So, if I am in Book1 and I use the code above to refer to cell A3 (which for example contains the word "Success!") in Book3, I would hope that typing the following into a cell in Book1 would resolve to "Success!":
=Full&A3
Instead, the A3 resolves to A3 in Book1.
You'd need to use INDIRECT for that to work, but the other workbook would have to be open.
http://www.cpearson.com/excel/indirect.htm
As the workbook has to be open for it to work there's no need to add the file location to the string. It may be useful in some VBA code used in the Workbook open event to automatically open the other workbook though, or look at Excel workspaces to open the other files.
http://www.ozgrid.com/Excel/save-as-workspace.htm
i.e. =INDIRECT("'[Book3.xlsx]Sheet1'!$A$1") or =INDIRECT(Final) if Final is a named value.
I have two workbooks:
WorkbookToUpdate.xls
Workbook_for_20130901.xls
In the first workbook I have the following:
A1 ='[Workbook_for_20130901]Sheet1'!$C5
Now a month goes by and I want to update the first work to reference Workbook_for_20131001.xls without going cell by cell and changing the name of the workbook. My thought was to make the date portion of the workbook name a variable and simply change that variable, but that doesn't seem to be working.
EDIT: I don't want to use Excel's INDIRECT function because I don't want to open the reference workbook.
I found one solution to be Harlan Grove’s PULL function (code can be found here), which works similarly to the INDIRECT function except that it doesn't require the source workbook to be open. The other solution, which actually works out to be faster than the Pull function (its only downfall) is the one I was using originally - Good ol' "find & replace". I thought that that was slow, but after trying the Pull function, it's not too bad.
Another option is by changing the source through excel's Data links, but this doesn't allow you to choose which cells keep the old source and which cells use the new one (in my case, I need the old values as well).
I have 3 workbooks - Parent1.xlsx and Child.xlsx
Parent1.xlsx has data that will be referenced by Child.xlsx through vlookup.
The vlookup formula is
=VLOOKUP(1,[Parent1.xlsx]Sheet1!$A$1:$B$7,2,FALSE)
That works fine.
Now I have to make a copy of Parent1.xlsx to Parent2.xlsx.
In order for Child.xlsx to work I have to change the formula to
=VLOOKUP(1,[Parent2.xlsx]Sheet1!$A$1:$B$7,2,FALSE)
That is ok if its just for 1 cell, but I need to do it for many cells.
To fix this, I plan to used a named range for the file name. So in Sheet2 of Child.xlsx, I have a named range "parent" that has the name of the file - Parent2.xlsx.
I can't seem to get that to work.
If the value for the named range "parent" is
'[Parent2.xlsx]Sheet1'
then I'm trying to get
=VLOOKUP(1,parent!$A$1:$B$7,2,FALSE)
to work.
Is this even possible? Other than copy pasted everything and using VBA, is there another possibility?
Thanks
If you just need to change all the external references to the file Parent2, rather than Parent1, choose the Data tab, Edit Links and click Change Source.
Try:
"=VLOOKUP(1," & ActiveWorkbook.Names("parent").Value & "!$A$1:$B$7,2,FALSE)"
Edit: just realized this is the VBA solution. This won't work in a cell formula.