Macro excel pour copier contenu de certains onglets

edi -  
 edi -
Bonjour,
J'ai un fichier excel qui contient 5 feuilles et la première est nommée « IG ».
L'objectif de la macro est que si les lignes des différentes feuilles remplissent certaines conditions, alors on doit copier certaines cellules de ces lignes dans la feuille « Alertes_recos ».
J'ai deux soucis avec la macro que j'ai.
1. La fonction if devrait remplir les trois conditions (Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO") et la cela ne fonctionne pas tel qu'écrit.
2. Le deuxième souci est que je souhaite qu'à l'ajout d'une nouvelle ligne qui remplit les conditions dans l'une des feuilles, l'exécution de la macro puisse ajouter cette ligne et non pas dupliquer les autres résultats déjà affichés. (Actuellement lorsque j'exécute la macro deux fois, les lignes qui remplissent les conditions sont dupliquées dans l'onglet « Alertes_recos ».

Ci-dessous ma macro :
Merci de votre aide.

Sub MAJ()
Dim ws As Worksheet
Sheets("IG").Select
Application.ScreenUpdating = False
For Each ws In ActiveWorkbook.Worksheets
ws.Activate

Dim i As Long
Application.ScreenUpdating = False
'Sheets("Alertes_Recos").Columns(1).Clear
'Sheets("Alertes_Recos").Columns(2).Clear
'Sheets("Alertes_Recos").Columns(3).Clear
'Sheets("Alertes_Recos").Columns(4).Clear
'Sheets("Alertes_Recos").Columns(5).Clear
'Sheets("Alertes_Recos").Columns(6).Clear
'Sheets("Alertes_Recos").Columns(7).Clear
'Sheets("Alertes_Recos").Columns(8).Clear
For i = Cells(Rows.Count, "l").End(xlUp).Row To 2 Step -1
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("a" & i).Copy Destination:=Sheets("Alertes_Recos").Range("a" & Rows.Count).End(xlUp)(2)
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("b" & i).Copy Destination:=Sheets("Alertes_Recos").Range("b" & Rows.Count).End(xlUp)(2)
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("e" & i).Copy Destination:=Sheets("Alertes_Recos").Range("c" & Rows.Count).End(xlUp)(2)
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("g" & i).Copy Destination:=Sheets("Alertes_Recos").Range("d" & Rows.Count).End(xlUp)(2)
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("h" & i).Copy Destination:=Sheets("Alertes_Recos").Range("e" & Rows.Count).End(xlUp)(2)
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("j" & i).Copy Destination:=Sheets("Alertes_Recos").Range("f" & Rows.Count).End(xlUp)(2)
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("k" & i).Copy Destination:=Sheets("Alertes_Recos").Range("g" & Rows.Count).End(xlUp)(2)
If Range("l" & i) = "Échéance proche" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("l" & i).Copy Destination:=Sheets("Alertes_Recos").Range("h" & Rows.Count).End(xlUp)(2)
Next i
Application.ScreenUpdating = True
Next ws
End Sub]
A voir également:

3 réponses

Frenchie83 Messages postés 2254 Statut Membre 339
 
Bonjour
pour la première question:
          If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("a" & i).Copy Destination:=Sheets("Alertes_Recos").Range("a" & Rows.Count).End(xlUp)(2)
            If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("b" & i).Copy Destination:=Sheets("Alertes_Recos").Range("b" & Rows.Count).End(xlUp)(2)
            If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("e" & i).Copy Destination:=Sheets("Alertes_Recos").Range("c" & Rows.Count).End(xlUp)(2)
            If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("g" & i).Copy Destination:=Sheets("Alertes_Recos").Range("d" & Rows.Count).End(xlUp)(2)
            If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("h" & i).Copy Destination:=Sheets("Alertes_Recos").Range("e" & Rows.Count).End(xlUp)(2)
            If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("j" & i).Copy Destination:=Sheets("Alertes_Recos").Range("f" & Rows.Count).End(xlUp)(2)
            If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("k" & i).Copy Destination:=Sheets("Alertes_Recos").Range("g" & Rows.Count).End(xlUp)(2)
            If Range("l" & i) = "Échéance proche" And Range("g" & i) = "DPO" Or Range("l" & i) = "En retard" And Range("g" & i) = "DPO" Then Range("l" & i).Copy Destination:=Sheets("Alertes_Recos").Range("h" & Rows.Count).End(xlUp)(2)
 

Pour la deuxième, je ne comprends pas, si vous relancez la macro, il est normal que le cycle se reproduise, et ce, autant de fois que vous la lancerez. Donnez plus de détail ou mieux, un exemple.
Cdlt
0
edi
 
Bonjour Frenchie83,
Merci pour ton retour.
Pour le premier point c'est OK. Par contre pour le second, justement je veux que le cycle se reproduise mais qu'il ne duplique pas les premiers résultats déjà affichés... en fait je ne veux pas de doublons quelque soit le nombre d'exécution de la macro... Est ce qu'il y a une possibilité d'améliorer la macro pour prendre en compte cet aspect ?
0
Frenchie83 Messages postés 2254 Statut Membre 339
 
Pas de doublons OK, mais dans la feuille "IG", Quelle colonne doit -on prendre comme référence qui ne doit pas se retrouver plus d'une fois dans la feuille "Alertes_recos"? et de quelle nature est cette référence, numérique? alphanumérique?, Texte? Date? Soyez plus précis dans vos demandes.
Mettez une extrait de votre fichier sans données personnelles sur cjoint.com (suivre la procédure) et collez le lien ici.
Cdlt
0
edi
 
Bonsoir Frenchie,
J'ai ajouté un exemple du fichier sur cjoint.com:
http://www.cjoint.com/c/EGCvjispGy3
0
Frenchie83 Messages postés 2254 Statut Membre 339
 
Bonjour
Merci d'avoir joint un extrait de votre fichier, mais vous n'avez pas répondu à ma question concernant les doublons, je suppose donc qu'il ne doit pas y avoir 2 fois le même n° de recopie dans la feuille "Alertes_Recos". Je regarde ça et vous répond dans la journée.
Cdlt
0
edi
 
Bonjour Frenchie,
Désolé encore. Pour répondre à votre question, par exemple dans la fiche "IG", je ne dois pas avoir la même ligne qui se repète plus de deux fois dans la feuille "Alertes_Recos".
On pourrait prendre comme référence le numéro de la recos (colonne A) qui est de format numérique, mais le souci est qu'on retrouve le même numéro de reco dans les autres feuilles.
C'est pour cela que je ne peux pas donner de référence en tant que telle...
J'espère que j'ai été un peu plus clair...

Edi
0
Frenchie83 Messages postés 2254 Statut Membre 339
 
Bonjour
2 solutions pour supprimer les doublons
1)-méthode manuelle
--sélectionner le tableau dans la feuille "Alerts_Recos"
--dans le ruban, cliquez sur "Données"
--dans l'onglet "Outils de données" cliquez sur "Supprimer les doublons"
2)-méthode avec VBA, attention j'utilise la colonne K momentanément
Sub SuppressionDoublons()
    Application.ScreenUpdating = False
    On Error Resume Next
    Sheets("Alertes_Recos").Select
    DerLig = [A100000].End(xlUp).Row
    Range("k2:k" & DerLig).FormulaR1C1 = "=RC1&RC2&RC3&RC4&RC5&RC6"
    For i = 2 To DerLig
        Valeur = Range("K" & i).Value
        With Range("K1:K" & DerLig)
            Set x = .Find(Valeur, LookIn:=xlValues)
            If Not x Is Nothing Then
                    Depx = x.Address
                Do
                    If x.Address <> Depx And x.Row > i And Valeur = x Then x.Value = "x"
                    Set x = .FindNext(x)
                    If XRow < i Then GoTo SuppressionDesDoublons
                Loop While Not x Is Nothing And x.Address <> Depx
            End If
        End With
    Next i

SuppressionDesDoublons:
    Range("K1").FormulaR1C1 = "Tri"
    Range("K1").Select
    Selection.AutoFilter
    ActiveSheet.Range("K1:K" & DerLig).AutoFilter Field:=1, Criteria1:="x"
    NbCol = [IV1].End(xlToLeft).Column
    Range("_FilterDataBase").Offset(1, -10).Resize(, NbCol).SpecialCells(xlCellTypeVisible).Select
    Selection.EntireRow.Delete
    Selection.AutoFilter
    Columns(11).ClearContents
End Sub

Essayez
Cdlt
0
edi
 
Bonjour,

Je ne comprends pas la deuxième partie "SuppressionDesDoublons" de la macro.
Est-ce qu'elle fait partie de la macro ?
0
Frenchie83 Messages postés 2254 Statut Membre 339
 
Bonjour
OUI, c'est ce qu'on appelle une étiquette. Dans le déroulement du programme, suivant la condition testée, on lui dit d'aller lire la suite à partir de cette étiquette. C'est la cas de la ligne
If XRow < i Then GoTo SuppressionDesDoublons

Par la même occasion, je viens de voir une anomalie dans ce bout de code, remplacez XRow par X.Row.
Essayez
Cdlt
0
edi
 
Re,
Voici la macro que j'ai utilisé pour supprimer les doublons. Et ça marche bien.
Merci encore.
Ci-dessous cette dernière:
Sub Macro1()
' Macro1 Macro
Cells.Select
ActiveSheet.Range("$A$1:$H$7").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, _
8), Header:=xlYes
End Sub
0