Macro suppression cellule doublons
Bonjour à tous,
J’aimerai pouvoir avoir une macro me permettant de supprimer simplement les cellules où les doublons apparaissent. Pour cela, je me suis inspiré d’une macro qu’une personne à déjà publier sur ce site (voici le lien de la vidéo et du site : https://www.blog-excel.com/gerer-doublons-et-lignes-vides/ ) . Cette macro est utilisée pour plusieurs choses :
1. Colorer les doublons (colorer la cellule seule)
5. Supprimer les lignes vides
Or, dans mon cas par exemple, je n’ai besoin que du cas n°3 : effacer les doublons (en laissant la cellule vide) et non en laissant la ligne vide…
Je suppose qu’il faut « modifier » certaines données de la macro mais je ne comprends pas tous malheureusement….
Voici à quoi ressemble la macro :
Sub doublons_et_lignes_vides()
'Macro : Sébastien Mathier - Excel-Pratique.com
'A propos de cette macro : https://www.blog-excel.com/gerer-doublons-et-lignes-vides/
choix = InputBox("Avant d'utiliser cet outil, n'oubliez pas d'enregistrer votre fichier !" & Chr(10) & Chr(10) & "Choisissez l'action qui vous intéresse :" & Chr(10) & Chr(10) & "1. Colorer les doublons (colorer la cellule)" & Chr(10) & "2. Colorer les doublons (colorer la ligne entière)" & Chr(10) & "3. Effacer les doublons (en laissant la ligne vide)" & Chr(10) & "4. Supprimer les doublons (ligne entière)" & Chr(10) & "5. Supprimer les lignes vides" & Chr(10) & Chr(10) & "Entrez le n° de l'action et cliquez sur OK :", "Gestion des doublons - Blog-Excel.com")
If choix = "" Then Exit Sub
choix2 = ""
If choix = 1 Or choix = 2 Or choix = 3 Or choix = 4 Then choix2 = InputBox("Entrez la lettre de la colonne où les doublons doivent être recherchés :", "Gestion des doublons - Blog-Excel.com")
If choix = 5 Then choix2 = InputBox("Entrez la lettre de la colonne à prendre en compte (si la cellule de cette colonne est vide, la ligne sera supprimée) :", "Gestion des doublons - Blog-Excel.com")
If choix2 = "" Then Exit Sub
Application.ScreenUpdating = False
test = Timer
der_ligne = Range(choix2 & "65000").End(xlUp).Row
Dim tab_cells()
ReDim tab_cells(der_ligne - 1)
For ligne = 1 To der_ligne
tab_cells(ligne - 1) = Range(choix2 & ligne)
Next
nb = 0
If choix = 4 Or choix = 5 Then compteur = 0
For ligne = 1 To der_ligne
contenu = tab_cells(ligne - 1)
If (choix = 1 Or choix = 2) And contenu <> "" Then 'Colorer doublons
For i = 1 To der_ligne
If contenu = tab_cells(i - 1) And ligne <> i Then 'Si doublon
nb = nb + 1
If choix = 1 Then
Range(choix2 & ligne).Interior.ColorIndex = 3
Else
Range(ligne & ":" & ligne).Interior.ColorIndex = 3
End If
Exit For
End If
Next
End If
If (choix = 3 Or choix = 4) And ligne > 1 And contenu <> "" Then 'Effacer/supprimer doublons
For i = 1 To ligne - 1
If contenu = tab_cells(i - 1) Then 'Si doublon
nb = nb + 1
If choix = 3 Then
Range(ligne & ":" & ligne).ClearContents
Else
Range(ligne + compteur & ":" & ligne + compteur).Delete
compteur = compteur - 1
End If
Exit For
End If
Next
End If
If choix = 5 And contenu = "" Then 'Lignes vides
Range(ligne + compteur & ":" & ligne + compteur).Delete
compteur = compteur - 1
nb = nb + 1
End If
Next
res_test = Format(Timer - test, "0" & Application.DecimalSeparator & "000")
Application.ScreenUpdating = True
If nb = 0 And choix = 5 Then
dd = MsgBox("Aucune ligne vide trouvée ...", 64, "Résultat")
ElseIf nb = 0 Then
dd = MsgBox("Aucun doublon trouvé dans la colonnne " & UCase(choix2) & " ...", 64, "Résultat")
ElseIf choix = 5 Then
dd = MsgBox(nb & " lignes supprimées (en " & res_test & " secondes)", 64, "Résultat")
ElseIf choix = 4 Then
dd = MsgBox(nb & " doublons supprimés (en " & res_test & " secondes)", 64, "Résultat")
ElseIf choix = 3 Then
dd = MsgBox(nb & " doublons effacés (en " & res_test & " secondes)", 64, "Résultat")
Else
dd = MsgBox(nb & " doublons passés en rouge (en " & res_test & " secondes)", 64, "Résultat")
End If
End Sub
HELP ! Pouvez-vous m'aider a y voir plus clair..... ???
bonjour
1- Excel dans son menu Données propose "supprimer les doublons"
2- pourquoi veux-tu supprimer des doublons dans un tableau de données ? erreurs de saisie (-> fiabiliser la saisie), traitement des données (-> faire des TCD... )
Bonjour,
Pourquoi ne pas joindre un fichier proche du réel ?
Ca aiderait à t'aider
P.
Oui j'ai besoin de ce tableau pour réaliser un TCD...
Je vous joint un fichier exemple pour vous montrer plus en détails :
Dans ce classeur, vous pouvez trouver des articles avec leurs désignations ainsi que l'indice d'un plan.
Le bouton " appuyez pour choisir" vous permet de mettre en avant la structure de la macro comme expliqué dans mon message précédent.
On peut constater que pour un même code article, il peut y avoir un autre indice correspondant (exemple du code article 75365).
Si j'utilise l'outil supprimer les doublons seulement sur la colonne "code article" il va supprimer le 75365 et me le remplacer par celui de dessous (29843). Or, je préférerais que les doublons soit remplacés par une case vide pour garder la même structure.
Je ne sais pas si vous avez compris l'idée ...??
Bonsoir à tous,
En fait, si tu détectes un doublon dans la colonne "code article", tu souhaites effacerla cellule correspondante en colonne "indice"
Tu ne veux pas supprimer les lignes en double
Option Explicit
Sub test()
Dim dico As Object, r As Range, derlig As Long
Set dico = CreateObject("Scripting.Dictionary")
dico.CompareMode = 1
derlig = Sheets("feuil1").Range("c" & Rows.Count).End(xlUp).Row
For Each r In Sheets("feuil1").Range("c6:c" & derlig)
If Not dico.exists(r.Value) Then
dico(r.Value) = Empty
Else
r(, 3).Interior.ColorIndex = 43
'r(, 3).ClearContents 'efface les doublons
End If
Next
End Subklin89
Bonsoir,
Non pas exactement ! Je souhaite effacer seulement les doublons présent dans la colonne "code article" et laisser toutes les autres cellules t'elles qu'elles sont actuellement.
L'objectif est par exemple quand je vais vouloir compter combien d'article j'ai crées sur une période x , il faut que je compte qu'une seul fois un seul article. Mais un article peut également avoir plusieurs "indices" et du coup je veux garder ma colonne "article+indice" qui est une concaténation de la colonne "code article" et "indice" pour mon TCD.
En gros, laisser les cellules vides dans la colonne "code article" quand elles sont doublons...
Bonjour,
si peu de lignes et sur base de ton exemple !
Option Explicit
Sub DoublesToKill()
Dim Last, I
Last = [C65000].End(xlUp).Row
[A4] = "Ordre": [A5] = 1: [A6] = 2: [A4].Select
Range("A5:A6").AutoFill Destination:=Range("A5:A" & Last), Type:=xlFillSeries
Selection.CurrentRegion.Select
Selection.Sort Key1:=Range("C5"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For I = Last To 6 Step -1
If Cells(I, 3) = Cells(I - 1, 3) Then
Range(Cells(I, 1), Cells(I, 5)).Interior.ColorIndex = 14
'--------------------pour supprimer
'Cells(I, 3).EntireRow.Delete
'--------------------pour supprimer
End If
Next
End SubP.
re à vous
pour compter un nombre de code article différents, un TCD ne suffit-il pas ?
en général, tout ce qui relève de la gestion de données mono-table se fait très bien avec les fonctions spécialisées d"Excel, sans VBA
Re Wiplaesh
Au lieu d'effacer, on va masquer
Remplace cette ligne :
r(, 3).ClearContentspar
r.Font.ColorIndex = 2klin89
C'est férié, il ne travaille pas
Bonjour à tous,
Pour répondre à vos questions :
jmd : oui j'utilise déjà un TCD qui me permet d'obtenir pas mal de résultat, mais dans mon cas, le code article n'est pas différent ! Alors il me compte en double un code article qui a simplement eu une évolution d'indice et non un nouvel code article. Je sais pas si tu vois la nuance ??
Klin89 : J'ai fait le remplacement comme tu m'as indiqué et je dois dire que c'est plutôt pas mal visuellement... !! Après le fait de simplement masquer la cellule ne résous pas forcement mon problème. Je m'explique : j'ai fait un TCD après avoir utiliser la macro et comme tu peux voir sur le fichier joint en feuille 2 il compte en double tous les doublons présent dans la colonne et même "les masquées".
Par exemple le code article 8753 et le 75365 sont comptabilisé deux fois au lieu d'une et le total général de 10 est faux (cela devrait être 8 ).
Patrick1957 : non je ne travaille pas mais je bosse quand même sur mon sujet...
re,
dans le code: r.Font.ColorIndex = 2 ça mets la cellule en blanc sur blanc mais ça va forcément faire le compte du code article "caché" derrière ce blanc une fois dans un tcd.
faut donc une autre solution
et si tu tries par article, et puis en partant du bas, effacer la cellule ? la ligne ? qui est en double ?
au besoin, tu mets une colonne "ordre" avant ton tri et effacement, comme ça ton ordre originel peut être retrouvé
Je suis peut être à côté de la plaque
ps: tu as combien de lignes à traiter ?
P.
Bonjour à tous !
Patrick1957, oui tous à fait d'accord ça ne règle pas mon problème. Oui je vois ce que tu veux dire mais ça oblige a "passer du temps" pour faire cette manipulation. Alors oui, cela peu être une solution mais je pensais qu'il était possible d'aller plus vite.. J'extrais plusieurs fois par mois plusieurs centaines de ligne donc à la longue cela risque d'être embêtant et surtout augmente le risque d'erreur si je ne suis pas attentif !
Du coup, j'ai modifié la macro avec vos idées et je pense avoir réussit à obtenir ce que je voulais ! La macro supprime la cellule en doublons, colorie une cellule pour montrer qu'il y a eu un changement d'indice mais non une création d'un nouveau code. Ce qui, d'après moi, rends mon TCD correct avec des valeurs cohérentes !
Vous trouverez ci-joint un fichier exemple pour faire la démo, est-ce que cette macro peut fonctionner ? Ou plus simplement, voyez-vous un éventuellement problème ?
Merci pour votre aide précieuse !!