Recherche de doublons en vba

earvino

XLDnaute Nouveau
Bonjour,
J'ai une macro sur laquelle j'essaye de faire la recherche de doublons et ceci sur deux colonnes
Deux colonnes (C et D); dans C les valeurs sont 1,2,3...
Dans D la valeur est entrant.
Donc un tableau du genre:
1 entrant
1 entrant
2 entrant
3 entrant
3 entrant
....
Je souhaite prendre la première ligne (c-a-d "1entrant"), la chercher dans les lignes suivantes et si je trouve une correspondance je supprime la ligne. Je continue jusqu'à la fin de la colonne puis je cherche une autre valeur (2entrant par exemple). Et ainsi de suite
Le code que j'ai réussi à faire:
Code:
sub doublon()
i = 2
j = 3

While Workbooks(Thisbook).Sheets("Feuil1").Range("A" & i) <> ""

Do Until Workbooks(Thisbook).Sheets("Feuil1").Range("D" & j).Value = ""
    If j = i Then
    j = j + 1

    ElseIf Workbooks(Thisbook).Sheets("Feuil1").Range("C" & i).Value & Workbooks(Thisbook).Sheets("Feuil1").Range("D" & i).Value = Workbooks(Thisbook).Sheets("Feuil1").Range("C" & j).Value & Workbooks(Thisbook).Sheets("Feuil1").Range("D" & j).Value Then
    Workbooks(Thisbook).Sheets("Feuil1").Rows(j).EntireRow.Delete
    j = j - 1

    ElseIf Workbooks(Thisbook).Sheets("Feuil1").Range("C" & i).Value & Workbooks(Thisbook).Sheets("Feuil1").Range("D" & i).Value <> Workbooks(Thisbook).Sheets("Feuil1").Range("C" & j).Value & Workbooks(Thisbook).Sheets("Feuil1").Range("D" & j).Value Then
    j = j + 1
    End If
Loop

i = i + 1
j = 2
Wend
End Sub

Sauf que pour 30000 lignes c'est très très long.
J'ai essayé avec Find mais en vain (certainement mon niveau qui est en cause:p)
Avez-vous des idées à me conseiller ?

Merci
 
Dernière édition:

earvino

XLDnaute Nouveau
Re : Recherche de doublons

Pour le moment, j'ai un ordi avec Excel 2007. Mais la macro doit pouvoir fonctionner sous 2003.
Le but est d'éviter à l'utilisateur de faire des manips. Il y a plusieurs feuilles avec la même problématique et cela devient ennuyeux au bout d'un moment
 

Misange

XLDnaute Barbatruc
Re : Recherche de doublons en vba

Après la recherche des doublons, il y a d'autres opérations.
La macro permettra de gagner du temps et d'éviter de faire des tâches répétitives tous les 2 jours.

Dans ce cas un simple enregistrement de l'opération effectuée par excel avec cette fonctionnalité te donne le code !

Quand on supprime des lignes en VBA, on commence toujours par le bas car sinon les index de lignes se décalent.
Il faut toujours sur un code qui rame commencer par désactiver le calcul automatique en début de macro et le rafraichissement de l'écran pour les remettre à la fin.
 

Efgé

XLDnaute Barbatruc
Re : Recherche de doublons en vba

Bonjour earvino, Bonjour GeoTrouvePas :) , Re Misange
A l'aveugle
VB:
Sub test()
Dim i&, J&
Dim D As Object, Plg As Range, T As Variant, Ttmp As Variant
Set D = CreateObject("Scripting.dictionary")

With ThisWorkbook.Sheets("Feuil1")
    Set Plg = .UsedRange
    T = Plg
End With

ReDim Ttmp(1 To UBound(T, 2))

For i = 2 To UBound(T, 1)
    If Not D.Exists(T(i, 3) & T(i, 4)) Then
        For J = LBound(T, 2) To UBound(T, 2)
            Ttmp(J) = T(i, J)
        Next J
        D(T(i, 3) & T(i, 4)) = Ttmp
    End If
Next i

Application.ScreenUpdating = False
With Plg.Offset(1, 0)
    .Resize(Plg.Rows.Count - 1, Plg.Columns.Count).ClearContents
    .Resize(D.Count, UBound(T, 2)) = Application.Index(D.Items, , 0)
End With

End Sub
Cordialement
 
Dernière édition:

earvino

XLDnaute Nouveau
Re : Recherche de doublons en vba

@GeoTrouvePas. Merci pour le lien. Je vais regarder si je peux comprendre et adapter quelque chose pour mon cas.

@Misange. J'avais remarqué pour l'index. Dans mon code, j'avais mis un J = J -1 pour revenir à la ligne juste avant. C'est du bidouillage, mais je fais avec mes connaissances

@Efgé. Ton code fonctionne parfaitement. Qu'es ce que j'aimerai faire la même chose à l'aveugle. Parce que même avec les yeux grands ouverts, je n'y arrive pas:p
Maintenant faut que j'arrive à comprendre ton code pour progresser....
Merci
 

Efgé

XLDnaute Barbatruc
Re : Recherche de doublons en vba

Re
dans la ligne
.Resize(D.Count, UBound(Tableau, 2)) = Application.Index(D.Items, , 0)
On redimentionne la plage Plg d'un nombre de ligne égal au nombre d'entrées du dictionnaire et du nombre de colonne égal au nombre dde colonne du tableau.
Cette zone est égale à l'ensemble des items du dictionnaire "Application.Index(D.Items, , 0)"
Cette astuce fonctionne car on mis en Items du dictionnaire des tableaux (TTmp) tous de dimentions égales.
Pour les infos sur le dictionnaire, voir le site de J.Boisgontier dont le lien t'as été donné par GeoTrouvePas
Cordialement
 

Discussions similaires

Réponses
11
Affichages
281

Statistiques des forums

Discussions
312 104
Messages
2 085 335
Membres
102 865
dernier inscrit
FreyaSalander