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

VBA Discussion :

Comparer des cellules puis les trier


Sujet :

VBA

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Comparer des cellules puis les trier
    Bonjour,

    Ma demande est un petit peu complexe, j'espère que je serais suffisamment clair.

    J'ai un fichier avec 3000 lignes. Je veux pouvoir comparer des lignes entre elles, "récupérer" celles qui ont le même id ( colonne D), repérer la plus vieille ( celle qui a le numéro de version le plus petit ( plus petit chiffre dans la colonne L), et enfin vérifier la valeur dans les colonnes I et J ( ces 2 colonnes doivent comporter une valeur définie ).

    A ce moment là, il faudrait mettre en gras la ligne avec le numéro de version le plus petit.

    J'ai du mal à visualiser comment réussir à comparer les lignes de même ID entre elle, et sélectionner celle qui a le numéro de version le plus petit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    nbcolonne1 = Sheets("Feuil1").UsedRange.Columns.Count 'compte le nombre de colonnes non vides sur la feuille 1
    nbligne1 = Sheets("Feuil1").UsedRange.Rows.Count 'compte le nombre de lignes non vides sur la feuille 1
    Sheets("Feuil1").Activate
    For i = 2 To nbligne1
    While Sheets("Feuil1").Cells(i, 5).Value = Sheets("Feuil1").Cells(i+1, 5).Value
     
    Wend
     
    Next
    J'ai un souci de logique à ce moment là, je ne sais pas s'il faut mettre un If ou while. Car une fois qu'on a repéré des lignes aux mêmes id( colonne 5), comment comparer à ce moment là, la version la plus récente ( valeur de la colonne 12 la plus petite ? )

    Je ne sais pas si j'ai été assez clair, dans tous les cas merci pour votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    Passioné
    Inscrit en
    Août 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passioné
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 82
    Points : 116
    Points
    116
    Par défaut
    Le code que tu as démarré laisse supposer que tes ID en double se suivent et qu'il y en a 2 maxi. Est-ce bien le cas ?

    Si c'est le cas, le code suivant devrait fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    For i = 2 To nbligne1
         If Cells(i, 5).Value = Cells(i+1, 5).Value Then
     
              If Cells(i, 12).Value < Cells(i+1, 12).Value Then
                   Cells(i,12).Select
                   Selection.Font.Bold = True
                   Else:
                   Cells(i+1,12).Select
                   Selection.Font.Bold = True
              End if
     
         End if
    Next

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    UsedRange ne permet pas de connaître le nombre de lignes ou de colonnes remplies.

    Il n'est pas nécessaire de sélectionner les lignes pour les traiter

    Précise ta version d'Excel

    Je présume que tes données pourraient être mises en tableau de données (2007-2010) ou en liste (2003). Ces outils permettent de manipuler un ListObject en VBA et il est plus simple d'en définir les limites

    Si, comme ffdream62 le présume, tes données se suivent pas ID (ou que tu les as triées), alors, va au bout de ton raisonnement et trie sur D ET sur L. La première ligne de chaque ID sera forcément celle qui a le plus petit numéro de version.

    Tu ne dis pas quelles sont les valeurs à tester en I et J

    Tu serais bien inspiré de t'aider de la mise en forme conditionnelle, ce qui éviterait la boucle et pourrait même éviter le VBA. Si VBA obligatoire pour automatisation, ce serait plus simple à manipuler.

    La conclusion est dans ma signature: Si tu fais du VBA pour Excel...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Oui j'ai trié mes colonnes pour que les ID identiques se suivent. Les critères dans les colonnes I & J doivent être égaux à une chaine de caractère . Ci-joint mon code :
    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
     
    Sub BrutOpModif()
    Dim m As Integer
    Dim Min As Integer
    'Dim minn As Integer
    Dim Maligne As Integer
     
    m = 2
     
    nbcolonne1 = Sheets("Feuil1").UsedRange.Columns.Count 'compte le nombre de colonnes non vides sur la feuille 1
    nbligne1 = Sheets("Feuil1").UsedRange.Rows.Count 'compte le nombre de lignes non vides sur la feuille 1
     
    For ligne = 2 To nbligne1
        If ligne = 2 Then 'Je ne comprends pas cette condition. Ca veut dire qu'elle n'est valable que la 1ere fois ?
            Min = Cells(ligne, 12) ' ?
            Maligne = ligne
        Else
        If Cells(ligne, 5) = Cells(ligne - 1, 5) Then 'Si l'id est égal à l'id d'avant
            If Cells(ligne, 12) < Min And Cells(ligne, 9) = "VERIFIED" And Cells(ligne, 10) = "PENDING_MO" Then ' et si ma version est la plus récente
                Min = Cells(ligne, 12).Value 'alors on incrémente le min
                Maligne = ligne             ' et on prend le numéro de ligne
            ElseIf Cells(ligne, 12) < Min And Cells(ligne, 9) = "AFFIRMED_BO" And Cells(ligne, 10) = "PENDING_MO" Then ' et si ma version est la plus récente
                Min = Cells(ligne, 12).Value 'alors on incrémente le min
                Maligne = ligne             ' et on prend le numéro de ligne
            ElseIf Cells(ligne, 12) < Min And Cells(ligne, 9) = "VERIFIED_MO" And Cells(ligne, 10) = "PENDING_MO" Then ' et si ma version est la plus récente
                Min = Cells(ligne, 12).Value 'alors on incrémente le min
                Maligne = ligne             ' et on prend le numéro de ligne
            ElseIf Cells(ligne, 12) < Min And Cells(ligne, 9) = "CANCELED" Then  ' et si ma version est la plus récente
                Min = Cells(ligne, 12).Value 'alors on incrémente le min
                Maligne = ligne             ' et on prend le numéro de ligne
            End If
        Else
            Rows(Maligne).Font.Bold = True 'On met ensuite la ligne en gras. Mais ici,cela va mettre en gras chaque ligne dont la version est inférieure. S'il y a 6,5,4,3,2 par exemple dans la colonne 12 , dans cet ordre, les 5 lignes vont être en gras
            Min = Cells(ligne, 12).Value
            Maligne = ligne
        End If
        End If
    Next
     
    For ligne = 2 To nbligne1
     
     
     
            If Cells(ligne, 9) = "VERIFIED" And Cells(ligne, 10) = "PENDING_MO" And Rows(ligne).Font.Bold = True Then ' si ces 2 critères sont validés
            Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
            m = m + 1
            ElseIf Cells(ligne, 9) = "AFFIRMED_BO" And Cells(ligne, 10) = "PENDING_MO" And Rows(ligne).Font.Bold = True Then  ' si ces 2 critères sont validés
            Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
            m = m + 1
            ElseIf Cells(ligne, 9) = "VERIFIED_MO" And Cells(ligne, 10) = "PENDING_MO" And Rows(ligne).Font.Bold = True Then   ' si ces 2 critères sont validés
            Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
            m = m + 1
            ElseIf Cells(ligne, 9) = "CANCELED" And Rows(ligne).Font.Bold = True Then   ' si ces 2 critères sont validés
            Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
            m = m + 1
            ElseIf Cells(ligne, 10) = "CANCEL" And Rows(ligne).Font.Bold = True Then   ' si ces 2 critères sont validés
            Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
            m = m + 1
            End If
     
     
     
     
    Next
     
    End Sub
    Pierre, je veux bien en savoir un peu plus sur la forme conditionnelle. Je n'arrive pas à trier les ID PUIS les numéros de version ( colonne L ).

    Le code ci-dessus fonctionne mais j'ai un souci sur 1 ou 2 cas particuliers :
    Imaginons une ligne avec un ID : 2 , version 2 , et les critères non vérifiés dans les colonnes I et J. Si la ligne suivante j'ai un ID : 2, version 3 mais les critères vérifiés, il ne la prendra pas alors que c'est cette 2 ème ligne que je veux. J'ai besoin de récupérer la ligne la plus ancienne (numéro de version le plus petit ) dont les critères sont vérifiés.
    Comment réussir à filtrer ce cas particulier ?

    PS : Excel 2003

Discussions similaires

  1. comparer des cellules entre 2 fichiers differents
    Par drabmol dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/11/2007, 20h25
  2. Colorier des cellules en les comparants avec d'autres
    Par andre55 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/09/2007, 11h52
  3. [VBA-E] Copier des cellules et les coller ?
    Par Trooper2 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/01/2007, 17h29
  4. [VBA-E] Comparer des cellules
    Par lutin06 dans le forum Macros et VBA Excel
    Réponses: 34
    Dernier message: 28/04/2006, 16h24
  5. [VBA-E] Comparer des cellules
    Par lutin06 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/04/2006, 10h22

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