Macro excel pour copier contenu de certains onglets
edi
-
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]
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:
- Macro excel pour copier contenu de certains onglets
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Fusionner deux cellules excel en gardant le contenu - Guide
- Comment copier une vidéo youtube - Guide
3 réponses
Bonjour
pour la première question:
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
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
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
Mettez une extrait de votre fichier sans données personnelles sur cjoint.com (suivre la procédure) et collez le lien ici.
Cdlt
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
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
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
Essayez
Cdlt
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
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
Par la même occasion, je viens de voir une anomalie dans ce bout de code, remplacez XRow par X.Row.
Essayez
Cdlt
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
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 ?