Ваша проблема - объявление вашего объекта.
Dim foo as New bar
Это называется самозаверяющим объявлением , что делает установку нового объекта необязательной. Если вы вызываете член объекта и он еще не установлен, он создается (неявный Set foo = New bar
). Но, как вы уже создали экземпляр (при первом вызове obj.name
). этот используется повторно, и одна и та же ссылка сохраняется три раза для одного и того же объекта-экземпляра. Вот почему все элементы в массиве возвращают одно и то же значение, поскольку они являются одним и тем же объектом-экземпляром, а не тремя разными.
Так что не используйте New
в объявлениях, тогда вам всегда нужны Set foo
и можете проверить экземпляр объекта на Nothing
.
Вторая проблема с вашим кодом заключается в том, что назначение объекта массиву состоит в том, что удаление элементов из массива подвержено ошибкам, а не удаленные ссылки приводят к не уничтожению, а неиспользуемые объекты.
Предпочтительным хранилищем для объекта (-references) является Collection
.
Sub foo()
Dim ObjCollection as Collection
Set ObjCollection = New Collection
Dim i As Integer
For i = 1 To 3
Dim obj As bar
Set obj = New bar
obj.name = i
ObjCollection.Add obj
Next
For i = 1 To 3
Debug.Print ObjCollection(i).name
Next
End Sub