IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Classe type collection itérable avec méthodes (recherche, mise à jour,..) performantes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut Classe type collection itérable avec méthodes (recherche, mise à jour,..) performantes
    Bonjour,

    Je souhaiterais implémenter une classe de type collection itérable (donc a priori sans Scripting.Dictionary) avec méthodes (recherche, mise à jour,...) performantes. La classe contient des éléments non-ordonnés, mais uniques.

    En fait, j'initialise ma classe clsFields avec plusieurs milliers d'instances clsField. Ceci ne pose pas de problèmes.

    Le problème, c'est que je souhaite mettre à jour toutes le instances de clsFields et éventuellement en rajouter / supprimer. La mise à jour ne se fait pas forcément dans l'ordre d'initialisation de la classe clsFields.

    J'ai déjà eu à implémenter une méthode de dichotomie dans un cas similaire lorsque la collection était ordonnée, mais ce n'est pas le cas dans mon exemple.

    Mon idée est de rajouter une collection pIndexes qui contient toutes les clés de pFields que j'utiliserai dans les itérations pour la mise à jour de clsFields et, je supprimerai alors la clé à chaque mise à jour d'une instance.

    Ci-dessous un exemple minimal de la classe clsFields :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "clsFields"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = False
    Option Explicit
     
    Private pFields As Collection
    Private pIndexes As Collection
     
    'classe itérable
    Public Property Get NewEnum() As IUnknown
    Attribute NewEnum.VB_UserMemId = -4
    Attribute NewEnum.VB_MemberFlags = "40"
        Set NewEnum = pFields.[_NewEnum]
    End Property
     
    '-----------------------
     
    '
    Private Sub Class_Initialize()
        Set pFields = New Collection
        Set pIndexes = New Collection
    End Sub
     
    '
    Private Sub Class_Terminate()
        Set pFields = Nothing
        Set pIndexes = Nothing
    End Sub
     
    '-----------------------
     
    'méthode utilisée à l'initialisation uniquement
    Public Sub add(ByRef field As clsField)
     
        pFields.add item:=field
     
        pIndexes.add item:=field.index, key:=field.key' field.index est numéral et field.key est une chaine caractère (unique)
     
    End Sub
     
    '
    Public Sub update(ByRef field As clsField)
     
        'recherche de l'instance à partir des indices "restants" (ie pas encore utilisés pour la mise à jour)
        Dim index As Variant: For Each index In pIndexes
     
            If pFields(index:=index).key = field.key Then
     
                pFields(index:=index).update field:=field
     
                'les clés des instance mise à jour sont nettoyées au fur et à mesure
                pIndexes.Remove index:=field.key
     
                Exit Sub
     
            End If
     
        Next index
     
        pFields.add item:=field
     
        pIndexes.add item:=field.index, key:=field.key
     
    End Sub
    Cette possibilité me convient peut, car il ne me sera pas possible de même à jour plusieurs fois les mêmes instances. Pouvez-vous s'il vous plaît m'aviser sur les possibilités offertes par VBA ?

    Merci par avance !

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,


    Exemple de simulation de Classe Dictionary avec Collection.


    Boisgontier
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/02/2012, 18h30
  2. Réponses: 2
    Dernier message: 24/01/2008, 13h41
  3. Réponses: 3
    Dernier message: 18/07/2007, 17h20
  4. Réponses: 2
    Dernier message: 17/05/2007, 22h04
  5. pb avec la derniere mise à jour de kaspersky
    Par arfy dans le forum Sécurité
    Réponses: 6
    Dernier message: 19/07/2005, 08h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo