Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Преобразование символьного значения в имя переменной - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Преобразование символьного значения в имя переменной
iSa Дата: Вторник, 03.06.2014, 17:47 | Сообщение № 1
Группа: Гости
День добрый.
Суть проблемы следующая, есть набор переменных типа 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
Дата добавления - 03.06.2014 в 17:47
Rioran Дата: Вторник, 03.06.2014, 17:54 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
iSa, здравствуйте.

В вашем примере переменные изначально числа:

[vba]
Код
Dim T1, T2, T3, T4 as Integer

T1=10 : T2=20 : T3=30
[/vba]
А числа не могут быть именами переменных. Может, добавите любую букву слева к имени?

*****

Возможно, не понял вопрос. Поисковик говорит, что для VBA не знает ни метода, ни свойства, ни функции CallFunct.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Вторник, 03.06.2014, 18:04
 
Ответить
СообщениеiSa, здравствуйте.

В вашем примере переменные изначально числа:

[vba]
Код
Dim T1, T2, T3, T4 as Integer

T1=10 : T2=20 : T3=30
[/vba]
А числа не могут быть именами переменных. Может, добавите любую букву слева к имени?

*****

Возможно, не понял вопрос. Поисковик говорит, что для VBA не знает ни метода, ни свойства, ни функции CallFunct.

Автор - Rioran
Дата добавления - 03.06.2014 в 17:54
iSa Дата: Вторник, 03.06.2014, 18:03 | Сообщение № 3
Группа: Гости
Прошу прощения, не очень понял...
К переменной T1 еще одну букву вначале добавить? что это даст? zT1, так?
И к еще, T1 это именно переменная типа Integer. А символы "T1" являются симовлами и после преобразования могут стать именем переменной. ..наверное могут.. в этом то и вопрос. как?
 
Ответить
СообщениеПрошу прощения, не очень понял...
К переменной T1 еще одну букву вначале добавить? что это даст? zT1, так?
И к еще, T1 это именно переменная типа Integer. А символы "T1" являются симовлами и после преобразования могут стать именем переменной. ..наверное могут.. в этом то и вопрос. как?

Автор - iSa
Дата добавления - 03.06.2014 в 18:03
Rioran Дата: Вторник, 03.06.2014, 18:07 | Сообщение № 4
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
iSa, то есть, вы в начале объявляете переменную Т1, а потом хотите этим же именем назвать ещё одну переменную?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеiSa, то есть, вы в начале объявляете переменную Т1, а потом хотите этим же именем назвать ещё одну переменную?

Автор - Rioran
Дата добавления - 03.06.2014 в 18:07
MCH Дата: Вторник, 03.06.2014, 18:15 | Сообщение № 5
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Почему сразу не передавать переменную, вместо текста?

Вместо
T4=CallFunc("T1")
записать
T4=CallFunc(T1)

а уже CallFunc работает со значением


Сообщение отредактировал MCH - Вторник, 03.06.2014, 18:16
 
Ответить
СообщениеПочему сразу не передавать переменную, вместо текста?

Вместо
T4=CallFunc("T1")
записать
T4=CallFunc(T1)

а уже CallFunc работает со значением

Автор - MCH
Дата добавления - 03.06.2014 в 18:15
iSa Дата: Вторник, 03.06.2014, 21:01 | Сообщение № 6
Группа: Гости
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
Дата добавления - 03.06.2014 в 21:01
Hugo Дата: Вторник, 03.06.2014, 21:26 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3708
Репутация: 792 ±
Замечаний: 0% ±

365
Почему это будет передано значение? Будет передана именно переменная - а там что с ней делать, уже Ваше дело. Можете просто взять значение, а можете его изменить. Т.е. изменить значение переменной.
Как производить операции с переменной, имя которой хранится в другой переменной типа 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]Которая не работает у лентяев, которые не прошли регистрацию, которая занимает меньше пары минут.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеПочему это будет передано значение? Будет передана именно переменная - а там что с ней делать, уже Ваше дело. Можете просто взять значение, а можете его изменить. Т.е. изменить значение переменной.
Как производить операции с переменной, имя которой хранится в другой переменной типа 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
Дата добавления - 03.06.2014 в 21:26
iSa_spb Дата: Вторник, 03.06.2014, 23:54 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
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
Дата добавления - 03.06.2014 в 23:54
Hugo Дата: Среда, 04.06.2014, 01:33 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3708
Репутация: 792 ±
Замечаний: 0% ±

365
ByVal - передача значения переменной, ByRef - передача самой переменной по ссылке (по умолчанию).
Если собрать массив - то можно передавать этот индекс как угодно, хоть строкой, хоть словом (хочу шестой!), хоть сумму собирать - а в функции обработать что передали.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеByVal - передача значения переменной, ByRef - передача самой переменной по ссылке (по умолчанию).
Если собрать массив - то можно передавать этот индекс как угодно, хоть строкой, хоть словом (хочу шестой!), хоть сумму собирать - а в функции обработать что передали.

Автор - Hugo
Дата добавления - 04.06.2014 в 01:33
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!