I need to use Goalseek in my VBA code, but rather than seeking a goal for a target "CELL" in my spreadsheet, I need to seek a goal for a "VARIABLE" within my VBA code.
e.g.
Rather than setting some target CELL to "A3", I need to set a target VARIABLE declared in my VBA code.
Same applies, of course, to the "By changing" field.
Is that even possible?
Use a cell location that is off-screen to do the calculation, then once the process is finished, load the cell value into your variable, e.g.:
...GoalSeek ... ChangingCell:=Worksheets("Sheet1").Cells("A5000")
MyVar = Worksheets("Sheet1").Cells("A5000").Value
Related
How do I utilize named cell references in Excel that aren't absolute. I want to be able to take a formula and be able to drag it across excel and have one name cell reference update to a different named cell as I move across.
For example: I want to keep RevenuePerStay going across the formulas row and have excel updated the cell reference to the number of people staying. So
400 should be RevenuePerStay * Stay400
600 should be `RevenuePerStay * Stay600`
I tried using mixed cell reference and relative cell references using the dollar sign but excel will not accept this.
Assuming your stays are in row 5:
For this worksheet, click on cell C7 and go to create a new named range called Stays and for the formula write =C$5$ and exit the name manager.
Now change your formula in C7 to being RevenuePerStay*Stays and drag it across. This will get the right amount of stays you want each time.
In explicit answer to your question: no you would never get the name in the formula to change unless you put all scenarios in the formula using multiple if statements.
If I understand your question correctly, this method seems convoluted because you can use =RevenuePerStay*C5 and drag over the row, and it should give the answer you want.
If you really want to take the advantage of named range and make it change dynamically, you will need to incorporate with INDIRECT like this:
=RevenuePerStay*INDIRECT("Stay"&C5)
But this is assuming you have all the named ranges defined properly such as Stay200, Stay400, Stay600, Stay800, Stay1000 like below. Otherwise it will not work.
I would like to know if it is possible to change the file path of a link in excel, using text in another cell. The trick here is that the source workbook is not open at the same time as the one that has the link in it, and is not located in the same folder.
ie: if once cell has a link like:
='C:\thanks\forthehelp\01\[eg.xlsx]worksheet'!A1
and I want to change the file based on text input from a cell, ie: cell A1 has some text: "02"
='C:\thanks\forthehelp\&A1&\[eg.xlsx]worksheet'!A1
to get
='C:\thanks\forthehelp\02\[eg.xlsx]worksheet'!A1
I know the above example doesn't work, but i think it illustrates what i want to do here. Any help would be really appreciated. I hope this makes sense.
Thanks.
You could use the INDIRECT function to implement a constucted string to the destination workbook but INDIRECT does not work on closed workbooks.
A VBA routine could replace the formula in the cell.
Range("A1").Formula = Replace(Range("A1").Formula, "\01\", "\02\")
If you opt for this sort of formula replacement, you should check to ensure that the external workbook exists in the new location with something akin to the Dir function. Using the Range.SpecialCells method with the xlCellTypeFormulas property would speed up going through the cells as opposed to looping through all of the cells and determining if the Range.HasFormula property is true.
I have this formula that looks at various criteria across multiple columns and checks to see that if all the all the criteria match, it will paste data from one column to another. I've tried a couple ways to get it into VBA, but I can't seem to get anything to work. Thanks!
=INDEX($D$2:$D$1112,MATCH(1,($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3),0))
You are not going to be able to use that array formula to directly return a value to a cell. VBA does not process an array formula the way that the worksheet can. The best method is to use the worksheet's processing or one of the Application Evaluate methods.
Your lack of a worksheet to reference troubles me. When a formula is in a worksheet cell, it knows what worksheet it is on. When using formulas within VBA, the parent worksheet is a 'best guess' without explicit worksheet referencing.
Here are three methods to put the results from that array formula into Z2:Z4 on the active worksheet. Remember that these cell references should be modified to include the worksheet name.
With ActiveSheet
'this simply puts the formula into the worksheet then reverts the cell from the formula to the returned formula value
.Range("Z2").FormulaArray = "=INDEX($D$2:$D$1112, MATCH(1, ($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3), 0))"
.Range("Z2") = .Range("Z2").Value
'this uses the 'square bracket' method of evaluating a formula on-the-fly
'the formula being evaluated can be array or non-array
'this method is does not like building a formula string from pieces of text
.Range("Z3") = [INDEX($D$2:$D$1112, MATCH(1, ($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3), 0))]
'similar to the method directly above, Application.Evaluate does just that.
'the formula being evaluated can be array or non-array
'this method is easier to build a formula string from pieces of text
.Range("Z4") = Application.Evaluate("INDEX($D$2:$D$1112, MATCH(1, ($A$2:$A$1112=$U$7)*($C$2:$C$1112=$W$7)*($B$2:$B$1112=F3), 0))")
End With
You need 2 changes:
(1) To use a function in VBA when it is available in native Excel, you need to preface each function with Application.WorksheetFunction. ie:
x = Application.WorksheetFunction.Sum(y,z)
(2) To reference a cell within a sheet, in VBA, you need to access it specifically, in one of a few ways. The simplest for our purposes is the RANGE property, as follows:
x = Application.WorksheetFunction.Sum(Range("A1:A2"))
So to put those two changes together, your formula would look like this:
=Application.WorksheetFunction.INDEX(Range("$D$2:$D$1112",Application.WorksheetFunction.MATCH(1,(RANGE("$A$2:$A$1112"=RANGE("$U$7")*(Range("$C$2:$C$1112"=Range("$W$7")*(Range("$B$2:$B$1112"=Range("F3"),0))
Although I see now having gone through this that you seem to be using an Array Formula - not sure if any special jigging is required to get that to work.
I'm building a macro in Excelto run rules against a set of data and output whether each row passes or fails the rules. I want to be able to add, remove, or alter the rules without altering the macro. As such I have a DATA worksheet and a RULES worksheet and the macro generates the OUTPUT worksheet and then populates it.
RULES is set up so that each different rule is enumerated on a different row. For this to work I need to be able to enter the actual VBA code relevant to the rule in on RULES, then I need to have the macro look at that column on RULES and execute the code in the cell.
Simplified example of my setup-
DATA has : ID, Dividend1, Dividend2, Divisor. There are n rows on DATA.
An example of a row on DATA might be ID="123", Dividend1=5, Dividend2=7, Divisor=35.
RULES has : Name, Formula, Threshold. For simplicity's sake there is only .
Let's set the as Name="Example", Formula=[see below], Threshold="0.15" (Threshold is used for conditional formatting in the macro, in this example it is unused.)
I'm going to use pseudocode for Formula just to eliminate the need to explain some of the irrelevant particulars of my macro so far. RULES.Formula should contain a line of VBA code that carries out-
If CurrentDATARow.Dividend1 = Empty Then
CurrentDATARow.Dividend2 / CurrentDATARow.Divisor
Else
CurrentDATARow.Dividend1 / CurrentDATARow.Divisor
End If
So, all of this explanation just to give context to this question: What can I do in the VBA of the macro to make it read the contents of RULES.Formula and make it execute that code inline with the rest of the macro?
If you have (say)
IF({dividend1}="",{dividend2}/{divisor},{dividend1}/{divisor})
stored in a "rule" cell (note do not include the "="), you can use Replace() to replace the placeholders with the relevant cell addresses for each cell in the row you're checking.
Then use something like
Dim val
val=Sheet1.Evaluate(yourformulastring) 'evaluate vs. specific worksheet
If Not IsError(val) Then
'check against thresholds etc
End If
If the evaluation results in an error you can test with IsError(val) as shown, otherwise it will return the result of the formula, which you can test against your "threshold" value cell. If you set background colors on your threshold cells you can color each row according to which threshold was exceeded.
NOTE without a worksheet qualifier, Evaluate will calculate the formula based on the ActiveSheet, so make sure the right sheet is active when this runs if you don't use the qualifier.
you could store your Tests/Rules as Excel worksheet formulas in Named ranges. Then you just call them from the cells.
see Ozgrid: Named Formulas
If you give us some example data and the type of calculations or rules I can give you a couple of examples.
I have a macro to write, quite simple.
It just pulls numeric values from a Database and pops them into certain cells.
Problem is, I want the layout and design of the worksheet to be able to be changed without a care of the underlying macro. So obviously the cell references will change, for the cells that I need to populate with data.
Is there a way to mark a cell - say with "VALUE1" - in the background, and then reference that cell by using "VALUE1" - without needing to know its exact Cell position? So that its value can be updated - wherever it is on the Work Sheet?
Is there a TAG property or something that could be used? Although a function would have to be written to search through all the TAGs of every cell, but that is OK.
Any ideas?
I think this could be a bonus for any Macro developer :)
Office Documentation: Define and use names in formulas.