Страницы: 1
RSS
обращение к имени переменной из строки типа string
 
Коллеги, привет!
Подскажите, плз, как в VBA можно обратиться к конкретной переменной, название которой совпадает со значением ячейки в EXCEL, пример
код VBA, объявляем переменные:
alpha=1
beta=2
gamma=3

далее, в ячейку с координатами A1 вбито beta, мне нужно в макросе вывести значение переменной beta, то есть по сути обратиться к переменной beta

спасибо!
 
напрямую нельзя.
если переменных оч.немного - можно через select case
но обычно для подобных целей имеет смысл использовать ассоциированные массивы - словари или коллекции.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Может быть, так устроит:
Код
' Пример формулы в ячейке:
' =GetVar(A1) где в ячейке A1 одно из текстовых значений: "alpha", "beta" или "gamma"
Function GetVar(VarName As String)
  Const alpha = 1
  Const beta = 2
  Const gamma = 3
  Select Case LCase(VarName)
    Case "alpha": GetVar = alpha
    Case "beta":  GetVar = beta
    Case "gamma": GetVar = gamma
    Case Else:    Err.Raise 1
  End Select
End Function 
 
Если нужно напрямую, то создавать переменные,  к значениям которых нужен доступ по имени,  в модуле класса Class1:
Код в модуле класса Class1:
Код
' Код модуля класса Class1
Public alpha, beta, gamma

Property Get Variable(x As String)
  Variable = CallByName(Me, x, VbGet)
End Property

Private Sub Class_Initialize()
  alpha = 1
  beta = 2
  gamma = 3
End Sub 
А в коде стандартного модуля (Module1) записать:
Код
' Код в стандартном модуле
Function VarValue(x As String)
  Dim y As New Class1
  'y.alpha = 10
  'y.beta = 20
  'y.gamma = 30
  VarValue = y.Variable(x)
End Function

Sub Test()
  Debug.Print VarValue("alpha")
End Sub
 
Тогда формула ячейки = VarValue(A1) выдаст значение переменной из модуля класса
А как получить значение в VBA - см. код Test выше
Возможно, удобнее объявить  Dim y As New Class1 на уровне модуля, а не внутри функции VarValue, это зависит от решаемой задачи
Изменено: ZVI - 07.09.2014 04:17:54
 
День добрый.
Очень хотелось реализовать такую идею: есть список, который мы задаем через Enum, например, список номеров столбцов, относящихся к конкретному месяцу:
Код
Enum MonthCol
   Январь=1
   Февраль=3
   Март=10
End Enum
'..... какой-то код
Dim MC as MonthCol
MC="Март" 'Range("A1") .Value
но тут и возникает ошибка - потому что тип переменной MC это Long, а передаем строку.

Я правильно понимаю, что по-другому этот вопрос, иначе чем описано уважаемым ZVI выше, не решить?
Изменено: Максим Зеленский - 21.11.2014 11:01:49
F1 творит чудеса
 
По умолчанию типом данных для перечисления является Integer. (справка)

опять же из справки:
Цитата

Если имеется набор неизменных значений, логически связанных друг с другом, можно определить их вместе в перечислении. Это позволяет присвоить перечислению и его элементам осмысленные имена, которые легче запомнить, чем их значения. Затем можно использовать элементы перечисления во многих местах в коде.
А Вы в коде пытаетесь изменить его значение  
Изменено: ber$erk - 21.11.2014 11:54:45
Учимся сами и помогаем другим...
 
не изменить значение Enumeration, а поменять значение переменной типа Enum
Скрытый текст
F1 творит чудеса
 
Либо я не ту справку читаю, либо у меня с глазами проблема.
Учимся сами и помогаем другим...
 
Choose Function
Нет?

интересно, с какого перепуга шрифт стал жирным?
Изменено: RAN - 21.11.2014 12:34:24
 
И кстати, в первом сообщении Вы текстовое значение добавляли, а на скринах показано добавление переменной (без кавычек в общем).
Учимся сами и помогаем другим...
 
ну там справка по VS2013, там в том числе сказано и что
Цитата
Можно указать Byte, Integer, Long, SByte, Short, UInteger, ULong или UShort.
А в справке по VBA сказано что

а вот что пишет Chip Pearson
Цитата
Because an Enum is really a Long type variable, you can create a set up to 32 elements that can be combined. When creating many elements of a enum, it is useful to use exponential expressions to assign the values. For example,
Код
Public Enum FontStyle 
   Ex0 = 0 
   Ex1 = 2 ^ 0 
   Ex2 = 2 ^ 1 
   Ex4 = 2 ^ 2 
   '... as so on to 
   Ex30 = 2 ^ 30
End Enum

Finally, you can turn all the bits on by setting the variable's value to -1, as in FS = -1. This works because in binary, -1 sets all the bits of the Long to 1s. Similarly, all bits can be turned off by setting the value to 0.
F1 творит чудеса
 
Цитата
ber$erk пишет: текстовое значение добавляли
не совсем понял, вроде не добавлял, а пытался присвоить.  :)  И да, я там написал, что такая запись (с кавычками) вызывает ошибку
F1 творит чудеса
Страницы: 1
Наверх