XL 2013 Classe tableau et NewEnum

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' :
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

  • Excel-Downloads.xlsm
    41.7 KB · Affichages: 23
Dernière édition:

Theze

XLDnaute Occasionnel
Bonjour,

Déclaration de la procédure en Variant et avec les parenthèses puisqu'un tableau doit être retourné :
Code:
Public Property Get NewEnum() As Variant()

  NewEnum = mArray

End Property
Préciser la propriété dans l'appel :
Code:
For Each Item In Tablo.NewEnum
    Debug.Print Item
Next Item
 

dionys0s

XLDnaute Impliqué
Bonjour le forum,
Bonjour Theze,

merci pour votre aide, mais c'est une solution que souhaitais éviter : le but est d'avoir la ligne 'For Each Item In Tablo' inchangée, puisque NewEnum sera toujours utilisé dans ce cas. J'avais fait le test, et je ne m'explique d'ailleurs pas pourquoi ça plante lorsqu'on ne précise pas .NewEnum dans l'ouverture de la boucle. Quand on exécute le code pas à pas, on voit bien qu'il rentre dans la propriété 'NewEnum', mais renvoie l'erreur 451 'La procédure Property Let n'est pas définie et la procédure Property Get n'a pas renvoyé d'objet'.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 944
Membres
101 849
dernier inscrit
florentMIG