Excel VBA вычислить строку из ячейки как формулу с переменной

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

у меня есть строка в ячейке, которая представляет собой простую формулу переменной в нем. Эта переменная будет определена заранее. Тогда мне нужно оценить строку. Я не могу получить значение ячейки для оценки. Сама строка вычисляется в окне интерпретация, но точно такое же значение ячейки не имеет:

?myVar
 1 
?[M115].Value
"0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)"
?Evaluate("0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)")
 0.095 
?Evaluate([M115].Value)
Error 2029

мое самое лучшее угадайте, что переменная не оценивается, так как я могу заменить myVar на 1, и это работает. Я пробовал все виды тройного цитирования, и это тоже не работает. Как я могу выполнить эту, казалось бы простую вещь? Я попытался обернуть в подлодки и функции следующим образом:

Function ev(r As Range, ByVal myVar As Double) As Variant
    Debug.Print myVar
    Debug.Print r.value
    ev = Evaluate(r.value)
End Function

?ev([M115], 1)
 1 
 "0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)"
Error 2029

myVar=1
?Evaluate("0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)")
0.095 

что я упускаю из виду? Благодаря.

27
задан fastzombies
30.12.2022 2:46 Количество просмотров материала 3249
Распечатать страницу

2 ответа

попробуйте это решение и вернуться, если он работает для вас. Нажмите ALT + F11, чтобы открыть редактор VBA. Вставьте модуль и вставьте в него следующий UDF.

Public Function test(r As Range, myvar As Double) As Double
Z = r.Formula
Z = Replace(Z, "myvar", myvar)
test = Evaluate(Z)
End Function

теперь ваше выражение в ячейках Excel не должно содержать символов, которые не являются частью формулы, например & " etc. Он должен содержать простую формулу со статическим именем и держать имя постоянным thruout и чувствительным к регистру.

например, myvar + 3 здесь myvar-это просто статический текст, нигде не объявленный. Использовать функцию и передайте ячейку как диапазон и значение переменной как double к нему. Нет много проверок на месте, передача многомерного массива может привести к ошибке здесь. Смотрите скриншот ниже. Дайте ему попробовать и проверить, если это отвечает вашим требованиям.

enter image description here

3
отвечен pat2015 2022-12-31 10:34

у меня недостаточно cred на superuser, чтобы поддержать, я просто связал свою учетную запись stackoverflow сегодня. Однако этот ответ был достаточно близок, чтобы отклеиться. Вот что работает:

Public Function evtest(r As Range, myVar As Double) As Variant
    Dim z As Variant
    z = r.formula
    z = Replace(z, "myVar", myVar)
    Debug.Print z
    evtest = Evaluate(z)
End Function

теперь я думаю, что мне есть с чем работать

?[M113].Value
0.1*myVar*(0.2+0.3*myVar/.4)
?evtest([M113], 1)
0.1*1*(0.2+0.3*1/.4)
 0.095 

если я найду что-то нужно изменить, я обновлю этот ответ. Большое спасибо.

EDIT: я сделал его немного более универсальным:

Function evtest(r As Range, myVarName As String, myVarValue As Double) As Variant
    Dim z As Variant
    z = r.formula
    z = Replace(z, myVarName, myVarValue)
    Debug.Print z
    evtest = Evaluate(z)
End Function

теперь использовать как so:

?[M113].Value
0.1*myVar*(0.2+0.3*myVar/.4)
?TEST.evtest([M113], "myVar", 1.5)
0.1*1.5*(0.2+0.3*1.5/.4)
 0.19875 

надеюсь, это поможет кому-то еще.

2
отвечен fastzombies 2022-12-31 12:51

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх