Создайте вызов типа enum как строку и используйте в функции Evaluate в VBA

У меня есть тип Enum в VBA, и я хочу использовать его в качестве индекса для массива. Проблема в том, что я хочу построить Enum во время выполнения на основе ввода из другой функции.

Так что я:

Enum Rating_
   AAA = 1
   AA = 2
   A = 3
End Enum

и следующий массив:

Dim arr(1 To 3) as Double

arr(1) = 0.1
arr(2) = 0.2
arr(3) = 0.3

Также у меня есть функция, которая выводит одну из следующих строк. Внутренняя работа функции не имеет значения. Для решения этой проблемы это может быть просто строка (одно из значений Enum):

funct(x,y) = "AAA"
funct(x,y) = "AA"
funct(x,y) = "A"

Я хочу создать строку с вызовом Enum, например:

Dim str As String
str = "Rating_." & funct(x,y)

и используйте его вместе с функцией Evaluate, например:

Evaluate("arr(" & str & ")")

Приведенный выше код выдает ошибку:

Ошибка 2029

и следующее

Evaluate("""arr(" & str & ")""")

где функция (х, у) = "ААА" дает:

обр(Рейтинг_.AAA)

как строка.

Я хотел бы получить 0,1 (0,2, если функция (x, y) = "AA", 0,3, если функция (x, y) = "A").

Заранее спасибо.


person sonarclick    schedule 21.06.2019    source источник
comment
Вы не можете изменить Enum во время выполнения. Если я правильно понял ваш вопрос, я думаю, вы ищете словарь...   -  person BigBen    schedule 21.06.2019
comment
@BigBen Я не хочу изменять Enum во время выполнения. Я просто хочу использовать его как индекс массива. Мне просто нужно построить его во время выполнения в виде строки и оценить его.   -  person sonarclick    schedule 21.06.2019
comment
VBA не выполняет такого рода оценку кода во время выполнения.   -  person Tim Williams    schedule 21.06.2019
comment
Evaluate неявно Application.Evaluate - это не имеет ничего общего с VBA, это просто функция, представленная в библиотеке типов Excel; он оценивает выражения в контексте хост-приложения, например. именованные диапазоны, функции рабочего листа и т. д.: он ничего не знает ни о каком коде VBA.   -  person Mathieu Guindon    schedule 21.06.2019
comment
@MathieuGuindon Спасибо за объяснение.   -  person sonarclick    schedule 21.06.2019


Ответы (1)


Расширяя комментарий @BigBen о том, что словарь может быть тем, что вы ищете, я согласен с ним, и вот как вы его реализуете:

Sub tgr()

    Dim Rating_ As Object
    Set Rating_ = CreateObject("Scripting.Dictionary")
    Rating_("AAA") = 1
    Rating_("AA") = 2
    Rating_("A") = 3

    Dim arr(1 To 3) As Double
    arr(1) = 0.1
    arr(2) = 0.2
    arr(3) = 0.3

    Dim str As String
    str = "AA" 'replace with your funct output here

    MsgBox arr(Rating_(str))    '<-- returns 0.2, no Evaluate required

End Sub
person tigeravatar    schedule 21.06.2019
comment
Спасибо вам обоим за это. Я знаю о функциональности словаря, но я хотел знать, могу ли я сделать это с помощью Evaluate, поскольку он работает с типом Enum, если вы не хотите создавать его так, как я хочу. - person sonarclick; 21.06.2019
comment
@sonarclick Мне интересно, как вы работаете с оператором типа Enum. AFAICT это не так, и в этом не было бы никакого смысла. Evaluate MyEnumValue эквивалентен Evaluate 1 (предполагается, что MyEnumValue = 1; VBA оценивает значение перечисления перед передачей базового целочисленного значения Long в функцию Evaluate), которая выводит 1, потому что Excel знает, как интерпретировать числовые литеральные значения. Если вы Evaluate "MyEnumValue", вы получите сообщение об ошибке. - person Mathieu Guindon; 21.06.2019
comment
@MathieuGuindon Я имею в виду, что если выполнить Evaluate(arr(Rating_.AAA)) я получаю 0,1. Вот почему я спросил, могу ли я построить Enum во время выполнения, используя вывод funct(x,y). - person sonarclick; 22.06.2019
comment
@sonarclick, и я имею в виду, что вы получаете 0,1, потому что то, что вы даете функции Evaluate, равно 0,1; VBA оценивает arr(Rating_.AAA) как 0,1, прежде чем передать этот результат в функцию Evaluate. - person Mathieu Guindon; 22.06.2019
comment
@MathieuGuindon Я понимаю это, но я думал, что есть способ передать строку и оценить ее. Я видел случаи, когда передается строка, подобная этой, A & = & A, а возвращается TRUE. Видимо ошибся... - person sonarclick; 22.06.2019
comment
@sonarclick механизм расчета Excel прекрасно понимает "A"="A". Чего вы не понимаете, так это того, что движок calc ничего не знает ни о каком коде VBA, будь то перечисление или любая другая константа или переменная - они существуют в контексте выполнения среды выполнения VBA... я не знаю как еще это объяснить. Evaluate является членом Excel.Application, вы можете присвоить ему строку и оценить ее с помощью механизма вычисления Excel, да, и в основном это бесполезно, потому что большинство вещей, которые вы можете заставить Excel оценить, может сделать VBA слишком. "A" = "A" также оценивается как True в VBA. - person Mathieu Guindon; 22.06.2019