In my previous question, How do I assign a value to a property where the property name is supplied at runtime in VBA?, I learned to use CallByName to set a property in a class at run time.
This time, however, I’m trying to figure out how to get an object at run time from a string.
For example, let’s say I have a string with the following data:
Here’s what I might try to do where the data above is the input for
Function GetObject(strParam As String) As Object GetObject = SomeFunction(strParam) End Function
In this case, GetObject should return a QueryTable when evaluated against
Worksheets("RAW DATA").Range("A1").QueryTable. Is there anything in VBA that could take the place of
SomeFunction from the example above?
This time you’re out of luck. There is no VBA equivalent of
eval (not in Excel anyway…there is in Access VBA).
(Application.Evaluate() evaluates strings as Excel expressions, not as VBA code.)
Active Scripting Engine can help you. Instantiate
ScriptControl ActiveX, use
.AddObject() method to add reference to Excel’s
Application object to the script control’s execution environment, set the third parameter to
True to make all
Application‘s members accessible too. Then just use
.Eval() method to evaluate any property or method, which is the
Application‘s member. The example below shows evaluation of
Sub TestQueryTable() Dim objQueryTable As QueryTable Dim strEvalContent As String strEvalContent = "Worksheets(""RAW DATA"").Range(""A1"").QueryTable" Set objQueryTable = EvalObject(strEvalContent) objQueryTable.Refresh MsgBox objQueryTable.Connection End Sub Function EvalObject(strEvalContent As String) As Object With CreateObject("ScriptControl") .Language = "VBScript" .AddObject "app", Application, True Set EvalObject = .Eval(strEvalContent) End With End Function
If you are on 64-bit Office, this answer may help you to get
ScriptControl to work.
There’s the “Evaluate” method (or [ ] brackets). I don’t think it will do exactly what you expect – as in run VBA code found in a string. You can look it up in the VBA help menu.