Передача объекта из коллекции в подпункт. Сохранение обновленного результата объекта в коллекции. - PullRequest
0 голосов
/ 29 апреля 2019

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

Я пытался передать элемент ByRef или ByVal, он не меняет результат

Sub test()
Dim i As Integer
Dim c As New Collection
i = 2
c.Add i
Call testtest(c(1))
Debug.Print c(1) ''I want this to return 3
End Sub

Sub testtest(i As Integer)
i = i + 1
End Sub

Пример с целым числом, но в действительности я использую объект.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Integer - это значение . Способ значения сохраняется в Collection, для его замены необходимо удалить и заново добавить новое значение.

Объекты разные: в коллекции хранится не сам объект, а указатель («ссылка») на него. И независимо от того, передаете ли вы этот указатель ByRef (ссылка на этот указатель) или ByVal (копия этого указателя), вы все равно передаете ссылку на точно такой же объект.

Предполагая, что Class1 имеет свойство Foo ...

Private Sub Test(ByVal obj As Class1)
    obj.Foo = obj.Foo + 1
End Sub

... затем Foo увеличивается, а объект в коллекции обновляется.

Подобно значениям, вы не можете просто заменить указатель объекта, который хранится в коллекции - вам нужно удалить, а затем повторно добавить новый объект, если вы хотите это сделать.

0 голосов
/ 29 апреля 2019

На основании небольшой информации в комментариях это может помочь

Option Explicit

Sub TestIt()
    Dim p As Class1
    Dim c As New Collection

    Set p = New Class1
    p.p1 = 42
    c.Add p

    Set p = New Class1
    p.p1 = 43
    c.Add p

    Debug.Print c.Item(1).p1
    AddIt c.Item(1)
    Debug.Print c.Item(1).p1

End Sub

Sub AddIt(ByVal i As Class1)
    i.p1 = i.p1 + 1
End Sub

А, класс

Option Explicit

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