VBA suppression conditionnelle de valeur

Résolu/Fermé
Jle41 Messages postés 3 Date d'inscription mardi 12 juin 2012 Statut Membre Dernière intervention 13 juin 2012 - 12 juin 2012 à 14:18
 jle41 - 15 juin 2012 à 15:54
Bonjour à tous,

Je suis nouveau sur le forum et débutant en VBA, merci d'avance pour toutes vos réponses et le temps que vous consacrerez à m'aider.
Je précise que je suis sur Excel 2003.

Je suis stagiaire et j'ai un gros travail à faire à partir d'un tableau croisé dynamique qui prend ça source à partir de la base de données des employés de l'entreprise, qui comprend environ 1500 lignes (une par poste).
Je cherche depuis quelques jours une macro me permettant de gérer au mieux les doublons. Je m'explique :
dans ma base de données des salariés, on trouve entre autre leur code poste, leur date d'arrivée dans ce poste ainsi que leur type de contrat CDI ou CDD.

A B C D
Untel1 01/02/2007 P004 CDI
Untel2 11/02/1995 I002 CDI
Untel3 23/03/2011 P004 CDI
Untel4 03/12/2008 I002 CDD

Le problème est que plusieurs personnes peuvent avoir le même code poste (en cas de remplacement par exemple). Or, ce poste sera compté 2 fois dans mon tableau croisé alors qu'il ne représente qu'un poste en réalité.

Donc, je cherche une macro conditionnelle me permettant de supprimer le code poste en cas de doublons : - si le contrat du doublon est un CDD, alors son Code poste =""
- si le contrat du doublon est un CDI, il faudra que le code poste qui possède la date la plus récente soit =""
Ainsi, dans mon exemple, les codes poste de Untel3 (CDi et date plus récente) devrat être supprimé, tout comme celui de Untel4, car en CDD.


J'espère avoir été clair, mais j'en doute... J'ai commencé à bidouiller des codes, je peux vous les indiquez si cela peut vous aider mais j'en doute fort!

Merci beaucoup pour votre aide.


A voir également:

5 réponses

lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
12 juin 2012 à 23:09
Bonjour,
Si je comprend bien, Unité 1 est obsolète et tu voudrais le supprimer ?
A+
0
Jle41 Messages postés 3 Date d'inscription mardi 12 juin 2012 Statut Membre Dernière intervention 13 juin 2012
13 juin 2012 à 09:19
Bonjour lermite222, et merci de ton aide!

En fait il ne faut rien supprimer (en aucun cas supprimer les lignes) car j'en aurai besoin pour avoir l'effectif de l'entreprise. Par contre, il faudra rendre égales à 0 ou "" les cellules de certains code poste en doublon. Le code poste de untel1 doit être garder car c'est le plus ancien, par contre Untel3 possède le même code poste (donc doublon), suite à un remplacement temporaire. Il faut donc garder absolument cette ligne, mais rendre la valeur de son code poste nulle.

Merci beaucoup, j'espère avoir répondu à la question
0
Jle41 Messages postés 3 Date d'inscription mardi 12 juin 2012 Statut Membre Dernière intervention 13 juin 2012
13 juin 2012 à 09:59
Voilà le code à partir duquel je me suis basé et que j'ai adapté à mon cas, au cas où ça peut aider. Mais j'ai environ 1500 lignes à analyser donc j'ai peur que ce genre de code prenne un temps monstre s'il fonctionne...

Sub Essai()

For i = 2 To 2500
For j = 3 To 2500
If Cells("S" & i).Value = Range("S" & j) Then
If Range("O" & i).Value = "DI" Then
If Range("N" & i) > Range("N" & j) Then
Range("S" & i).Value = ""

End If
End If
If Range("O" & i).Value = "DD" Then
Range("S" & i).Value = ""

End If

End If
Next j
Next i

End Sub
0
Salut

Si tu veux rendre ce genre de code plus efficace tu peux ajouter
Application.ScreenUpdating = false au début de ton code et
Application.ScreenUpdating = true a la fin de ton code

De cette façon, tu économisera en temps d'exécution.

Après, si le code que tu nous a donné fait ce que tu veux qu'il fasse sur des petits échantillons, il n'ya pas de raison qu'il pose des problèmes sur 1500 lignes

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour Elphealer.
Merci de ta réponse.

Entre temps j'ai résolu mon problème, voici le code si ça interesse quelqu'un :

Option Explicit
Sub Suppression_doublons()
Dim Cel As Range, Plage As Range
Dim C As Collection
Dim DerLig As Long, i As Long, j As Long, Cptr As Long
Application.ScreenUpdating = False
Set C = New Collection
On Error Resume Next
With Worksheets("Feuil1")
DerLig = .Range("S" & .Rows.Count).End(xlUp).Row

'Tri ascendant sur la date d'arrivée dans le poste
.Range("A1:T" & DerLig).Sort Key1:=.Range("N1"), Order1:=xlAscending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False


'Les codes poste sont placés dans une collection afin d'obtenir une liste sans doublon
Set Plage = .Range("S2:S" & DerLig)
For Each Cel In Plage
If Cel <> "" Then C.Add Cel, CStr(Cel)
Next Cel
On Error GoTo 0

'On boucle sur chaque élément de la collection que l'on compare aux codes de la liste.
For i = 1 To C.Count
Cptr = 0
For j = 1 To DerLig
If .Range("S" & j).Value = C.Item(i) Then
If Cptr > 0 Then .Range("S" & j) = ""
Cptr = Cptr + 1
End If
Next j
Next i

'Tri ascendant sur le nom (la liste est replacée dans l'ordre initial)
.Range("A1:T" & DerLig).Sort Key1:=.Range("A1"), Order1:=xlAscending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False


End With
Set Plage = Nothing
Set C = Nothing
Application.ScreenUpdating = True
End Sub


Merci encore
0