День добрый. Суть проблемы следующая, есть набор переменных типа Integer - T1, T2, T3, T4 В определенный момент, программа запускает пользовательскую функцию передавая имя переменной в качестве аргумента - например CallFunc("T1")
Вопрос, как в функции CallFunc() преобразовать "T1" в имя переменной и произвести над ней вычисления?
Sub Test() Dim T1, T2, T3, T4 as Integer
T1=10 : T2=20 : T3=30
Select case {Условие} Case 1 T4=CallFunc("T1") Case 2 T4=CallFunc("T2") Case 3 T4=CallFunc("T3") end Select
EndSub
Function CallFunc (Str1 as String) as Integer
тут должен произойти перевод Str1 в имя переменной и произведено арифмитическое действие {Переменная с именем Str1}={Переменная с именем Str1} *2
CallFunc = 5
End Function
Т.е. в резельтате должно получиться T4 всегда будет =5 но в зависимости от условия Case, будут разными итоговые T1, T2, T3, либо 20, либо 40, либо 60 соответственно.
Не стоит задача оптимизировать алгоритм вычесления T1, T2 ... задача именно в том, как предобразовать символьное значение в имя переменной. По идее функция Evaluate, но она не срабатывает тут. Пробовал Evaluate(Str1)=Evaluate(Str2)*2, но не катит... включая промежуточный перевод в другие переменные. Пользоваться ячейками в самом WorkBook - нельзя. Буду благодарен за идеи...
День добрый. Суть проблемы следующая, есть набор переменных типа Integer - T1, T2, T3, T4 В определенный момент, программа запускает пользовательскую функцию передавая имя переменной в качестве аргумента - например CallFunc("T1")
Вопрос, как в функции CallFunc() преобразовать "T1" в имя переменной и произвести над ней вычисления?
Sub Test() Dim T1, T2, T3, T4 as Integer
T1=10 : T2=20 : T3=30
Select case {Условие} Case 1 T4=CallFunc("T1") Case 2 T4=CallFunc("T2") Case 3 T4=CallFunc("T3") end Select
EndSub
Function CallFunc (Str1 as String) as Integer
тут должен произойти перевод Str1 в имя переменной и произведено арифмитическое действие {Переменная с именем Str1}={Переменная с именем Str1} *2
CallFunc = 5
End Function
Т.е. в резельтате должно получиться T4 всегда будет =5 но в зависимости от условия Case, будут разными итоговые T1, T2, T3, либо 20, либо 40, либо 60 соответственно.
Не стоит задача оптимизировать алгоритм вычесления T1, T2 ... задача именно в том, как предобразовать символьное значение в имя переменной. По идее функция Evaluate, но она не срабатывает тут. Пробовал Evaluate(Str1)=Evaluate(Str2)*2, но не катит... включая промежуточный перевод в другие переменные. Пользоваться ячейками в самом WorkBook - нельзя. Буду благодарен за идеи...iSa
Прошу прощения, не очень понял... К переменной T1 еще одну букву вначале добавить? что это даст? zT1, так? И к еще, T1 это именно переменная типа Integer. А символы "T1" являются симовлами и после преобразования могут стать именем переменной. ..наверное могут.. в этом то и вопрос. как?
Прошу прощения, не очень понял... К переменной T1 еще одну букву вначале добавить? что это даст? zT1, так? И к еще, T1 это именно переменная типа Integer. А символы "T1" являются симовлами и после преобразования могут стать именем переменной. ..наверное могут.. в этом то и вопрос. как?iSa
Rioran, нет, речь все время идет об одной и той же переменной.
MCH, в таком случае, в функцию CallFunc будет передано значение переменной T1, т.е. 10, что не одно и тоже. Развивая эту идею, конечно можно создать кучу CalcFunc, вроде такого: ........ Select case {Условие} Case 1 T4=CallFuncT1() Case 2 T4=CallFuncT2() Case 3 T4=CallFuncT3() end Select ...........
Function CallFuncT1 () as Integer T1=T1*2 CallFunc = 5 End Function
Function CallFuncT2 () as Integer T2=T2*2 CallFunc = 5 End Function
Function CallFuncT3 () as Integer T3=T3*2 CallFunc = 5 End Function ----------------------- Ну или совсем просто Select case {Условие} Case 1 T4=5 T1=T1*2 Case 2 T4=5 T2=T2*2 Case 3 T4=5 T3=T3*2 end Select --------------------------- Да, формально результат будет достигнут, но он не красив и не оптимален... если представить, что условий 100 или операций внутри функции много.. А самое главное, не отвечает на поставленный вопрос - Как производить операции с переменной, имя которой хранится в другой переменной типа String.
По аналогии с Evaluate. boldCell = "A1" Application.Evaluate(boldCell).Font.Bold = True
аналогичное решение не работает Str1="T1" Evaluate(Str1)=Evaluate(Str1)*2
Rioran, нет, речь все время идет об одной и той же переменной.
MCH, в таком случае, в функцию CallFunc будет передано значение переменной T1, т.е. 10, что не одно и тоже. Развивая эту идею, конечно можно создать кучу CalcFunc, вроде такого: ........ Select case {Условие} Case 1 T4=CallFuncT1() Case 2 T4=CallFuncT2() Case 3 T4=CallFuncT3() end Select ...........
Function CallFuncT1 () as Integer T1=T1*2 CallFunc = 5 End Function
Function CallFuncT2 () as Integer T2=T2*2 CallFunc = 5 End Function
Function CallFuncT3 () as Integer T3=T3*2 CallFunc = 5 End Function ----------------------- Ну или совсем просто Select case {Условие} Case 1 T4=5 T1=T1*2 Case 2 T4=5 T2=T2*2 Case 3 T4=5 T3=T3*2 end Select --------------------------- Да, формально результат будет достигнут, но он не красив и не оптимален... если представить, что условий 100 или операций внутри функции много.. А самое главное, не отвечает на поставленный вопрос - Как производить операции с переменной, имя которой хранится в другой переменной типа String.
По аналогии с Evaluate. boldCell = "A1" Application.Evaluate(boldCell).Font.Bold = True
аналогичное решение не работает Str1="T1" Evaluate(Str1)=Evaluate(Str1)*2 iSa
Почему это будет передано значение? Будет передана именно переменная - а там что с ней делать, уже Ваше дело. Можете просто взять значение, а можете его изменить. Т.е. изменить значение переменной.
Как производить операции с переменной, имя которой хранится в другой переменной типа String.
- думаю совершенно лишний вопрос. Зачем так всё усложнять? И если куча таких переменных - т1, т2, т3 и т.д - не проще собрать всё в массив? Ещё - объявление неправильное, так integer будет только последняя переменная. Посмотрите в Locals. И вообще в Integer смысла нет, используйте Long - писать меньше, проблем меньше, и всё равно VBA c Integer уже толком не работает, всё переводит в Long - но предел Integer всё равно всплывёт, если упрётесь.
[vba]
Код
Sub Test() Dim T1&, T2&, T3&, T4&
T1 = 10: T2 = 20: T3 = 30
Select Case True Case 1 MsgBox "T1=" & T1 T4 = CallFunc(T1) MsgBox "T1=" & T1 MsgBox "T4=" & T4 Case 2 T4 = CallFunc("T2") Case 3 T4 = CallFunc("T3") End Select
End Sub
Function CallFunc(Str1) As Long Str1 = Str1 * 2 CallFunc = Str1 End Function
[/vba]
Или вот как массив: [vba]
Код
Sub Test() Dim T(1 To 4) As Long
T(1) = 10: T(2) = 20: T(3) = 30
Select Case True Case 1 MsgBox "T(1)=" & T(1) T(4) = CallFunc(T(1)) MsgBox "T(1)=" & T(1) MsgBox "T(4)=" & T(4) Case 2 T(4) = CallFunc(T(2)) Case 3 T(4) = CallFunc(T(3)) End Select
End Sub
Function CallFunc(ByVal Str1) As Long Str1 = Str1 * 2 CallFunc = Str1 End Function
[/vba] Выполните сперва так, а затем уберите ByVal И публикуйте коды в виде кода, а не неудобоваримого текста - есть ведь прекрасная кнопка # [moder]Которая не работает у лентяев, которые не прошли регистрацию, которая занимает меньше пары минут.
Почему это будет передано значение? Будет передана именно переменная - а там что с ней делать, уже Ваше дело. Можете просто взять значение, а можете его изменить. Т.е. изменить значение переменной.
Как производить операции с переменной, имя которой хранится в другой переменной типа String.
- думаю совершенно лишний вопрос. Зачем так всё усложнять? И если куча таких переменных - т1, т2, т3 и т.д - не проще собрать всё в массив? Ещё - объявление неправильное, так integer будет только последняя переменная. Посмотрите в Locals. И вообще в Integer смысла нет, используйте Long - писать меньше, проблем меньше, и всё равно VBA c Integer уже толком не работает, всё переводит в Long - но предел Integer всё равно всплывёт, если упрётесь.
[vba]
Код
Sub Test() Dim T1&, T2&, T3&, T4&
T1 = 10: T2 = 20: T3 = 30
Select Case True Case 1 MsgBox "T1=" & T1 T4 = CallFunc(T1) MsgBox "T1=" & T1 MsgBox "T4=" & T4 Case 2 T4 = CallFunc("T2") Case 3 T4 = CallFunc("T3") End Select
End Sub
Function CallFunc(Str1) As Long Str1 = Str1 * 2 CallFunc = Str1 End Function
[/vba]
Или вот как массив: [vba]
Код
Sub Test() Dim T(1 To 4) As Long
T(1) = 10: T(2) = 20: T(3) = 30
Select Case True Case 1 MsgBox "T(1)=" & T(1) T(4) = CallFunc(T(1)) MsgBox "T(1)=" & T(1) MsgBox "T(4)=" & T(4) Case 2 T(4) = CallFunc(T(2)) Case 3 T(4) = CallFunc(T(3)) End Select
End Sub
Function CallFunc(ByVal Str1) As Long Str1 = Str1 * 2 CallFunc = Str1 End Function
[/vba] Выполните сперва так, а затем уберите ByVal И публикуйте коды в виде кода, а не неудобоваримого текста - есть ведь прекрасная кнопка # [moder]Которая не работает у лентяев, которые не прошли регистрацию, которая занимает меньше пары минут.Hugo
Hugo, Спасибо, что открыли глаза на объявление переменных... Никогда не задумывался, что тип переменной будет назначен только последней в списке... ))) Привычка так писать осталась со времен Паскаля. На счет Long & Integer - опять же, привычка использовать переменные с минимальным размером в памяти...
На счет самого решения - да, результат будет получен, хотя и не совсем тот. В первом варианте приведенного решение результатом будет T1=10, а T4= 20, если по аналогии остальные условия, то ответы будут Case 2 T2=20, T4=40, Case 3 T3=30, T4=60 Не совсем то, что требовалось... с T4 - там просто, на него не обращаем внимание, а вот остальные, результат должен быть другим. На счет решения с массивом, не смог его понять... надо переварить смысл аргумента ByVal, беру таймаут на подумать. За совет про кнопку #, спасибо - не знал; в посте про правила, нет такой информации.
И под конец..)) опять за рыбу деньги, вопрос уже перешел скорее в область академического - как производить операции с переменной, имя которой дано в текстовом виде в другой переменной. По сути вопрос сводится к следующему - как можно выполнить код VBA записанный в виде текстовых переменных или, какой аналог функции Eval() из Java или VBScripts есть в VBA for Excel.
to Modertor - ) задачи разные, каждый решает свою, наиболее удобным для него способом. {на счет регистрации} Спасибо.
Hugo, Спасибо, что открыли глаза на объявление переменных... Никогда не задумывался, что тип переменной будет назначен только последней в списке... ))) Привычка так писать осталась со времен Паскаля. На счет Long & Integer - опять же, привычка использовать переменные с минимальным размером в памяти...
На счет самого решения - да, результат будет получен, хотя и не совсем тот. В первом варианте приведенного решение результатом будет T1=10, а T4= 20, если по аналогии остальные условия, то ответы будут Case 2 T2=20, T4=40, Case 3 T3=30, T4=60 Не совсем то, что требовалось... с T4 - там просто, на него не обращаем внимание, а вот остальные, результат должен быть другим. На счет решения с массивом, не смог его понять... надо переварить смысл аргумента ByVal, беру таймаут на подумать. За совет про кнопку #, спасибо - не знал; в посте про правила, нет такой информации.
И под конец..)) опять за рыбу деньги, вопрос уже перешел скорее в область академического - как производить операции с переменной, имя которой дано в текстовом виде в другой переменной. По сути вопрос сводится к следующему - как можно выполнить код VBA записанный в виде текстовых переменных или, какой аналог функции Eval() из Java или VBScripts есть в VBA for Excel.
to Modertor - ) задачи разные, каждый решает свою, наиболее удобным для него способом. {на счет регистрации} Спасибо.iSa_spb
ByVal - передача значения переменной, ByRef - передача самой переменной по ссылке (по умолчанию). Если собрать массив - то можно передавать этот индекс как угодно, хоть строкой, хоть словом (хочу шестой!), хоть сумму собирать - а в функции обработать что передали.
ByVal - передача значения переменной, ByRef - передача самой переменной по ссылке (по умолчанию). Если собрать массив - то можно передавать этот индекс как угодно, хоть строкой, хоть словом (хочу шестой!), хоть сумму собирать - а в функции обработать что передали.Hugo