Присвойте значение переменной ключу переменной - PullRequest
0 голосов
/ 21 марта 2019

Мне нужно создавать переменные на лету в Excel VBA, как, например, пользователи вводят Имя и Возраст внутри переменных NAME и AGE.Предположим, пользовательский тип PETER в NAME и 34 в AGE, я хочу, чтобы VBA создал переменную PETER с содержимым 34. Это можно легко сделать в PHP.

Мне удалось заставить его работать:

Person = Cells(10, 1).Value 'suppose it is "PETER"
Age = Cells(11, 1).Value    'suppose it is "34"

Создание переменной

Names.Add Name:=Person, RefersTo:=Age

Получение ее

Debug.Print Person              ' prints PETER
Debug.Print Evaluate(Person)    ' prints 34
Debug.Print PETER               ' Variable PETER does not exist

Вышемне не помогает, так как это то же самое, что создание переменной «NAME» с содержимым PETER, когда оценивается показ 34. Мне нужна переменная PETER с содержимым 34.

Проблема в том, что;

PERSON="PETER"
AGE="34"
Name.Add Name:=PERSON RefersTo:=Age

создает переменную PERSON = 34, а не PETER = 34.

Name.Add Name:=Evaluate(Person) ... не работает.

Любая помощь, пожалуйста?

Обновление от 22.03.2009 1:38 pm

Следуя некоторым советам и открытиям, Словарь - это то, что решает мою проблему.

Sub T1() 
  Dim MAGIC As New Scripting.Dictionary 
  AnyVar = "R10"               'sets [AnyVar] = "R10"
  Magic(AnyVar) = 25           'sets [R10] = "25" 
  Magic("ARTEN") = "R10"       '[ARTEN] points to R10
  Magic("R10") = 33            'sets [R10] = "33"
  N5 = Magic("ARTEN")          'sets N5 = "R10"
  N6 = Magic(N5)               'sets N6 = [R10] (33)
  Debug.Print N5 & " = " & N6 
End Sub 

Это напечатано "R10 = 33 ", именно то, что я хотел иметь.Итак, теперь с помощью словаря я могу создавать переменные на лету и легко находить или изменять их значения.

Чтобы создать новую запись в Magic (словарь):

Magic.Add key:="name", Item:=33

Если текст междуцитаты, новая запись будет тем текстом.Если без кавычек, предполагается, что это переменная, содержащая имя / значение.

V25 = "foo"
V26 = 33
Magic.Add key:=V25, Item:=V26

Создает имя записи "foo" с содержимым 33.

Чтобы изменить любую существующую запись, просто

V25 = "foo"
V26 = 33
V29 = "fee"
V30 = "faa"
Magic(V25) = V26                '[foo] = 33
Magic("foo") = 38               '[foo] = 38
Magic(V29) = 39                 '[fee] = 39
Magic(V25) = Magic(V29) + 1     '[foo] = [fee]+1 = 40 
dictionary(V30) = V25           '[faa] = [V25] = "foo"
debug.print Magic(V30)          'prints "foo"
debug.print Magic(Magic(V30))   'prints 40
V40 = "Paul"
V41 = "Smith"
Magic(V40) = V41
debug.print Magic("Paul")       'print Smith

Если имя записи "foo" существует, оно изменит содержимое на содержимое V26, если запись не существует, она создаст ее.

Итак, вы неДля создания записи нужно использовать формальный способ.

Magic.Add key:=V25, Item:=V26

1 Ответ

1 голос
/ 21 марта 2019

Вы также можете использовать простой класс с именем cPerson

Option Explicit

Public pName As String
Public pAge As Long

Пример может выглядеть следующим образом

Option Explicit

Sub TestIt()
Dim dict As New Scripting.Dictionary
Dim person As cPerson
Dim key As Variant

    Set person = New cPerson
    With person
        .pName = "Peter"
        .pAge = 34
        dict.Add .pName, person
    End With


    Set person = New cPerson
    With person
        .pName = "John"
        .pAge = 43
        dict.Add .pName, person
    End With

    For Each key In dict.Keys
    With dict(key)
        Debug.Print .pName, .pAge
    End With
    Next

    Debug.Print dict("Peter").pAge
    Debug.Print dict("John").pAge

End Sub

Обновление В Excel вам нужно установитьссылка на библиотеку времени выполнения сценария VB.

  • Для ссылки на эту библиотеку загрузите редактор Visual Basic (ALT + F11)
  • Выберите Инструменты> Ссылки в раскрывающемся меню.
  • Будет отображен список доступных ссылок
  • Установите флажок рядом с «Microsoft Scripting Runtime»
  • Полное имя и путь к файлу scrrun.dll будутбудет отображаться под списком
  • Нажмите на кнопку ОК.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...