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 :

Gérer les suppressions d'éléments dans une collection et une double boucle [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 35
    Points : 22
    Points
    22
    Par défaut Gérer les suppressions d'éléments dans une collection et une double boucle
    Bonjour,

    J'ai voulu faire une double boucle pour supprimer les éléments d'une collection. La suppression d'un élément d'une collection réduit automatiquement le nombre d'éléments et les numéros d'index et peut entraîne une erreur.

    Après avoir réfléchis à une solution et n'ayant rien trouvé, j'ai contourner le problème avec un "On Error Resume Next".

    Auriez-vous une solution plus élégante à me suggérer ?

    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
    On Error Resume Next
     
    With ReportingPeriodCollection
        For i = .Count To 1 Step -1
            For j = .Count To 1 Step -1
                If i <> j And .Item(i).PeriodYear = .Item(j).PeriodYear Then
                    Select Case .Item(i).PeriodYear
                        Case Is <> YearEndPeriod
                            If .Item(i).AnnualFactor = 1 Then
                            .Remove (j)
                            Else
                            .Remove (i)
                            End If
                        Case YearEndPeriod
                            If .Item(i).AnnualFactor > .Item(j).AnnualFactor Then
                            .Remove (i)
                            Else
                            .Remove (j)
                            End If
                    End Select
                Cpt = Cpt + 1
                End If
             Next j
        Next i
    End With

  2. #2
    Invité
    Invité(e)
    Par défaut Avec une matrice
    Bonjour,

    Pour faire ce genre d'opération, j'utilise une matrice à deux dimensions (X,Y) où X est le contenu d'un enregistrement + 1 champ "Drapeau", Y les enregistrements. Cette matrice est initialisée dès le début du programme.

    Le principe est de balayer la matrice et de noter dans le champ "Drapeau", les enregistrements à écarter selon les conditions de votre programme. Cela fait, on supprime les enregistrements de la liste, et on recharge la liste avec les enregistrements de la matrice non écartés.

    Nb : Pour balayer une matrice sur la dimension Y :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For I = Lbound(matrice,2) to Ubound(matrice,2)
     
    Next I
    Cordialement.
    Dernière modification par AlainTech ; 05/11/2013 à 21h45. Motif: Balises [code], pas [quote]

  3. #3
    Invité
    Invité(e)
    Par défaut Bonjour
    Eric KERGRESSE a raison,
    si je supprime une valeur dans une collection par exemple l'item(1), l'item(2) devient l'item(1) d'ou les erreur mais pire tu ne scanne plus tous les tous les items.
    il faut sauvegarder les positions des items à supprimer dans une variable tableau, puis après scanner le tableau de la dernière ligne à la première.

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Sans tester, on boucle pour tester et mettre -1 dans l'item concerné et faire une autre boucle pour supprimer les items "cochés"

    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
    With ReportingPeriodCollection
        For i = 1 To .Count - 1
            For j = i + 1 To .Count
                If .Item(i).PeriodYear = .Item(j).PeriodYear Then
                    Cpt = Cpt + 1
                    If .Item(i).PeriodYear <> YearEndPeriod Then
                        k = IIf(.Item(i).AnnualFactor = 1, j, i)
                    Else
                        k = IIf(.Item(i).AnnualFactor > .Item(j).AnnualFactor, i, j)
                    End If
                    .Item(k).PeriodYear = -1
                End If
            Next j
        Next i
     
        For i = .Count To 1 Step -1
            If .Item(i).PeriodYear = -1 Then .Remove i
        Next i
    End With

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    Hello,

    J'ai utilisé la méthode avec la variable '-1', c'est propre et ça marche très bien !

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Suppression d' éléments dans une liste.
    Par conan76 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/03/2007, 09h33
  5. Pouvoir gérer les actions des boutons dans une classe
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 08/07/2005, 12h08

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