2015-03-23 3 views
1

В VBA (в проекте MS Access) я хочу определить оператор if, где часть инструкции хранится в переменной.В инструкции ifa VBA вставить часть инструкции через переменную

Для того, чтобы мой вопрос ясно, вот простой пример:

Sub Test_String_Insertion_Into_IfStatement() 

    Dim strInsert As String 

    strInsert = "10 > 5" ' Or any other stuff that would return "TRUE" 

    If "" & "'"strInsert"'" & "" Then 
     Debug.Print "Hurray, it works!" 
    Else 
     Debug.Print "Sorry, my friend. Try something else..." 
    End If 

End Sub 

Теперь проблема, это не работает. Трюк, я полагаю, нашел правильную комбинацию амперсандов, кавычек, апострофов и/или Хр (34).

Я провел много экспериментов, проверяя все варианты, которые я мог себе представить, но пока не нашел рабочей комбинации. Большинство из того, что я тестировал, возвращает ошибку «Ошибка несоответствия типа».

реального мира применение ...

Приведенный выше пример довольно упрощена. В моей реальной задаче я хочу вставить гораздо более длинную строку как часть if-statement. Вот один из моих реальных заявлений, которые в конечном итоге должны быть заменены на то, что использует переменную для вставки большей части выражения (это: все, кроме правильных «If» и «Then»):

If oRs.Fields(strTitField) Like "*" & arrWCs(r).varTERM1 & "*" Then 

Он использует поля набора записей и пользовательский тип переменной (массив).

Обратите внимание, что раздел if-утверждения, который я хочу вставить переменным образом , имеет собственные кавычки и амперсанды! (Действительный оператор if-do доказал свою эффективность, но теперь я хочу вставить его в мой if-оператор, используя переменную.)

Целью является использование переменной вставки, которую я мог бы очень быстро переключаться между несколькими . если-заявление, в зависимости от необходимости в функции общей)

Для удобства я добавить простой пример, который использует амперсанд и цитаты в если заявлении:

Sub Test_String_Insertion_Into_IfStatement_2() 

    Dim strIfClause As String 
    Dim strXYZ As String 

    strXYZ = "ouse" 
    strInsert = "'Mouse' Like '*' & strXYZ & '*'" ' Just a guess, doesn't work 

    If "" & """strInsert""" & "" Then 
     'The resulting if-statement should be: 
     'If "Mouse" Like "*" & strXYZ & "*" Then '(Taken as such, this works!) 
     Debug.Print "Good!" 
    Else 
     Debug.Print "Not good!" 
    End If 

End Sub 
+0

Используйте метод 'Application.Evaluate()'.Например, 'str =" 10> 5 "', переданный в 'Application.Evaluate (str)', вернет 'Boolean True'. –

ответ

0

Наконец я нашел следующее решение. Как было предложено экспертами, он использует метод Eval().

Dim strTest As String 
strTest = "'" & oRs.Fields(strTitField).value & "' Like '*" & arrudtWCs(r).varTERM1 & "*' And '" & oRs.Fields(strTitField).value & "' Like '*" & arrudtWCs(r).varTERM2 & "*' And '" & oRs.Fields(strTitField).value & "' Like '*" & arrudtWCs(r).varTERM3 & "*'" 

If Eval(strTest) Then 
'Do something 
End If 
  • OrS является набор записей, основанный на одной из таблиц в базе данных Access .
  • arrudtWCs (r) - это массив пользовательского типа с элементами varTERM1, varTERM2, varTERM3 и т. Д.
  • strTitField - строковая переменная, содержащая имя используемого поля таблицы. Переменная не должна быть объявлена ​​здесь, поскольку она является частью параметров процедуры при вызове процедуры.

Eval (strTest) оценивает (серию) Условие (ы), определенную в strTest-строке, т.е. конкретно он сравнивает значения из arrudtWCs-массива со значениями поля в активной строке записей, и если условие окажется удовлетворительным, будут предприняты некоторые дополнительные действия.

Основная проблема заключалась в поиске правильного использования апострофов, котировок и амперсандов.

Смежные вопросы