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 :

VBA comparaison de lignes avec plusieurs critères


Sujet :

Macros et VBA Excel

  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 VBA comparaison de lignes avec plusieurs critères
    Bonjour,
    Je vous explique le plus clairement possible ma situation :

    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 E), repérer la plus vieille ( celle qui a le numéro de version le plus petit ( plus petit chiffre dans la colonne L) à ce moment la mettre en gras, et enfin vérifier la valeur dans les colonnes I et J ( ces 2 colonnes doivent comporter une valeur définie ). Une fois toutes ces conditions remplies, j'aimerais importer les lignes qui vérifient toutes les conditions dans une 2 ème feuille.

    J'ai trouvé quelque chose. Mais j'ai relevé une erreur sur quelques 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 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 ?

    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
     
    Sub BrutOpModif()
    Dim m As Integer
    Dim Min 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         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
    Dans un second temps, une fois que j'ai récupéré une ligne valide ( critères colonnes I & J validés ) j'aimerai copier en feuille 2 toutes les lignes qui ont le même ID( pas uniquement la ligne sélectionnée).
    Merci pour votre aide

  2. #2
    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 mais attention, c'est une simple idée et je n'ai pas testée du tout car pas le temps pour ça maintenant :
    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
     
    Sub BrutOpModif()
     
        Dim Plage As Range
        Dim Cel As Range
        Dim CelTrouve As Range
     
        With ActiveSheet
     
            Set Plage = .Range(.Cells(1, 5), .Cells(.Rows.Count, 5).End(xlUp))
     
        End With
     
        For Each Cel In Plage
     
            Set CelTrouve = Plage.Find(Cel.Value, , xlValues, xlWhole)
     
            If Not CelTrouve Is Nothing Then
     
                If CelTrouve.Address <> Cel.Address Then
     
                    If CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "VERIFIED" And CelTrouve.Offset(, 5).Value = "PENDING_MO" Then ' et si ma version est la plus récente
                        'ici ta copie si ça correspond...
                    ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "AFFIRMED_BO" And CelTrouve.Offset(, 5).Value = "PENDING_MO" Then ' et si ma version est la plus récente
                        'ici ta copie si ça correspond...
                    ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "VERIFIED_MO" And CelTrouve.Offset(, 5).Value = "PENDING_MO" Then   ' et si ma version est la plus récente
                        'ici ta copie si ça correspond...
                    ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "CANCELED" Then  ' et si ma version est la plus récente
                        'ici ta copie si ça correspond...
                End If
     
            End If
     
        Next Cel
     
    End Sub
    Hervé.

  3. #3
    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
    Bonjour Theze,

    Merci pour ta réponse.

    J'ai voulu tester ta solution mais je ne trouve pas comment copier la ligne avec la façon donc tu 'parcoures' les cellules .

    J'ai testé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .CelTrouve.EntireRow.Copy Sheets("Feuil2").Rows(m)
    En déclarant m, mais cela ne fonctionne pas.

    Merci de ton aide.

  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
    Quelqu'un pour me renseigner svp ?

Discussions similaires

  1. Equivalent recherchev, sous vba, entre deux fichiers et avec plusieurs critères
    Par Gallinettechouette dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/07/2013, 13h01
  2. [XL-2003] Macro Supprimer ligne avec plusieurs critères
    Par lili189 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/08/2012, 15h45
  3. [Toutes versions] Requête vba avec plusieurs critères ?
    Par Duch9 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/02/2011, 12h35
  4. VBA-E Comment réaliser une recherche avec plusieurs critères ?
    Par Larsen21 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/12/2006, 13h43
  5. [DEBUTANT]comparaison une ligne avec un STRing
    Par Battosaiii dans le forum Langage
    Réponses: 2
    Dernier message: 05/05/2005, 20h15

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