Получение объекта Object из словаря в VBA - PullRequest
0 голосов
/ 11 мая 2018

У меня есть класс с членом, который является массивом двойных

'cls_Person
Public Name as String
Public InAMeeting as Variant
'InAMeeting: Type: Array of Double.
'Sometimes with dimensions of 1 to 8, sometimes of 1 to 10.

Я заполняю свой класс в цикле, а затем заполняю их в глобальном словаре со строкой в ​​качестве ключа.

Моя проблема возникает, когда я пытаюсь получить доступ к члену InAMeeting непосредственно из словаря:

'g_dict_People is a globally defined dictionary.
'KeyPerson is a unique key in the dictionary matching a filled object of type cls_Person
Dim Bravo as Double
Bravo = g_dict_People(KeyPerson).InAMeeting(3)

приводит к ошибке: Свойство пусть процедура не определена, а свойство get не вернуло объект (ошибка 451)

Но если я сначала создаю копию объекта из словаря, то это работает:

Dim Bravo as Double
Set temp_cls_Person = g_dict_People(KeyPerson)
Bravo = temp_cls_Person.InAMeeting(3)

Я могу получить доступ к элементу Name напрямую - это работает:

Dim Alpha as string
Alpha = g_dict_People(KeyPerson).Name

Почему разница? Это связано с тем, как я объявил член InAMeeting в определении класса? Есть ли способ прямого доступа к членам объекта, когда они имеют тип массив?

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

1 Ответ

0 голосов
/ 11 мая 2018

Я не могу проверить ваш код, так как у нас нет MCVE, но следующий код работает для меня. Изменено с этот ответ . TIL еще один вариант использования для ()! Попробуйте:

Bravo = g_dict_People(KeyPerson).InAMeeting()(3)
                          ' extra parens!  ^^

InAMeeting, по-видимому, реализовано как свойство, то есть функция, которую вы должны вызывать для получения массива, в который хотите индексировать. Дополнительные () делают этот вызов.

Мой тестовый пример:

Class1.cls

Public v As Variant

ThisDocument.bas

Public Sub foo()
    Dim v As Variant
    v = Array(1#, 2#, 3#, 4#, 5#)    ' Assuming you're doing something like this

    Dim o As Class1          ' Put the variant array in the object
    Set o = New Class1
    o.v = v

    Dim c As Collection      ' Put the object in the collection
    Set c = New Collection
    c.Add o, "key"

    On Error Resume Next

    Err.Clear
    Debug.Print "Direct"
    Debug.Print v(3)         ' Works OK
    Debug.Print Err.Number, Err.Description

    Err.Clear
    Debug.Print "From collection with ()"
    Debug.Print c("key").v()(3)             ' <== Your use case - works OK
    '        Extra parens ^^
    Debug.Print Err.Number, Err.Description

    ' Reproducing the problem

    Err.Clear
    Debug.Print "From collection"
    Debug.Print c("key").v(3)      ' <== Bombs --- I think this is analogous to your use case
    Debug.Print Err.Number, Err.Description

    Err.Clear
    Dim o1 As Object
    Set o1 = c("key")
    Debug.Print "Intermediate object"
    Debug.Print o1.v(3)         ' Trying what you tried, but it didn't work for me.
    Debug.Print Err.Number, Err.Description

    ' Another thing that works

    Err.Clear
    Debug.Print "Intermediate object with ()"
    Debug.Print o1.v()(3)               ' <== This works
    '   Those extra ^^ parens
    Debug.Print Err.Number, Err.Description

End Sub
...