Как я могу оценить строку в объект в VBA? - PullRequest
3 голосов
/ 17 ноября 2009

В моем предыдущем вопросе Как назначить значение свойству, в котором имя свойства указывается во время выполнения в VBA? , я научился использовать CallByName для установки свойства в классе во время выполнения .

Однако на этот раз я пытаюсь выяснить, как получить объект во время выполнения из строки.

Например, допустим, у меня есть строка со следующими данными: Worksheets("RAW DATA").Range("A1").QueryTable.

Вот что я мог бы попытаться сделать, если данные выше являются входными данными для strParam ниже:

Function GetObject(strParam As String) As Object
    GetObject = SomeFunction(strParam)
End Function

В этом случае GetObject должен возвращать QueryTable при оценке по Worksheets("RAW DATA").Range("A1").QueryTable. Есть ли в VBA что-нибудь, что могло бы занять место SomeFunction из приведенного выше примера?

Ответы [ 3 ]

3 голосов
/ 03 ноября 2015

Active Scripting Engine может помочь вам. Создайте экземпляр ScriptControl ActiveX, используйте метод .AddObject() для добавления ссылки на объект Application в Excel в среду выполнения элемента управления сценарием, установите третий параметр на True, чтобы сделать доступными также все элементы Application. Затем просто используйте метод .Eval() для оценки любого свойства или метода, который является членом Application. Пример ниже показывает оценку свойства Worksheets():

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

Если вы работаете в 64-разрядной версии Office, этот ответ может помочь вам заставить ScriptControl работать.

1 голос
/ 17 ноября 2009

На этот раз тебе не повезло. Нет эквивалента VBA eval (в любом случае, не в Excel ... есть в Access VBA).

(Application.Evaluate () оценивает строки как выражения Excel, а не как код VBA.)

0 голосов
/ 17 ноября 2009

Есть метод «Evaluate» (или [] скобки). Я не думаю, что он будет делать именно то, что вы ожидаете - как при запуске кода VBA, найденного в строке Вы можете посмотреть его в справочном меню VBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...