Comparer des lignes avec différents critères croisés

Bonjour le forum,

J'aurais besoin de quelqu'un avec un peu plus de logique que moi :

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 :

 
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

Si quelqu'un pouvait m'aider, en ordonnant de manière plus censée les conditions peut être ou si quelqu'un a un code plus simple je suis preneur aussi

Merci pour votre aide

Bonjour

Tu devrais joindre un fichier "allégé". Tu aumenterais tes chances de réponses.

A +

Bonjour,

Ci-joint mon fichier "épuré".

Merci pour votre aide

Bonjour

Ci-joint un projet à tester

Avec les quelques données du document de base, il n’y a aucune ligne qui remplisse toutes les conditions, en particulier celles que j’ai pêché dans ton ancien code : ‘’VERIFIED’’ en colonne I et ‘’PENDIND MO’’ en colonne J.

Mais est-ce bien là les ’’valeurs définies’’ dont tu parles. Au besoin, tu pourras facilement les modier dans le code. Elles n’interviennent qu’une fois, à la 13° ligne en partant de la fin.

Bye

Bonjour,

Merci pour ta réponse.

Je vais tester ton code.

En effet, j'ai épuré rapidement les lignes car il y a des données sensibles, mais si cela ne fonctionne pas, je remettrai des lignes plus intéressantes pour pouvoir tester de façon plus efficace .

Bonne journée

Alors ton code marche très bien ,même si je t'avoue ne pas tout comprendre.

Mais il s'arrête à la ligne 500 ( sur 3000 ) sans raison.

Et pourrais tu rajouter les 3 autres conditions de critères stp ?

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

J'ai compris pourquoi il s'arrêtait, car il y avait 2 lignes vides au milieu des autres. Je les supprime et relance le test.

Bonjour

Tu m'as l'air d'aimer jouer aux devinettes

Tu écris :

Et pourrais tu rajouter les 3 autres conditions de critères stp ?

Quelles autres conditions ? Je n'en connais que 3 :

1 - La plus ancienne version (colonne L) de ID (colonne E)

2 - Contenu de la colonne I different de "VERIFIED"

3 - Contenu de la colonne J different de " NO PENDING"

Bye

Je suis un joueur invétéré c'est pour ça

Je suis conscient que je n'ai pas été assez clair.

En fait il y a 4 critères de sélection.

Comme "expliqué" dans le code fourni juste au dessus, je veux sélectionner les lignes dont :

Cells(ligne, 9) = "AFFIRMED_BO" And Cells(ligne, 10) = "PENDING_MO"

Cells(ligne, 9) = "VERIFIED" And Cells(ligne, 10) = "PENDING_MO" 

"VERIFIED_MO" And Cells(ligne, 10) = "PENDING_MO"

Cells(ligne, 9) = "CANCELED"

Voila les 4 "types " de ligne que je veux récupérer

Merci de ton aide.

Le code précédent marchait.

J'aurais juste du mal à aller modifier quelque chose dedans car je t'avoue ne pas tout comprendre.

Bonne journée

Bonjour

Voilà

Bye

Merci mais je ne comprends pas, il s'arrête encore à la ligne 584 alors qu'il y a plus de 3000 lignes :/

Si tu veux que je trouve pourquoi, envoie moi ton document avec au moins 585 lignes.

Bye

Hello !

J'ai oublié de vérifier le fichier source, il y avait des lignes vides à la ligne 585 . A chaque fois je me fais avoir !

Je te remercie, cela semble fonctionner. Mais il me manque toujours quelques lignes , je vais me pencher sur les critères.

Bonne journée.


Il semblerait qu'il y ait un petit souci sur les critères. Il faut qu'on sélection la ligne la plus vieille qui respecte les 2 critères en même sur leur colonne I et J . Il faut par exemple que

Cells(ligne, 9) = "VERIFIED" And Cells(ligne, 10) = "PENDING_MO"

Il ne faut pas l'un ou l'autre. Et ça pour les 4 cas

En cherchant le problème, j'ai vu des lignes qui vérifiaient

 Cells(ligne, 9) = "VERIFIED" 

Mais pas l'autre condition.

Bonjour

Sans le document où la macro bloque à la ligne 584, je ne vois pas comment t'aider.

La macro ne bloque plus, je parcours bien les 3000 lignes et j'ai presque toutes les bonnes lignes qui ressortent. Il y a juste un petit souci de critères. Il faut qu'ils soient validés sur les 2 colonnes, hors en analysant les résultats, certains ne remplissent qu'un des 2 critères, d'où ma question sur le code. Est-ce que l'on a bien renseigné les critères ?

Bonjour

Si tu ne m'envoie pas le document avec les lignes qui bloquent ou posent problème, je ne peux rien faire de plus.

Je suis désolé, je ne peux pas diffuser le document. Je t'envoie quand même un exemple de 2 opérations.

1ere feuille, nos données de base. 2eme feuille ce que l'on doit avoir. 3 eme feuille ce que l'on obtient avec ton code.

Bonjour la Machine

Essaie avec cette nouvelle version

bye

Je te remercie pour ton aide. Je te dirais demain si cela fonctionne

C'est extraordinaire ton code fonctionne Je te remercie 1000 fois.

Mais je vais abuser... mon employeur vient de me rajouter une contrainte. Penses tu que c'est faisable de rajouter une contrainte ?

Si dans la colonne 11 il y a CANCEL :

Cells(Lgn1, 10).Value = "CANCEL"

Il faut récupérer cette ligne en priorité ( elle écrase toutes les autres) .

Je suis vraiment désolé de cet ajout de derniène minute. Promis c'est le dernier

Bonjour la Machine

Qu"entends-tu par "en priorité " et "elle écrase toutes les autres" ?

La macro que je t'ai envoyée :

1 - passe toutes les lignes du tableau de Base et les copie à la suite dans le tabeau de Résultat si

* dans la colonne I on trouve "AFFIRMED_BO" et si dans la colonne J on trouve "PENDING_MO"

* dans la colonne I on trouve "VERIFIED" et si dans la colonne J on trouve "PENDING_MO"

* dans la colonne I on trouve "VERIFIED_MO" et si dans la colonne J on trouve "PENDING_MO"

* dans la colonne I on trouve "CANCELED"

2 - elle trie ces lignes recueillies, selon la valeur contenue dans la colonne E (1ère clé) et selon la valeur contenue dans la colonne L (2° clé)

3 - pour une même valeur contenue dans la colonne E ("ID") elle élimine les valeurs les plus élevées contenues dans la colonne L ("Version") et ne conserve que la plus petite.

4 - elle met en gras dans le tableau Base les lignes restantes dans le tableau Résultat

Que faut-il faire en plus ?

Sois précis s'il te plait.

Merci

Rechercher des sujets similaires à "comparer lignes differents criteres croises"