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 :

Boucles imbriquées très simples : ne fonctionne pas


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 31
    Points : 24
    Points
    24
    Par défaut Boucles imbriquées très simples : ne fonctionne pas
    Bonjour à tous,

    Je cherche à construire une procédure me permettant de parcourir les données d'une feuille Excel ("Anakr") de 17 colonnes et 5869 lignes, et de repérer les doublons sur les 2 premières colonnes (nom et prénom). Quand je dis doublon, il peut y avoir 5 fois la même (pas limité à 2)

    Je souhaite que cette procédure coupe-colle dans une autre feuille ("DoublonAnak") les lignes entières (17 colonnes) correspondant à un doublon les une en dessous des autres (variable actueldanak pour incrémenter le numéro de ligne d'écriture). Cette procédure doit finir par couper-coller la ligne initiale à l'orgine du doublon.

    La macro dure longtemps et ne marche pas. Même sur un test basique (je créé exprès deux lignes identiques)...

    Avez-vous une idée du souci ?

    Merci d'avance

    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
     
     
    ' Initialisation des variables
     
    actueldanak = 1
    detecteur = 0
     
    ' Boucle 1
     
    For anak = 2 To 5869
    Sheets("Anakr").Select
    nomanak = Trim(Sheets("Anakr").Cells(anak, 1).Value)
    prenomanak = Trim(Sheets("Anakr").Cells(anak, 2).Value)
     
     
     
    If IsEmpty(Sheets("Anakr").Cells(anak, 1)) = true  Then 
     
    ' Boucle 2
     
        For anak2 = 2 To 5869
     
            If anak <> anak2 Then
     
                Sheets("Anakr").Select
                nomanak2 = Trim(Sheets("Anakr").Cells(anak2, 1).Value)
                prenomanak2 = Trim(Sheets("Anakr").Cells(anak2, 2).Value)
     
     
                    If nomanak = nomanak2 And prenomanak = prenomanak2 Then
     
                    Sheets("Anakr").Select
                    Range(Cells(anak2, 1), Cells(anak2, 17)).Select
                    Selection.Cut
     
                    Sheets("DoublonAnak").Select
                    Range(Cells(actueldanak, 1), Cells(actueldanak, 1)).Select
                    ActiveSheet.Paste
     
                    actueldanak = actueldanak + 1
                    detecteuranak = 1
                    End If
     
     
            End If
     
     
        Next
     
        If detecteuranak = 1 Then
                    Sheets("Anakr").Select
                    Range(Cells(anak, 1), Cells(anak, 17)).Select
                    Selection.Cut
     
                    Sheets("DoublonAnak").Select
                    Range(Cells(actueldanak, 1), Cells(actueldanak, 1)).Select
                    ActiveSheet.Paste
     
                    actueldanak = actueldanak + 1
                    detecteuranak = 0
        End If
     
    End If
     
    Next

  2. #2
    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 974
    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 974
    Points : 29 003
    Points
    29 003
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    La lecture de ce didacticiel sur la gestion des doublons et tout particulièrement le chapitre des macros, te sera d'un grand secours.
    Si tu gères cela en mémoire, tu devrais arriver à un temps d'exécution de 2 à 4 minutes de traitement grand maximum.

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Une piste :
    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
     
    Sub Doublons()
     
        Dim Dico As Object
        Dim Plage As Range
        Dim I As Long
        Dim Critere As String
     
        'feuille sur laquelle effectuer la recherche de doublons
        With Worksheets("Anakr")
     
            Set Plage = .Range(.[A1], .[A65536].End(xlUp))
     
        End With
     
        'création du dictionnaire
        Set Dico = CreateObject("Scripting.Dictionary")
     
        'parcour la plage à l'envers pour pouvoir supprimer les lignes
        For I = Plage.Count To 1 Step -1
     
            'concatène le nom et prénom
            Critere = Plage(I).Value & Plage(I).Offset(0, 1).Value
     
            'si pas dans le dico, le rajoute
            If Dico.exists(Critere) = False Then
     
                Dico.Add Critere, Critere
     
            Else
     
                'dans le cas contraire, copie la ligne entière
                'dans la feuille "DoublonAnak" et supprime le doublon
                With Worksheets("DoublonAnak")
     
                    If .Range("A1") = "" Then
     
                        Plage(I).EntireRow.Copy .Range("A1")
     
                    Else
     
                        Plage(I).EntireRow.Copy .Range("A" & .[A65536].End(xlUp).Row + 1)
     
                    End If
     
                    Plage(I).EntireRow.Delete
     
                End With
     
            End If
     
        Next I
     
    End Sub
    Hervé.

Discussions similaires

  1. Calculs simples ne fonctionnent pas
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 17/01/2014, 11h45
  2. Réponses: 8
    Dernier message: 17/03/2011, 10h16
  3. Pourquoi ce formulaire simple ne fonctionne pas ?
    Par mcog2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 06/04/2010, 12h17
  4. XHTML -> XSL -> XML, même le plus simple ne fonctionne pas !
    Par Zulie494 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/11/2008, 17h38
  5. boucle if-then qui ne fonctionne pas
    Par les4c77 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/09/2007, 17h24

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