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 :

Boucle For each qui ne s'arrête pas [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Février 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Boucle For each qui ne s'arrête pas
    Bonjour à tous
    Pour commencer, sachez que je ne suis pas un pro de la macro ni un habitué des forums mais voilà deux jours que je cherche une solution sur les sites sans trouver vraiment une réponse à mon problème !

    Aujourd'hui, je tente de faire une boucle sur une colonne pour effacer les doublons en (conservant le premier) : tout se passe bien au niveau de l'action mais je dois faire une erreur puisque ma boucle "For each" ne s'arrête pas à la fin de ma liste. Quelqu'un peut-il me dire où est cette erreur ? (mon code -ci-joint- n'est peut-être pas "très propre" non plus... !).

    Je suis preneur de toutes vos suggestions et vous remercie par avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Le plus simple c'est de laisser Excel se débrouiller avec les doublons :

    Tu utilises un Filtre avancé (élaboré) avec Extraction sans doublon avec copie sur autre feuille.

    D'une manière plus générale, la seule manière d'effacer des lignes par VBA, c'est de la faire de bas en haut.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Février 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut L'utilisateur final ne visualisera pas ce tableau...
    Bonjour et merci pour cette réponse.
    Ce tableau (aujourd'hui 6882 lignes / 284 colonnes) n'est pas destiné à être ouvert par un utilisateur c'est pourquoi il me faut le traiter en VBA.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    N'ouvrant pas les pj je ne vois pas ton code donc voila une proposition de solution.

    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
    Sub test()
     
    'On trouve la dernière ligne lors du lancement.
    derligne = Range("A" & Rows.Count).End(xlUp).Row
     
    For i = 1 To derligne
     
    'on récupère ici A1
    variable = Cells(i, 1)
     
    'la premiere ligne A = "" sortira de la boucle.
    'je n'ai pas de ligne vide dans ma colonne mais comme je vais supprimer des lignes
    'la ligne de fin va bouger
    If variable = "" Then Exit Sub
     
    'Je fais un index pour reprendre là ou la boucle s'arrete quand je supprime une ligne
    IndexJ = 1
     
    'utilisation de Goto... on pourrait utiliser While index < XXXX mais bon...
    line1:
     
    'je refais mon caclule de la derniere ligne ici car ça bouge lors des suppressions.
    derligne2 = Range("A" & Rows.Count).End(xlUp).Row
     
     
        For j = IndexJ To derligne2
     
        'Si I=J je sors, sinon il pourrait supprimer la valeur lors de la première rencontre
        If j <> i And Cells(j, 1).Value = variable Then
            Range("" & j & ":" & j & "").Select
            Selection.Delete Shift:=xlUp
            IndexJ = j
            GoTo line1 'on relance la boucle "J" en reprenant en départ la ligne que je viens de supprimer
        End If
     
        Next j
     
     
    Next i
     
    End Sub
    Bon le code n'est pas terrible et devrait être utilisé avec un While.... Wend... au lieu du GoTo.
    Loi de l’Inertie de la Programmation de Dijkstra
    Si vous ne savez pas ce que votre programme est censé faire, vous feriez bien de ne pas commencer à l’écrire.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Franchement, à part l'aspect apprentissage VBA de ce type de code, ça va être lent et assez difficile à maintenir. Donc oui, je supporte un point de vue plus structuré pour ce type de demande:

    1. Passer par un filtre (cf réponse du Maître)
    2. Utiliser nativement le removedupplicate du VBA (le faire par Excel et enregistrement macros si besoin)

    C'est en général un facteur 10 à 30 en terme de rapidité.
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne peux qu'abonder dans le sens de Clément et Vinc_bilb

    Petit exemple de code qui copie la colonne 9 de la liste de données commençant en cellule A1 de la feuille nommée db vers la 2ème colonne à droite de la liste et ce en conservant les valeurs uniques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub t()
     Dim rng As Range
     Set rng = ThisWorkbook.Worksheets("db").Range("A1").CurrentRegion
     With rng ' Filtre sur la 9ème colonne
     .Columns(9).AdvancedFilter xlFilterCopy, copytorange:=.Offset(0, .Columns.Count + 1).Resize(1, 1), Unique:=True
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Est-ce que tu n'aurais pas copier un truc dans toute la colonne G qui fasse que le End(xlUp) ne chope que la dernière case (et le traitement d'un million de cellules, ça peut être long, surtout avec des Select partout et une boucle à l'intérieur).

    Un autre truc très bizarre dans ton code : tu utilises Cell comme variable de ton For Each mais tu n'utilises nulle part cette variable à l'intérieur.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  8. #8
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Février 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci à tous de votre participation.

    Je me permets de vous transférer le code (Merci à Roger2327) (beaucoup plus clean que le mien) qui fait exactement ce que je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub EffaceDoublons()
    Dim Cell As Range, donnée1 As String
        For Each Cell In Sheets("Feuil1").Range("F6:F" & Range("G1048576").End(xlUp).Row)
            If Cell.Value = donnée1 Then Cell.Clear Else donnée1 = Cell.Value
        Next
    End Sub
    Bonne journée.

    ps : Je voudrais bien marquer ce post comme "résolu" mais je ne vois pas de bouton me permettant de le faire à partir de cette fenêtre

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

Discussions similaires

  1. Boucle for qui ne s'arrête pas
    Par Cha_rline dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/11/2015, 13h23
  2. [Débutant] Boucle For Each Cell qui ne fonctionne pas
    Par FTMFB dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/11/2015, 17h23
  3. [AC-2003] Boucle for each qui parcourt une liste
    Par caesar23 dans le forum IHM
    Réponses: 2
    Dernier message: 10/06/2010, 14h48
  4. un For Each qui ne fonctionne pas avec une collection maison !
    Par grenouillesiverte dans le forum Windows Forms
    Réponses: 7
    Dernier message: 01/09/2007, 21h00
  5. [VBA-E]une boucle qui ne s'arrète pas
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/02/2006, 18h05

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