Тема: Как получить имя переменной из строки?
допустим есть строка, содержащая имя переменной.
можно ли обратиться к этой переменной именно через сторку?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как получить имя переменной из строки?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
допустим есть строка, содержащая имя переменной.
можно ли обратиться к этой переменной именно через сторку?
Наверное, нет. Переменная - это область памяти, а строка в данном случае - это то что записывается в область памяти.
Строка не содержит имени переменной. Просто значение этой строковой переменной совпадает с записью переменной в коде программы.
Возможно, продвинутые спецы дадут более обстоятельный ответ.
> brigval
Да почему нет? А это чем не обращение:
Dim sysVarName As String Dim varData As Variant sysVarName = "FILLMODE" varData = ThisDrawing.GetVariable(sysVarName)
> Leonid
Мне показалось, что вопрос не о системной переменной, а о переменных в коде программы. Поэтому я так и ответил.
хотелось бы да, именно о тех, которые в коде.
все равно спасибо!
> kb-nn
В бейсике это НЕВОЗМОЖНО в принципе. А в лиспе - пожалуйста, там есть функция (read), почитайте в хелпе про её возможности. На входе она получает строку (составленную по определённым правилам, см. хелп), а на выходе - результат интерпретации этой строки (!!!). А бейсик, паскаль, Си, ява, ... - все отдыхают.
Пример кода с использованием (read) можно посмотреть здесь:
https://www.caduser.ru/forum/topic9032.html,
в постинге > Maxim T (2004-06-27 22:44:11)
Думаю, что по-большому счету, Maxim T прав...
А по-маленькому, как ни смешно, но нижеприведенная конструкция работает:
Sub testVar() Dim Var1 As Integer Dim Var2 As Integer Dim VarString As String Var1 = 1 Var2 = 2 VarString = GetVarName() MsgBox CVar(VarString) End Sub Public Function GetVarName() GetVarName = "Var2" End Function
> Leonid
Ваш код, наверное, можно записать проще:
Sub testVar() Dim VarString As String VarString = "Var2" MsgBox VarString End Sub
> Leonid
Имхо, я прав и по-большому (счёту), и по-маленькому :).
Приведённый вами код просто выводит строку на экран (о чём не без иронии указал > brigval (2004-12-10 16:47:48)), а автор ветки спрашивал, очевидно, совсем о другой задаче, с которой справится Лисп и только Лисп (ну может быть, ещё FORTH, но он в акаде не поддерживается:)).
> Maxim T
Ну что тут можно сказать? Все правы. И по всем счетам!
А автор ветки спрашивал:допустим есть строка, содержащая имя переменной.можно ли обратиться к этой переменной именно через сторку?
Насколько я понимаю, речь идет о строке, значение которой заранее не известно, и которая получена в результате работы программы. Если такую строку конвертировать, как показано в приведенном посте, то можно обращаться к ней как к переменной. В ироническом варианте brigval'а есть (вероятно намеренная) неточность:
Dim VarString [i]As String[/i]
В вопросе автора темы нет указаний на тип переменной.
И еще, уважаемый Maxim T, вы вероятно не запускали приведенный код, иначе обратили бы внимание, что на экран выводится не "просто строка", а значение переменной, имя которой совпадает с полученной строкой.
Bообщем, интересно было бы узнать мнение автора темы,
а-ууу,kb-nn!
на экран выводится не "просто строка", а значение переменной, имя которой совпадает с полученной строкой
Нет, я внимательно изучил ваш код, и не только запускал его, но и пытался сам написать что-то подобное. Увы, чудес не бывает, на экран выводится "Var2", а не "2", то есть ИМЯ переменной, а не её значение.
Я думаю, если бы в бейсике на самом деле БЫЛА такая возможность, о ней "трубили" бы "до посинения" при каждом удобном случае. Программирование тем и лучше других сторон человеческой деятельности, что здесь правдоподобные небылицы можно разоблачить парой нажатий кнопки (я имею в виду: "пометить код в форуме" -> Ctrl-C -> "перейти в акадовский бейсик" -> Ctrl-V -> "перейти в редактор акада" -> Alt-F8). Извините, если вышло грубо, но не надо рассказывать неправду новичкам.
Вынужден извиниться перед участниками обсуждения - был неправ относительно результатов работы приведенного кода(2004-12-10 16:10:20) , поспешил и принял желаемое за действительное. Тем не менее, считаю что сводить проблему к сравнению достоинств и недостатков языков программирования не стоит, дело не в языках, а в их использовании. Так ,с практической точки зрения, обратиться к переменной, имя которой получено в виде строки, можно и в VB. Допускаю что прием (создание коллекции переменных) и выглядит несколько искусственно, но результат дает:
Sub testVar() Dim Var1 As Integer Dim Var2 As Integer Var1 = 1 Var2 = 2 'create a collection of variables: Dim VarCol As New Collection VarCol.Add Var1, "Var1" VarCol.Add Var2, "Var2" Dim VarString As String VarString = GetVarName() MsgBox (VarCol(VarString)) End Sub Public Function GetVarName() GetVarName = "Var2" End Function
> Leonid
Leonid, Вы неисправимый оптимист :)
> Maxim
T
Помню, что где то видел, но не было нужды и я не воспользовался. А что вы скажете на пример из хелпа VBA?
Sub Example_Eval() ' This example shows how we can use Eval to run a VBA code fragment ' without having to create a Module or procedure. Dim VBACode As String ' Create VBA code fragment VBACode = "MsgBox ""Simple code fragment""" ' Use Eval method to evaluate our small VBA script Eval (VBACode) End Sub
Не подрывает ли он позиции Лиспа в контексте нашего разговора?
Помню, что видел и еще примеры, но нет времени заняться поиском :(
то brigval , спасобо за подсказку.
А теперь внимание, правилный ответ(если кому надо :)))
Мощнейший, наиполнейший, функциальнеший, калькулятор.
Спешите не пропустите.
Всего 21 строка кода.
Для проекта необходимо:
Внимание
1.Добавить в Tools->References->
Выбрать: MicroSoft Visual Basic for Application Extensibylity 5.3
2.Добавит в модуль ThisDrawing 3(три) пустые строки(Очень Важно)
3.Добавить новый модуль
4.Добавить в новый модуль 21 строку кода
Sub calc() Dim vv As VBE Set vv = VBE Dim mo As VBComponent a = InputBox("Simple Calculation") For Each mo In vv.ActiveVBProject.VBComponents If mo.Name = "ThisDrawing" Then mo.CodeModule.DeleteLines 1 mo.CodeModule.DeleteLines 1 mo.CodeModule.DeleteLines 1 msg = "sub code" & vbCrLf & "msgbox cstr(" & _ a & ")" & vbCrLf & "end sub" mo.CodeModule.InsertLines 1, msg End If Next For Each mo In vv.ActiveVBProject.VBComponents If mo.Name = "ThisDrawing" Then Eval ("ThisDrawing.code") End If Next End Sub
5.Запустить ф-ю calc
6.Ввести в окно инпут cos(23*3-6) + 4 * Atn(1)
7. Насладиться результатами моего труда :)
> cadhelp
Получил "большое эстетическое удовольствие", хотя почему-то не сработала третья строка... Но не в этом дело.
У меня стоит VBA-Recorder, который и не такие штуки вытворяет, однако такого кайфа как от вашего кода я не получал. Спасибо за, можно сказать, новогодний подарок.
> cadhelp
Сразу не получилось, но потом пошло.
1 При наличии Option Explicit добавил
Dim a As String
Dim msg As String
2 В ThisDrawing пришлось убрать Option Explicit и, естественно, перенести объявленные переменные с уровня модуля на уровень процедур. Так процедура code вставляется до них.
На счет удовольствия ничего определенного сказать не могу :(
>Maxim T
Благодаря дискуссии и Вашим серъезным ответам, мы вместе узнали про VBA еще что-то. На функцию Eval я наткнулся случайно, когда искал аналог функции Wait из VBA for Excel. Правда, так и не нашел :(
> kb-nn
Да, если Вы поняли, то, выходит, что можно.
Вот работающий пример.
Public temp1 As String Sub test() Dim temp2 As String temp1 = "Good!" temp2 = "MsgBox" & Space(1) & "temp1" Eval (temp2) End Sub
Увидим "Good!"
Или вот такой
Public temp1 As String Public temp2 As String Sub test() temp1 = "Good!" temp2 = "temp2=" & "temp1" Eval (temp2) MsgBox temp2 End Sub
Увидим "Good!"
Самое кульное что етот калькулятор работет со всеми ВБишными ф-циями кототорые возвращают число ну и нeкоторые другие, например можно
date
или даже
len(date)-len(time)
:)))
спасибо!
функция eval мне понравилась.
остального я ничего не понял.
хотя впрочем этого вполне хватает.
спасибо!
Вдогонку к теме...
Наткнулся на control, который преобразует строку в код и может даже запустить полученную процедуру на выполнение:
http://www.firststeps.ru/ ,Visual Basic, шаг 105
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как получить имя переменной из строки?
Форум работает на PunBB, при поддержке Informer Technologies, Inc