VBA excel 2003 comparaison de lignes multiples critères

klissou69 Messages postés 61 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

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.

On m'a proposé le code suivant. Mais j'ai un souci au moment de la copie :" Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille " ce n'est pas la bonne syntaxe je pense .

Quelqu'un pourrait -il me renseigner ?

 
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
                    Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
             m = m + 1
                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
                    Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
             m = m + 1
                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
                    Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
             m = m + 1
                ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "CANCELED" Then  ' et si ma version est la plus récente
                    Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
             m = m + 1
            End If
 
        End If
 
    Next Cel
 
End Sub


14 réponses

Résumé de la discussion

Un utilisateur veut comparer des lignes par identifiant en colonne E, repérer la plus vieille version selon L, vérifier I et J et importer les lignes correspondantes dans une seconde feuille.
Plusieurs propositions de code s'appuient sur une macro qui compare les valeurs en E, sélectionne la plus ancienne selon L et copie les lignes vers Feuil2 après vérification des colonnes I et J.
Des interventions proposent de corriger la syntaxe de copie vers Feuil2 et d'utiliser Find pour gérer les lignes déjà présentes, via une fonction VerifieColIetJ pour I et J.
Si des accrocs apparaissent, les échanges soulignent l'importance d'initialiser des compteurs et de prévoir des cas où une même E peut recouvrir plusieurs versions.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. melanie1324 Messages postés 1561 Statut Membre 156
     
    Coucou,

    oui, il y a un prolbème, remplace :

    Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille

    par :
    Sheets("Feuil1").Rows(ligne).Copy
    Sheets("Feuil2").Rows(m).select
    Activesheet.paste

    et ca devrait marcher!
    0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    Apparemment, la variable m n'a pas été initialisé au départ et tu as la valeur de m dans ta ligne
    à moins que....
    sinon, ta syntaxe de la ligne est la meilleure
    0
  3. klissou69 Messages postés 61 Statut Membre
     
    @ Melanie1234 : Je vais tester ça de ce pas
    @michel_m : je t'avoue que ce code m'a été proposé. Je ne maîtrise pas encore les with , .cells()

    J'avais testé mon code a moi qui fonctionnait, mais il y avait des erreurs sur certains cas particuliers.

    @ tous les 2 : Merci pour vos réponses
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Je ne t'ai pas parlé de with, cells()......????

      si tu démarres tes copies ligne 2 de la feuille 2
      m=1
      For Each Cel In Plage

      ......


      si tu démarrestes copies ligne 1de la feuille 2

      tu implémentes avant
      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
                           m=m+1
                          Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
                         etc.


      et peut-être (je ne connais ton contexte)
      If CelTrouve.Address <> Cel.Address Then
             M=M+1
                If CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "VERIFIED" And CelTrouve.Offset(, 5).Value = "PENDING_MO" Then   
               Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m)
      
               ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "AFFIRMED_BO" And CelTrouve.Offset(, 5).Value = "PENDING_MO" Then
               Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m)
      
              etc...
      
      0
    2. klissou69 Messages postés 61 Statut Membre
       
      les with, cells() dont je parlais sont ceux dans le code que je proposais et que je ne maitrise pas...
      Oui je vois pour l'initialisation du m, mais c'est la variable ligne qui me pose un souci :
      Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m)

      (il m'affiche un message d'erreur sur cette ligne )
      comme je l'ai fait remarquer je ne vois pas comment l'initialiser et récupérer la ligne de la cellule comparée dans <code>CelTrouve.Offset(, 5).Value<code>
      0
  4. klissou69 Messages postés 61 Statut Membre
     
    oui j'ai peut être un souci avec mes variables, je ne déclare pas m ni ligne.
    Mais comment récupérer le numéro de ma ligne qui m'intéresse et la glisser dans la variable ligne justement ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. klissou69 Messages postés 61 Statut Membre
     
    @melanie1234 : J'ai remplacé comme tu m'avais dit mais je ne vois pas comment récupérer ma ligne . Pourrais tu m'aiguiller stp ?

    j'essaie d'initialiser ma variable et de l'affecter à la ligne de la cellule trouvée mais cela ne fonctionne pas :
     Dim m As Double
        Dim ligne As Double
        m = 0
    
                        ligne = CelTrouve.Rows
                        Sheets("Feuil1").Rows(ligne).Copy
                        Sheets("Feuil2").Rows(m).Select
                        ActiveSheet.Paste
    
                        m = m + 1
    
    0
  7. melanie1324 Messages postés 1561 Statut Membre 156
     
    Coucou

    Pour info m est le numéro de ligne de ta feuille 2 donc si tu mets 0, il va copier à la ligne 0 la première fois==> ce quie st impossible.

    Parce qu'il faut que tu mettes m=1 et ca marchera.

    Donc ton code donne :

    Sub BrutOpModif()

    Dim Plage As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    m = 1
    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
    Sheets("Feuil1").Rows(ligne).Copy
    Sheets("Feuil2").Rows(m).select
    activesheet.paste
    sheets("Feuil1).select 'Alors on copie la ligne dans la 2eme feuille
    m = m + 1
    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
    Sheets("Feuil1").Rows(ligne).Copy
    Sheets("Feuil2").Rows(m).select
    activesheet.paste
    sheets("Feuil1).select
    'Alors on copie la ligne dans la 2eme feuille
    sheets("Feuil1").select
    m = m + 1
    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
    Sheets("Feuil1").Rows(ligne).Copy
    Sheets("Feuil2").Rows(m).select
    Activesheet.paste
    'Alors on copie la ligne dans la 2eme feuille
    m = m + 1
    ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "CANCELED" Then ' et si ma version est la plus récente
    Sheets("Feuil1").Rows(ligne).Copy
    Sheets("Feuil2").Rows(m) .select
    Activesheet.paste'Alors on copie la ligne dans la 2eme feuille
    sheets("Feuil1").select
    m = m + 1
    End If

    End If

    Next Cel

    End Sub

    Mélanie
    0
  8. klissou69 Messages postés 61 Statut Membre
     
    Oui pardon j'avais oublié d'initialiser ma variable "m".

    Mais il y a le souci de la variable "ligne" maintenant .
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,
      Ligne=celtrouve.row

      au passage:
      Evite au maximum
      les systèmes
      select puis copy puis select puis activesheet.paste !!!

      c'est très lent et ca sent la copie bête de l'enregistreur de macro !
      0
  9. klissou69 Messages postés 61 Statut Membre
     
    Bonjour Michel.

    Que me proposes tu de faire pour remplacer mes select/copy / paste ?

    J'ai suivi ton conseil pour
     Ligne=celtrouve.row 


    Mais j'ai toujours une erreur au niveau de ma ligne :
    Sheets("Feuil1").Rows(Ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
    


    Sub BrutOpModif()
    
    Dim Plage As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    m = 1
    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
                            Ligne = CelTrouve.Row
                            Sheets("Feuil1").Rows(Ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
                            m = m + 1
                    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
                    Ligne = CelTrouve.Row
    
                    Sheets("Feuil1").Rows(Ligne).Copy
                    Sheets("Feuil2").Rows(m).Select
                    ActiveSheet.Paste
                    'Alors on copie la ligne dans la 2eme feuille
                    Sheets("Feuil1").Select
                    m = m + 1
                    
                    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
                    Ligne = CelTrouve.Row
                    Sheets("Feuil1").Rows(Ligne).Copy
                    Sheets("Feuil2").Rows(m).Select
                    ActiveSheet.Paste
                    'Alors on copie la ligne dans la 2eme feuille
                    m = m + 1
                    
                    ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "CANCELED" Then ' et si ma version est la plus récente
                    Ligne = CelTrouve.Row
                    Sheets("Feuil1").Rows(Ligne).Copy
                    Sheets("Feuil2").Rows(m).Select
                    Sheets("Feuil1").Rows(Ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
                    m = m + 1
                    
                    End If
                
                End If
            End If
    Next Cel
    
    End Sub
    
    
    
    
    
    0
  10. klissou69 Messages postés 61 Statut Membre
     
    coucou Melanie,

    Merci pour ta réponse.

    J'ai testé ton code et il me dit qu'il y a une erreur justement sur la ligne :

    Sheets("Feuil2").Rows(m).Select 'Alors on copie la ligne dans la 2eme feuille
    
    0
  11. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour tout le monde,

    @ klissou69 : sois plus précis sur ce forum. "J'ai un message d'erreur sur cette ligne" ne suffit généralement pas à obtenir une réponse adaptée. Donne nous également le message d'erreur complet.

    @ Michel_m : salut! Comment va?

    @Mélanie :
    je ne sais pas remplacer le activesheet.paste par autre chose même si je sais que c'est lourd, si tu as une suggestion, je suis à l'écoute.
    La bonne syntaxe est celle proposée dès le début.
    Range(acopier).copy Range(oucoller)
    Avec un espace entre les deux range.
    Ce qui, dans le cas d'aujourd'hui, nous donne :
    Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m)

    Si cela ne "passe" pas, on peut utiliser la feuille "ou coller" dans un bloc with end with. A ce moment là, il ne faut pas oublier le point devant le range qui s'y rapporte :
    With Sheets("Feuil2")
        Sheets("Feuil1").Rows(ligne).Copy .Rows(m)
    End With

    S'il y a toujours une erreur c'est que :
    1- la feuille "Feuil2" ne s'appelle pas comme ça, tenter de vérifier s'il n'y a pas un espace "viscieux" après le 2, du genre : "Feuil2 " ou " Feuil2" ou "Feuil 2"...
    2- il n'y a pas de ligne m dans la feuille 2... Sissi c'est possible si m = -3...
    3- il n'y a pas, dans le classeur concerné de :
    - Feuil1
    - Feuil2
    etc.......
    0
  12. klissou69 Messages postés 61 Statut Membre
     
    Tout d'abord pour vos réponses et désolé pour mes imprécisions .

    1ère nouvelle bonne nouvelle cela fonctionne :)

    Malheureusement il n'affiche que 11 résultats ( au lieu de 138 ), alors que le filtre est bon ( les différents critères type :
    If CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "VERIFIED" And CelTrouve.Offset(, 5).Value = "PENDING_MO" Then
    sont corrects.

    Je ne comprends donc pas pourquoi il ne prend pas les autres lignes qui 'correspondent '.

    Ci-joint mon code du moment :

    Sub BrutOpModif()
    
    Dim Plage As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    m = 1
    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
                        ligne = CelTrouve.Row
                        
                        Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m)
                        m = m + 1
                        Sheets("Feuil1").Select
                        
                        
                    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
                        ligne = CelTrouve.Row
                        
                        Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
                        m = m + 1
                        Sheets("Feuil1").Select
                        
                        
                    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
                        ligne = CelTrouve.Row
                        
                        Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
                        m = m + 1
                        Sheets("Feuil1").Select
                        
                       
                        
                    ElseIf CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "CANCELED" Then ' et si ma version est la plus récente
                        ligne = CelTrouve.Row
                        
                        Sheets("Feuil1").Rows(ligne).Copy Sheets("Feuil2").Rows(m)
                        m = m + 1
                        Sheets("Feuil1").Select 'Alors on copie la ligne dans la 2eme feuille
                        
    
                    End If
    
                End If
            End If
    Next Cel
    
    End Sub
    
    
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Je ne comprends donc pas pourquoi il ne prend pas les autres lignes qui 'correspondent '. 


      Parce que ta macro, excuse le terme, c'est du charabia...

      Décris nous exactement ce qu'elle est censée faire.
      0
  13. klissou69 Messages postés 61 Statut Membre
     
    Y a pas de soucis moi je réexplique autant de fois que tu veux.

    J'ai une feuille 1 de 3000 lignes . Il faut que je compare les lignes entre elles selon leurs id ( colonne E). Toutes celles qui ont le même id je les compare entre elle. Une fois ce premier critère validé, il faut que je récupère la ligne qui a le numéro de version le plus petit ( colonne L ) dont les critères des colonnes I et J vérifient les conditions citées plus haut : VERIFIED MO , PENDING MO etc...

    Pour résumer, on compare les id, puis ceux ayant le même id on vérifie leur critères, une fois qu'on a récup les critères valables, il faut identifier la version la plus vieille .
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Alors, sans garantie car je l'ai codé "à la volée" ici même, test ce code [que je n'ai pas testé moi-même!!]. Je l'ai commenté...
      En fait le code procède comme ceci :
      Pour toutes les cellules de la plage E1:EdernièreLigne
      1- si col I = VERIFIED et Col J = PENDING_MO alors
      2- On cherche, dans la feuille 2 colonne E si la valeur contenue Feuil1E est présente
      3- si elle est présente (en gros ça veut dire qu'on l'a déjà copiée) alors elle teste si la colonne L est supérieure.
      4- si oui, elle remplace
      5- si non, elle ne fait rien.
      6- Si la valeur n'est pas présente en Feuil2, alors elle copie la ligne...

      Sub BrutOpModif()
      Dim Plage As Range
      Dim Cel As Range
      Dim CelTrouve As Range
      Dim m As Long
      
      m = 2
      With Sheets("Feuil1")
          Set Plage = .Range(.Cells(1, 5), .Cells(.Rows.Count, 5).End(xlUp))
      End With
      With Sheets("Feuil2")
          For Each Cel In Plage 'pour toutes les cellules Feuil1 Col E
              'Si on a VERIFIED col I et PENDING_MO Col J alors
              If Cel.Offset(0, 4).Value = "VERIFIED" And Cel.Offset(0, 5).Value = "PENDING_MO" Then
                  'on cherche, Feuil2 Col E si la valeur existe déjà (ligne déjà copiée)
                  Set CelTrouve = .Columns(5).Cells.Find(Cel.Value, lookin:=xlvalues, lookat:=xlwhole)
                  'Si la valeur existe (ligne préalablement copiée) 
                  If Not CelTrouve Is Nothing Then
                      'on compare les valeurs Col L Feuil2 et Feuil1
                      If CelTrouve.Offset(0, 7).Value < Cel.Offset(0, 7).Value Then
                          'On copie Feuil1 en Feuil2 si L est plus grand
                          Sheets("Feuil1").Rows(Cel.Row).Copy .Rows(CelTrouve.Row)
                      End If
                  Else 'Si par contre la valeur n'existe pas Feuil2
                      'alors on la copie colle
                      Sheets("Feuil1").Rows(Cel.Row).Copy .Rows(m)
                      m = m + 1
                  End If
              End If
          Next Cel
      End With
      0
    2. klissou69 Messages postés 61 Statut Membre
       
      Bonjour Pijaku, ton code marche très bien , je te remercie, j'ai les lignes correspondantes qui sortent. Pourrait on rajouter 4 critères je te prie ?
      Il faudrait faire ressortir les lignes les plus anciennes pour chaque 'id' dont les colonnes contiennent les valeurs suivantes :

      VERIFIED_MO col I et PENDING_MO Col J
      AFFIRMED_BO col I et PENDING_MO Col J
      CANCELLED col I
      CANCEL col J

      Du coup j'ai rajouté ces conditions à la ligne :
      (Cel.Offset(0, 4).Value = "VERIFIED" And Cel.Offset(0, 5).Value = "PENDING_MO") Or (Cel.Offset(0, 4).Value = "VERIFIED_MO" And Cel.Offset(0, 5).Value = "PENDING_MO") Or (Cel.Offset(0, 4).Value = "AFFIRMED_MO" And Cel.Offset(0, 5).Value = "PENDING_MO") Or (Cel.Offset(0, 4).Value = "CANCELED") Or (Cel.Offset(0, 5).Value = "CANCEL")


      Mais il me manque quelques lignes. Les critères sont bons comme je les ais écrit ?
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut,

      D'où l'inconvénient de ne pas exposer clairement son problème dès le départ...

      D'autres auraient abandonné (à juste titre) à ce moment.

      Je vais tenter de continuer.

      Par contre, je ne comprends rien de rien à ce que tu souhaites maintenant. Faut que tu ré-explique tout depuis le début.
      0
    4. klissou69 Messages postés 61 Statut Membre
       
      Je ne vois pas comment exposer le problème plus clairement mais je vais tenter une nouvelle fois. Le résultat est bon, c'est cela que je veux . Mais il y a un cas particulier qui m'embête et qui doit être à l'origine de "l'oubli " de quelques lignes. Imaginons une ligne au début dont la version est 1 ( la plus vieille possible) mais dont les critères ne sont pas respectés ( ni verified col I ni pending_mo col J ) etc, la ligne va quand même être sélectionnée étant donnée qu'elle a le numéro de version le plus vieux ( 1 ) .

      Voila je pense avoir résumé le plus clairement possible, si tu n'y vois toujours pas plus clair c'est que je ne résoudrai pas ce problème donc tu peux abandonner ;)

      Merci pour ton aide en tout cas.

      A titre indicatif voici le code que j'avais crée au tout début, qu'on m'a reproché d'être scolaire, sale etc, mais il fonctionnait de la même façon que le tien. Seul hic, comme énoncé précédemment, si une version antérieure était détectée au début, elle était conservée alors qu'elle n'était pas "valable" ( critères non respectés ).

      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
      
      
      0
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      C'est ça que je ne peux pas comprendre :
      Imaginons une ligne au début dont la version est 1 ( la plus vieille possible) mais dont les critères ne sont pas respectés ( ni verified col I ni pending_mo col J ) etc, la ligne va quand même être sélectionnée étant donnée qu'elle a le numéro de version le plus vieux ( 1 ) .
      Dans mon code, cette ligne (si ni verified col I ni pending_mo col J) n'est pas copiée...
      Si tu veux qu'elle le soit, faut ajouter un test. Tu dis...
      0
  14. melanie1324 Messages postés 1561 Statut Membre 156
     
    bonjour,

    parce quil subsiste une petite erreur , remplace ton code par :

    Sub BrutOpModif()

    Dim Plage As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    m = 1
    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
    Ligne = CelTrouve.Row
    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").Rows(m).select 'Alors on copie la ligne dans la 2eme feuille
    Activesheet.paste
    sheets("Feuil1").select
    m = m + 1
    Else
    If 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
    Ligne = CelTrouve.Row

    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").Rows(m).Select
    ActiveSheet.Paste
    'Alors on copie la ligne dans la 2eme feuille
    Sheets("Feuil1").Select
    m = m + 1

    Else
    If 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
    Ligne = CelTrouve.Row
    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").Rows(m).Select
    ActiveSheet.Paste
    'Alors on copie la ligne dans la 2eme feuille
    m = m + 1

    Else
    If CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "CANCELED" Then ' et si ma version est la plus récente
    Ligne = CelTrouve.Row
    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").Rows(m).Select
    Sheets("Feuil1").Rows(Ligne).Copy Sheets("Feuil2").Rows(m) 'Alors on copie la ligne dans la 2eme feuille
    m = m + 1

    End If

    End If
    End If
    Next Cel

    End Sub

    Pour Michel, je ne sais pas remplacer le activesheet.paste apr autre chose même si je sais que c'est lourd, si tu as une suggestion, je suis à l'écoute.
    -1
  15. melanie1324 Messages postés 1561 Statut Membre 156
     
    décompose comme ca alors :

    Sub BrutOpModif()

    Dim Plage As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    m = 1
    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
    Ligne = CelTrouve.Row
    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").select
    Rows(m).select 'Alors on copie la ligne dans la 2eme feuille
    Activesheet.paste
    sheets("Feuil1").select
    m = m + 1
    Else
    If 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
    Ligne = CelTrouve.Row

    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").select
    Rows(m).Select
    ActiveSheet.Paste
    'Alors on copie la ligne dans la 2eme feuille
    Sheets("Feuil1").Select
    m = m + 1

    Else
    If 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
    Ligne = CelTrouve.Row
    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").select
    Rows(m).Select
    ActiveSheet.Paste
    'Alors on copie la ligne dans la 2eme feuille
    m = m + 1

    Else
    If CelTrouve.Offset(, 7).Value < Cel.Value And CelTrouve.Offset(, 4).Value = "CANCELED" Then ' et si ma version est la plus récente
    Ligne = CelTrouve.Row
    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2")select
    .Rows(m).Select
    Sheets("Feuil1").Rows(Ligne).Copy
    Sheets("Feuil2").select
    Rows(m).select
    activesheet.paste
    sheets("Feuil1").select 'Alors on copie la ligne dans la 2eme feuille
    m = m + 1

    End If

    End If
    End If
    Next Cel

    End Sub
    -1