Problème de séléction des données doublons [RESOLU]

macadamx

XLDnaute Junior
Bonjour à tous !

J'ai créé ce code en VBA en m'inspirant d'autres personnes sur Internet:
Application.ScreenUpdating = False

Cells.Find(What:="statut", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

statut = ActiveCell.Column

[D : D].Interior.ColorIndex = xlNone
Set mondico = CreateObject("Scripting.Dictionary")

For Each c In Range("d2", [d65000].End(xlUp))
mondico.Item(c.Value) = mondico.Item(c.Value) + 1
If mondico.Item(c.Value) > 1 Then
If Cells(c.Row, statut).Value = "en cours" Then
Cells(c.Row, statut).Value = "A supprimer"
End If
End If
Next c

Application.ScreenUpdating = True

Qui concrètement, analyse les données avec des doublons, si celles-ci comportent des doublons ET qu'il y a une mesure en cours parmis celle ci, alors les marquées d'un label à supprimer.

Cependant, cela ne prend pas en compte toute les données comme ceci :
en cours2su1M/Ho239sfMd3ZoYdGPPlvg2su1M/Ho239uNTGe12J7qdpPE0teLszM0CvBQw
A supprimer 2su1M/Ho239sfMd3ZoYdGPPlvg2su1M/Ho239uNTGe12J7qdpPE0teLszM0CvBQw
A supprimer 2su1M/Ho239sfMd3ZoYdGPPlvg2su1M/Ho239uNTGe12J7qdpPE0teLszM0CvBQw
A supprimer 2su1M/Ho239sfMd3ZoYdGPPlvg2su1M/Ho239uNTGe12J7qdpPE0teLszM0CvBQw
A supprimer 2su1M/Ho239sfMd3ZoYdGPPlvg2su1M/Ho239uNTGe12J7qdpPE0teLszM0CvBQw


clôturée k3uhZ6HZ8QHukJHjLs8eHcpQLMQKKz0zXQuLHLu3cVbSA34w
A supprimer k3uhZ6HZ8QHukJHjLs8eHcpQLMQKKz0zXQuLHLu3cVbSA34w



clôturée v2wqu44GRjzq8naCqrUZuNrucoE0betyIH8zVCFoCg
clôturée v2wqu44GRjzq8naCqrUZuNrucoE0betyIH8zVCFoCg
clôturée v2wqu44GRjzq8naCqrUZuNrucoE0betyIH8zVCFoCg
A supprimer v2wqu44GRjzq8naCqrUZuNrucoE0betyIH8zVCFoCg
A supprimer v2wqu44GRjzq8naCqrUZuNrucoE0betyIH8zVCFoCg
A supprimer v2wqu44GRjzq8naCqrUZuNrucoE0betyIH8zVCFoCg

Quelqu'un peut voir où est le problème ?

Merci,

Johan
 
Dernière édition:

macadamx

XLDnaute Junior
Re : Problème de séléction des données doublons

Avec un fichier exemple c'est mieux


Merci de votre aide ! J'arrive pas à voir où est mon erreur.
 

Pièces jointes

  • Exemple.xls
    22 KB · Affichages: 26
  • Exemple.xls
    22 KB · Affichages: 21
  • Exemple.xls
    22 KB · Affichages: 24
Dernière édition:

macadamx

XLDnaute Junior
Re : Problème de séléction des données doublons

Personne ne voit où peut être le problème ?... J'ai beau chercher... Je ne vois pas pourquoi il ne prend pas en compte toutes les colonnes.

Alors que quand je fais une coloration de celles-ci, cela me les prends bien en compte mais pas si j'ajoute ma condition "en cours"...
 

macadamx

XLDnaute Junior
Re : Problème de séléction des données doublons

j'ai rajouté des commentaires afin d'éssayer d'être plus clair :
Application.ScreenUpdating = False

' chercher la cellule statut
Cells.Find(What:="statut", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de statut
statut = ActiveCell.Column

'prendre la colonne D:D et intégrer un dictionnaire
[D:D].Interior.ColorIndex = xlNone
Set mondico = CreateObject("Scripting.Dictionary")

'rechercher chaque valeur dans la colonne D et les ajouter si elles sont différentes
For Each c In Range("d2", [d65000].End(xlUp))

'si la valeur existe déjà, ajouter 1 au dictionnaire

mondico.Item(c.Value) = mondico.Item(c.Value) + 1

'si le nombre de valeur est supérieure à 1 alors

If mondico.Item(c.Value) > 1 Then

'si parmis ces valeurs la valeur de la colonne statut est en cours alors

If Cells(c.Row, statut).Value = "en cours" Then
' supprimer toutes les valeurs aussi bien cloturée que en cours car il en existe parmi elles une en cours
mondico.Item(c.Value).Delete.EntireRow
End If
End If
Next c

Application.ScreenUpdating = True

End Sub
 

macadamx

XLDnaute Junior
Re : Problème de séléction des données doublons

Salut à tous !

pour ceux que ça intéresse voici le code trouvé avec la GRANDE aide d'un ami :

Sub remove_doublon_activite()

Dim rowsToBeDeleted, rowstobedeleted2() As Integer
Dim d As Date
Dim f As Date
Dim cellule As Range


Application.ScreenUpdating = False
blDimensioned = False




'on affiche tout
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0


lastrow = Cells(Rows.Count, "D").End(xlUp).Row




'on filtre celles qui sont "en cours"
'ActiveSheet.Range("$A$1:$D" & Lastrow).AutoFilter Field:=1, Criteria1:="en cours"

'filtrer par noms

Columns("D:D").Select
Range("D" & lastrow).Sort Key1:=Range("D1"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

' chercher la cellule statut
Cells.Find(What:="statut", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de début
statut = ActiveCell.Column


' chercher la cellule début de prise en charge
Cells.Find(What:="Début de Prise en Charge", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de début
début = ActiveCell.Column


' chercher la cellule début de fin effective
Cells.Find(What:="Date Fin Effective", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de fin effective
fin = ActiveCell.Column


'prendre la colonne D:D
[D:D].Interior.ColorIndex = xlNone




'on fait un range avec la colonne D mais uniquement les cellules visibles
Set MyRg = ActiveSheet.Range("D2:D" & lastrow).Rows.SpecialCells(xlCellTypeVisible)




MyRg.Select




doublonDetected = False
lastIdentifiant = 0
For Each c In MyRg

c.Select
'lastIdentifiant permet de sauter completement un paquet de doublons
If lastIdentifiant = c.Value Then GoTo NEXTC

lastIdentifiant = c.Value

CountInit = c.Row
Count = c.Row

'On cherche a savoir si on a un doublon et jusqu'a ou on a le doublon
Do While c.Value = Cells(Count + 1, c.Column):
Count = Count + 1
Loop
'Si on a un doublon alors la condition suivante est remplie
If Count > c.Row Then 'on a un doublon
Set MyRg2 = Range("D" & CountInit & ":D" & Count)
MyRg2.Select
asupprimer = False
'On cherche si on a la valeur "en cours" parmis ces doublons
For Each C2 In MyRg2

If Cells(C2.Row, statut).Value = "en cours" Then 'alors on doit supprimer ce range

asupprimer = True
Exit For
End If




Next C2

'Si on a trouvé un doublon, on note les rows
If asupprimer = True Then
For i = CountInit To Count
If blDimensioned = True Then
ReDim Preserve rowsToBeDeleted(0 To UBound(rowsToBeDeleted) + 1) As Integer
Else
ReDim rowsToBeDeleted(0 To 0) As Integer
blDimensioned = True
End If
rowsToBeDeleted(UBound(rowsToBeDeleted)) = i
Debug.Print ("Row : " & i)
Next i
End If
End If


'Rows(c.Row - 1).Delete

' End If
'End If
NEXTC:
Next c

'suppression des lignes (on le fait en partant du bas sinon on change le numero des lignes suivantes et ca fout la merde !
If blDimensioned = True Then


For lngPosition = UBound(rowsToBeDeleted) To LBound(rowsToBeDeleted) Step -1

Rows(rowsToBeDeleted(lngPosition)).Select
Rows(rowsToBeDeleted(lngPosition)).Delete

Next lngPosition

End If


'définition à nouveau de la dernière ligne
lastrow3 = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
For i = lastrow3 To 2 Step -1 '(n'oublie pas le step -1 sinon il va essayer d'aller de lastrow3 a 2 en ajoutant 1...)
If Range("A" & i).Value = "en cours" Then Rows(i).Delete
Debug.Print ("Deleted row : " & i)
Next i
 

Discussions similaires

Réponses
6
Affichages
169
Réponses
7
Affichages
405

Statistiques des forums

Discussions
312 493
Messages
2 088 952
Membres
103 989
dernier inscrit
jralonso