dionys0s
XLDnaute Impliqué
Bonjour le forum,
depuis quelques temps maintenant, je manipule des collections des classes (Par exemple une classe parente 'Objets' qui est une collection de la classe enfant 'Objet'), et un peu de la même manière, j'essaie de créer une classe perso pour gérer des tableaux à une dimension, mais en une seule classe.
Voici les codes des trois exemples tel qu'ils apparaissent dans un éditeur de texte (pour voir les attributs cachés de certaines propriétés, concernant NewEnum notamment.
Le code de la classe parente 'Objets' :
Le code de la classe fille 'Objet' :
Le code de la classe autonome 'Array' :
Le code de NewEnum est commenté dans mon code, parce qu'il ne fonctionne pas. Ma question est donc la suivante : pour la classe Array, est-il possible de boucler sur les items de cette classe avec une ligne de type 'For Each Item in MaClasseArray ... Next Item', et ce sans créer de collection (ajouter les items de la classe dans une collection et utiliser la collection dans NewEnum), ou de propriété, mais uniquement à partir de NewEnum.
Je joins en PJ un classeur qui contient les 3 classes et un bout de code qui ajoutes quelques items, et boucle sur les objets.
D'avance, merci pour votre aide !
dionys0s
depuis quelques temps maintenant, je manipule des collections des classes (Par exemple une classe parente 'Objets' qui est une collection de la classe enfant 'Objet'), et un peu de la même manière, j'essaie de créer une classe perso pour gérer des tableaux à une dimension, mais en une seule classe.
Voici les codes des trois exemples tel qu'ils apparaissent dans un éditeur de texte (pour voir les attributs cachés de certaines propriétés, concernant NewEnum notamment.
Le code de la classe parente 'Objets' :
VB:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "cObjects"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Private mItems As New VBA.Collection
Public Function Add(ByVal Code As String) As cObject
Set Add = New cObject
With Add
.Code = Code
mItems.Add Add, .Code
.Index = mItems.Count
End With
End Function
Public Property Get Item(ByVal CodeOrIndex As Variant) As cObject
Attribute Item.VB_UserMemId = 0
Set Item = mItems(CodeOrIndex)
End Property
Public Property Get Count() As Long
Count = mItems.Count
End Property
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = mItems.[_NewEnum]
End Property
Private Sub Class_Terminate()
Set mItems = Nothing
End Sub
Le code de la classe fille 'Objet' :
VB:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "cObject"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Public Code As String
Public Index As Long
Le code de la classe autonome 'Array' :
VB:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "cArray"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Private mArray() As Variant
Public Function Add(ByVal Value As Variant) As cArray
ReDim Preserve mArray(LBound(mArray) To UBound(mArray) + 1)
If IsObject(Value) Then
Set mArray(UBound(mArray)) = Value
Else
mArray(UBound(mArray)) = Value
End If
Set Add = Me
End Function
Public Property Get Item(ByVal Index As Long) As Variant
Attribute Item.VB_UserMemId = 0
If IsObject(mArray(Index)) Then
Set Item = mArray(Index)
Else
Item = mArray(Index)
End If
End Property
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
'Set NewEnum = mArray.[_NewEnum] 'Ne fonctionne pas
End Property
Private Sub Class_Initialize()
mArray = VBA.Array
End Sub
Private Sub Class_Terminate()
Erase mArray
End Sub
Le code de NewEnum est commenté dans mon code, parce qu'il ne fonctionne pas. Ma question est donc la suivante : pour la classe Array, est-il possible de boucler sur les items de cette classe avec une ligne de type 'For Each Item in MaClasseArray ... Next Item', et ce sans créer de collection (ajouter les items de la classe dans une collection et utiliser la collection dans NewEnum), ou de propriété, mais uniquement à partir de NewEnum.
Je joins en PJ un classeur qui contient les 3 classes et un bout de code qui ajoutes quelques items, et boucle sur les objets.
D'avance, merci pour votre aide !
dionys0s
Pièces jointes
Dernière édition: