2013-03-13 3 views
2

Я столкнулся с очень странным сценарием. В функции я получаю строку условия для оценки.VBA - Оценить условия как строки

Э.Г.

(a>b and (b=2 or c!=3)) 

где а, Ь и с являются мои имена переменных.

Я пробовал и много искал, но не получил ничего значимого.

Так что мой вопрос: возможно ли оценить такую ​​строку? Если да, пожалуйста, предоставьте мне некоторый намек на это.

+0

что вы будете оценивать? – DevelopmentIsMyPassion

+0

@AshReva "(a> b и (b = 2 или c! = 3))" может быть одной из таких строк – Tejas

+0

Не мой вопрос был тем, что вы хотите делать, когда получаете такие строки? вы хотите сравнить или что? – DevelopmentIsMyPassion

ответ

2

Альтернативный способ, добавить ссылку на Microsoft Script Control

Dim vx As MSScriptControl.ScriptControl 
Set vx = New MSScriptControl.ScriptControl 

a = 100 
b = 200 
c = 300 
Cond = "(a>b and (b=2 or c<>3))" 

With vx 
    .Language = "VBScript" 
    .AddCode "function stub(a,b,c): stub=" & Cond & ": end function" 

    result = .Run("stub", a, b, c) 
End With 

MsgBox result 

Примечание вам нужно будет заменить = с <> как первый недействителен в VB * (и и/или нет t valid in jScript)

+0

Спасибо за этот отличный код. Можете ли вы мне помочь при оценке Cond = "(InStr (t, 2,1) =" "2" ")" Я много пробовал, но он дает ошибку – Tejas

+0

Что должен делать 'instr()'? Если 't' предназначен для строки, он не будет работать.Поскольку он стоит, он ищет «* 1 * in * 2 *» (рассматривая их как строки), начиная с позиции * integer * 't'. Если строка 'instr', которую вы получаете, не соответствует точно эквиваленту VBScript по своему поведению, ни один из этих подходов не будет работать. –

1

Вот правильный ответ на ваш вопрос, а не только комментарий.

Вам нужно:

  • Установить ссылку на Microsoft Visual Basic for Applications Extensibility x.x (Tools/References) в VBIDE.
  • Доверьте доступ к объектной модели проекта VBA (используйте Google, чтобы узнать, как это сделать для вашей версии Excel).
  • Run initValues() затем вызвать getConstantValue("(a>b and (b=2 or c<>3))")

Код:

Option Explicit 

Dim a As Long 
Dim b As Long 
Dim c As Long 

Sub initValues() 
    a = 3 
    b = 2 
    c = 4 
End Sub 

Function getConstantValue(constStr As String) As Variant 

    Dim oMod As VBIDE.CodeModule 
    Dim i As Long, _ 
     num As Long 

    Set oMod = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule 

    For i = 1 To oMod.CountOfLines 
     If oMod.Lines(i, 1) = "Function tempGetConstValue() As Variant" Then 
      num = i + 1 
      Exit For 
     End If 
    Next i 

    oMod.InsertLines num, "tempGetConstValue = " & constStr 

    getConstantValue = Application.Run("tempGetConstValue") 

    oMod.DeleteLines num 

End Function 

Function tempGetConstValue() As Variant 
End Function