Supprimer Doublon avec une condition

Bonjour,

Dans le fichier joint, je récupérer, sans doublon, en vba, les données de la feuille "BD" vers la feuille "FeuilleBilan" avec le code :

Sub Extraire()
Dim TousLesSites As Integer
Dim N As Integer
Dim i As Integer

Sheets("FeuilleBilan").Select
    Range(Cells(4, 2), Cells(10000, 5)).Select
    Selection.ClearContents
For TousLesSites = 2 To 4 Step 2
N = 0
With Sheets("BD")
tabloBD = .Cells(2, 1).Resize(.Cells(Rows.Count, 1).End(xlUp).Row - 1, 3)
End With
Set liste = CreateObject("scripting.dictionary")
With Sheets("FeuilleBilan")
  For i = 1 To UBound(tabloBD)
        DateObservation = tabloBD(i, 1)
        If Not liste.Exists(tabloBD(i, 2) & "#" & tabloBD(i, 3)) Then
        liste(tabloBD(i, 2) & "#" & tabloBD(i, 3)) = ""
            If tabloBD(i, 2) = .Cells(2, TousLesSites) Then
            N = N + 1
            .Cells(3 + N, TousLesSites) = tabloBD(i, 1)
            .Cells(3 + N, TousLesSites + 1) = tabloBD(i, 3)
            End If
        End If
 Next i
End With
Range("A1").Select
Next TousLesSites
End Sub

Comme je veux récupérer la date la plus ancienne, je commence par trier ma BD avec le champ "Date" du plus ancien au plus récent. Cette solution marche, mais, pour apprendre, je cherche un code me permettant de garder la bonne ligne sans avoir a faire de tri au préalable.

NB : Ma vrai BD comporte plus de 25 000 lignes et 15 colonnes.

Merci d'avance pour votre aide.

Patrick

Bonjour

Un essai à tester. Te convient-il ?

Bye !

Bonjour pm.

Bonjour gmb.

Un autre essai.

La liste n'a pas besoin d'être triée, nous la trions dans un tableau virtuel.

J'ai également travaillé sur des tableaux virtuels pour chacun des deux sites pour optimiser le temps d'exécution.

Bonjour,

Merci gmb, merci thebenoit59 pour vos propositions.

gmb :

Je me suis peut-être mal expliqué, mais ta proposition ne me sélectionne pas la date la plus ancienne pour chaque ligne trouvée.

Avec le msgbox elle m'affiche la date la plus ancienne de la base.

Ce n'est pas ce que je cherchais à faire.

thebenoit59 :

Ton code "de pro" (Super rapide) mais pas de mon niveau car je ne suis qu'un amateur, correspond à ma demande, à un détail prés, c'est que le format de date n'est pas bon. Exemple : Pour Site1, Nom1 elle affiche 02/09/2015 au lieu du 09/02/2015 (Forcement, dans certain cas, ça ne prend pas la bonne date)

Malgré les commentaires (merci beaucoup) je ne comprend pas suffisamment ton code pour savoir où mettre un format date jj/mm/aaaa.

Merci

Patrick

Effectivement, ça arrive avec les dernières versions d'Excel.

Peux-tu voir avec ce nouveau fichier ?

Bonsoir,

Une proposition à étudier.

ALT F8, exécuter la procédure.

Cdlt.

Bonsoir,

Merci thebenoit59 pour ta correction, merci Jean-Eric pour ta proposition.

Vos deux codes sont très différents mais les deux marchent parfaitement.

Du grand art de vba, que je ne maîtrise pas du tous et c'est bien dommage car j'aurais beaucoup de mal à adapter l'un de vos deux codes lorsque j'aurais un problème similaire a traiter.

Donc, s'il y a une solution en gardant le principe de mon code, que je maîtrise mieux je suis preneur.

Patrick

Bonjour Jean-Eric.

pmfontaine :

Voici ton code adapté.

J'ai déclaré ton tableau dans les variables.

Et j'ai ajouté la fonction Tri de Boisgontier pour éviter de devoir trier sur ta feuille.

Sub Extraire()
Dim TousLesSites As Integer
Dim N As Integer
Dim i As Integer
Dim tabloBD()

Sheets("FeuilleBilan").Select
    Range(Cells(4, 2), Cells(10000, 5)).Select
    Selection.ClearContents
For TousLesSites = 2 To 4 Step 2
N = 0
With Sheets("BD")
tabloBD = .Cells(2, 1).Resize(.Cells(Rows.Count, 1).End(xlUp).Row - 1, 3).Value
Tri tabloBD, 1, LBound(tabloBD), UBound(tabloBD)
End With
Set liste = CreateObject("scripting.dictionary")
With Sheets("FeuilleBilan")
  For i = LBound(tabloBD) To UBound(tabloBD)
        DateObservation = tabloBD(i, 1)
        If Not liste.Exists(tabloBD(i, 2) & "#" & tabloBD(i, 3)) Then
        liste(tabloBD(i, 2) & "#" & tabloBD(i, 3)) = ""
            If tabloBD(i, 2) = .Cells(2, TousLesSites) Then
            N = N + 1
            .Cells(3 + N, TousLesSites) = tabloBD(i, 1)
            .Cells(3 + N, TousLesSites + 1) = tabloBD(i, 3)
            End If
        End If
 Next i
End With
Range("A1").Select
Next TousLesSites
End Sub

Sub Tri(a(), ColTri, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2, ColTri)
  g = gauc: d = droi
  Do
    Do While a(g, ColTri) < ref: g = g + 1: Loop
    Do While ref < a(d, ColTri): d = d - 1: Loop
    If g <= d Then
       For k = LBound(a, 2) To UBound(a, 2)
         temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
       Next k
       g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(a, ColTri, g, droi)
  If gauc < d Then Call Tri(a, ColTri, gauc, d)
End Sub

Bonjour

Merci thebenoit59 pour ce code que je comprend beaucoup mieux.

Il faut juste que je comprendre la fonction Tri de Boisgontier.

Encore merci à tous pour votre aide.

Patrick

Bonsoir,

>Il faut juste comprendre la fonction Tri

http://boisgontierjacques.free.fr/pages_site/tableaux.htm#Tri

Ceuzin

Merci ceuzin pour le lien.

Patrick

Bonsoir

Je reviens sur ce message, car je voudrais pouvoir faire un tri sur deux champs (colonne nom (dans ma vrai BD c'est la 14 éme colonne, puis colonne date (1ère colonne)

Merci

Patrick

Je ne comprends pas de quel tri tu parles.

Un tri alphabétique ?

Ou un filtre sur le nom et les dates ?

Juste une modification du code pour changer l'emplacement des colonnes ?

Bonjour à tous, bonjour thebenoit59

Désolé pour ma réponse tardive à ta question, mais j'ai du laisser Excel de coté pendant quelques jours.

Pour expliquer ma question voir l'image jointe qui montre ce que je cherche à faire en vba sur le même principe que la fonction Tri de Boisgontier qui s'applique sur la date dans la table virtuelle.

Est-ce que c'est possible de mettre deux niveaux de tri

Merci

Patrick

deuxniveauxtri

Bonjour PM.

Tu souhaites trier par nom puis par date tes données finales. Mais ayant qu'une seule valeur par nom, il n'y a pas d'utilité d'effectuer un tri selon deux critères.

Nous pouvons juste trier la finalité par rapport aux noms.

Je te fournis un exemple en partant sur mon ancien code, et pas sur le tien.

Bonjour,

Merci thebenoit59 pour ta réponse, ça correspond exactement a ce que je veux faire.

Avant de repondre a ton message j'ai essayé de bien comprendre chaque étape.

Grace a tes commentaires (Merci beaucoup) j'ai bien compris la logique, mais pas toute la syntaxe que je ne connait pas :

Je vais essayer de l'adapter un mon fichier original, mais c'est pas gagné !

Ci ça coince je reviendrais vers le forum.

Encore merci pour tous

Patrick

Pas de soucis, n'hésite pas à revenir vers moi au besoin même par mail ou MP.

Super !

Merci thebenoit59

En attendant, bonnes fêtes de fin d'année à tous.

Patrick

Rechercher des sujets similaires à "supprimer doublon condition"