VBA_Recherche Doublons avec plusieurs criteres / filtres

Bonjour le forum,

Je cherche a reperer (en les surlignant) et copier (dans un autre onglet) les doublons figurant dans un tableau.

D'habitude je m'arrange avec une fontion comme NB.SI mais la, mon fichier contient pas moins de 160 000 lignes.

Second probleme, certains doublons peuvent apparaitre facilement car lorsque l'on compare les 8 criteres/variables, les informations sont toutes identiques. Seulement, il se peut parfois qu'il y ait des doublons, mais ceux-ci n'ont en commun que 3 des 8 variables.

Ce que je cherche a faire via VBA:

  • CHoisir quel critere je decide d'appliquer a ma recherche de doublons (comme un filtre).
  • En fonction du critere de recherche, copier ces doublons dans un onglet.
  • POuvoir appliquer 6 ou 7 differents filtres. Chaque resultats ayant son propre onglet.
  • Rentre la tache la plus simple et rapide possible malgre les 160 000 lignes.

Ci-joint un exemple de mon probleme. J'ai reduit a 300 lignes.

Un grand merci pour votre aide

Cdlt

Salut,

Ta demande n’est pas évidente, le nombre de réponses en témoigne.

J’ai commencé à chercher une solution, mais je ne veux pas aller plus loin si je fais complètement fausse route.

Dans le fichier ci-joint, tu dois choisir des critères de recherche en sélectionnant l’une des cellules de la plage A3:A8 de la feuille ‘Criteres’. Puis tu lances le code en cliquant sur le bouton en place sur cette même feuille.

Le résultat se trouve pour l’instant sur la feuille ‘Provisoire’. Celle-ci est triée ‘à ma manière’ et devrait être encore traitée pour répondre à ton attente. Mais ce n’est que provisoire.

Je ne savais pas trop bien sur quelle colonne tu avais trié ta feuille ‘database’ ; j’y ai donc rajouté une colonne cette feuille, j’ai donc ajouté une colonne L avec une numérotation de 1 à xxxx.

A la fin du code, la feuille ‘Provisoire’ est actualisée et tu trouves en colonne M une indication des lignes en doublon. Comme tu as selon moi aucune ligne en doublon au niveau des 11 colonnes, j’ai dupliqué la ligne 20 de cette feuille en ligne 300 afin de pouvoir effectuer des essais.

Donc si tu sélectionnes la cellule A3 de la feuille ‘Criteres’ et que tu lances le code, tu trouveras seulement ces 2 doublons aux lignes 151 et 152 de la feuille ‘Provisoire’. Mais si tu si tu sélectionnes la cellule A7 de la feuille ‘Criteres’ et que tu lances le code, celui-ci t’indiquera des doublons aux lignes 151, 152, 197 et 198.

A chaque fois ça t’indique avec quelle ligne de ma numérotation de la feuille ‘database’ ça a trouvé les doublons.

Maintenant, si les doublons ainsi trouvés te conviennent, ce sera relativement simple d’aller plus loin et d’indiquer sur ta feuille ‘database’ quelles lignes sont concernées par des doublons et d’en reporter la liste sur chaque feuille ‘resultats type xx’ concernée. La feuille ‘Provisoire’ étant bien entendu prévue d’être effacée par la suite en fin de code.

Les critères indiqués dans la cellule A4 de la feuille ‘Criteres’ sont selon moi aberrants. En A8, ce n'est pas beaucoup mieux.

Si tu as vraiment 160'000 lignes, ça risque de ramer passablement.

Ca va quand même dans le sens désiré ?

Bonjour à tous

Bonjour Yvouille

Je vous fais part de la proposition que je viens de terminer avant de m’apercevoir que Yvouille avait déjà pris ce problème en mains.

Bye !

Bonjour,

comme je m'y étais mis aussi, voici une autre proposition.

Bonjour le forum,

Bonjour et merci Yvouille, GMB et H2so4,

En deplacement, sans pc, il m'etait difficile de consulter vos reponses.

Je regarde ca tout de suite, j'essaie de comprendre et je reviens vers vous ASAP.

Un grand merci en tout cas.

Cdlt

Un grand merci encore une fois,

Je suis bluffé par les résultats, je savais ma demande compliquée, mais je ne m’attendais pas à de tels résultats.

Je n’ai clairement pas les competences et connaissances nécessaires pour commenter vos codes VBA et je le regrette. Je ne peux que faire des commentaires sur les résultats générés par ceux-ci. Merci cependant pour les commentaires dans les codes, cela m’aide à comprendre un minimum.

@GMB, merci pour votre aide et le temps accorde à l’écriture de ce code.

Dans le choix des critères, quand je souhaite modifier les filtres pour le critère de type 1 par exemple, cette modification n’est pas prise en compte, et le critère type 1 génère toujours les même résultats.

Dans l’onglet résultat généré, l’utilisation de couleurs est intéressant mais a quelle variable ces couleurs sont-elles liées ??

Les doublons s’affichent bien, mais comment puis-je faire pour savoir à quelle ligne se trouve le doublon trouve comme dans le code d’Yvouille?

@Yvouille, de même, merci pour votre aide et le temps accorde à l’écriture de ce code.

Le fait d’indiquer le numéro de ligne dans laquelle se trouve doublon est très utile.

Y-a-t’il cepandant un moyen de ne pas recopier la totalité de l’onglet database mais juste les doublons trouve? Comme le code de GMB et h2so4?

Enfin, comme pour GMB, dans le choix des critères, quand je souhaite modifier les filtres pour le critère de type 1 par exemple, cette modification n’est pas prise en compte, et le critère type 1 génère toujours les même résultats.

@H2so4, encore une fois, merci pour votre aide et le temps accorde à l’écriture de ce code.

La modification du choix des filtres semble fonctionner, ce qui est très utile.

A l’inverse des 2 autres codes, il n’y a pas d’indication sur le numéro de ligne ou se situe le doublon, ce qui rend la tâche difficile lorsqu’il s’agit de vérifier si c’est bien un doublon ou pas. C’est ma faute, je pense ne pas avoir ete assez précis dans l’explication de mon pbm.

Vos 3 codes se complètent.

En terme de format, celui de GMB semble se rapprocher le plus de ce dont j’ai besoin.

Pour récapituler:

  • Mon fichier faisant 160 000 lignes, seuls les doublons doivent apparaitre dans les onglets générés par la commande rechercher.
  • L’indication du numéro de ligne ou se trouve le doublon est tres utile.
  • La modification des filtres en premiere page semble poser pbm.
  • L’utilisation de couleurs est tres interessant et permet de gagner du temps lors de la verification.
  • Peut-on creer une commande qui supprimerait les lignes choisies dans le fichier “database” a partir des resultats generes?

Je vais tacher d’essayer de combiner vos codes, je risque fortement de revenir vers vous :p

Encore une fois merci

Cdlt

RepoK

@Yvouille

J’ai commencé à chercher une solution, mais je ne veux pas aller plus loin si je fais complètement fausse route.

Pas fausse route du tout

Je ne savais pas trop bien sur quelle colonne tu avais trié ta feuille ‘database’ ; j’y ai donc rajouté une colonne cette feuille, j’ai donc ajouté une colonne L avec une numérotation de 1 à xxxx.

En effet tres utile.

Maintenant, si les doublons ainsi trouvés te conviennent, ce sera relativement simple d’aller plus loin et d’indiquer sur ta feuille ‘database’ quelles lignes sont concernées par des doublons et d’en reporter la liste sur chaque feuille ‘resultats type xx’ concernée. La feuille ‘Provisoire’ étant bien entendu prévue d’être effacée par la suite en fin de code.

L'idee serait de generer des feuilles avec doublons en fonction des des filtres appliques, comme GMB et h2so4.

Ensuite, creer une commande pour faire apparaitre ces onglets au sein de la database et les supprimer en un clic.

A l'avenir, je souhaite re utiliser cet outil, car ce fichier de 160 000 lignes est genere tous les mois et je n'ai pas la possibilite de modifier et supprimer en amont du process tous ces doublons.

Les critères indiqués dans la cellule A4 de la feuille ‘Criteres’ sont selon moi aberrants. En A8, ce n'est pas beaucoup mieux.

Ce n'etait qu'un exmple . Encore une fois, l'idee est de pouvoir modifier ces filtres a volonte. Si ce n'est pas possible, je peux creer un tableau avec des filtres fixes qui ne changeront pas.

Cdlt

Bonjour,

numéros de lignes ajoutés

Bonjour tout le monde,

@ repokovskixl

Je n'ai pas trop regardé la solution de gmb et j'ai regardé en vitesse celle de h2so4. Cette dernière me semble vraiment très performante et je suis certain que h2so4 saura répondre à toutes tes attentes.

Bonne continuation.

@h2so4,

Malheureusement, le code ne semble pas fonctionner.

Si par exemple je choisis comme critere juste "Amount in local..." je devrais avoir une quantite importante de doublons, or ils ne s'affichent pas.

Si je choisis d'appliquer les 4 premiers criteres, la recherche se limite a un seul "vendor" etc

Enfin, l'ajout des numeros de lignes n'a pas fonctionne.

J'essaye de chercher pq et reviens vers vous.

Merci encore

Bonsoir,

je t'ai apparemment envoyé une mauvaise version.

Woow, looks great ! merci

J'avoue etre completement perdu a ce niveau :

Set Dico = CreateObject("Scripting.Dictionary")

        For i = 2 To dld
            s = ""
            For j = 1 To dcd
                s = s & db(i, j) & "|"    'on construit une clé sur base des critères
            Next j
            If Not Dico.Exists(s) Then
                Dico.Add s, i
            Else
                l = l + 1
                u = Application.Transpose(Application.Transpose(wsd1.Range(Cells(i, 1).Address & ":" & Cells(i, dcc - 2).Address)))    'copier dans une table à une dimension
                resul(l) = Join(u, "|") & "|" & i & "|" & Dico(s)    ' ajouter ligne correspondant aux critères dans resul
            End If

Pouvez-vous m'expliquer ce que signifient s = s & db(i, j) & "|" et resul(l) = Join(u, "|") & "|" & i & "|" & Dico(s) ??

Dernieres questions et je ne vous embete plus:

  • Serait-il possible de creer une commande qui mettrait en couleur et selectionnerait automatiquement les doublons trouves, dans l'onglet database. L'idee est qu'une fois qu'on les a reperes, on puisse les supprimer facilement.
  • Comment garder le meme format de cellule que l'onglet database (date par exemple dans l'onglet resultats)

Un grand merci, c'est tres efficace, je l'applique au fichier de 160 000 lignes et je re vers vous.

Cdlt

Bonsoir,

ce que fait le code

parcourir toutes les lignes de la db (limitée aux colonnes critères),

pour chaque ligne construire un mot-clé (concaténation des cellules de la ligne)

vérifier si ce mot existe dans un dictionnaire

si le mot n'existe pas l'ajouter ainsi que le numéro de ligne de la DB

si le mot existe, on memorise la ligne de la DB dans un tableau des doublons trouvés

toutes ces opérations visent à optimiser les performances.

dictionnaire code optimiser pour retrouver un mot unique dans une liste de mot

travail sur tableau plutot que sur feuilles et cellules

opération en bloc sur une feuille, plutot que cellules par cellule, ou ligne par ligne quand c'est possible.

Set Dico = CreateObject("Scripting.Dictionary")

        For i = 2 To dld
            s = ""
            For j = 1 To dcd
                s = s & db(i, j) & "|"    'on construit une clé sur base des critères
           Next j
            If Not Dico.Exists(s) Then
                Dico.Add s, i
            Else
                l = l + 1
                u = Application.Transpose(Application.Transpose(wsd1.Range(Cells(i, 1).Address & ":" & Cells(i, dcc - 2).Address)))    'copier dans une table à une dimension
               resul(l) = Join(u, "|") & "|" & i & "|" & Dico(s)    ' ajouter ligne correspondant aux critères dans resul
           End If

j'ai ajouté une macro Hilite pour mettre en couleur dans la DB les lignes contenant des doublons.

Merci pour ces precieuses explications.

La macro tourne plutot bien, il a fallu seulement 8 secondes pour trouver 6000 doublons.

En revanche je n'arrive pas a faire tourner la macro Hilite.

bonsoir,

faire alt-f8 puis sélectionner la macro, puis executer

Non, le lancement de la macro ne pose pas de pbm, mais c'est le choix de la feuille qui ne fonctionne pas.

Autrement tout fonctionne parfaitement, merci bcp

Bonjour,

j'ai effectivement oublier de mentionner qu'il faut sélectionner la feuille résultat (cliquer sur l'onglet) qui t'intéresse avant de lancer la macro.

Bonjour,

je souhaite avoir des informations concernant le codage pour supprimer des doublons.

Je veux suppimer des lignes correspondant à un meme num identifiant avec le meme cleint mais en sommant la valeur de leur chiffre d'affaire sur une période.

ce code supprimer les doublon mais pas tt le tps mais sans me faire la somme du CA

je veux donc un seul client avec la somme total du CA sachant qu'un seul identifiant peut gérer plusieurs client.

Sub SupRapide1Critere()

Application.ScreenUpdating = False

[L1].Sort Key1:=Range("L2"), Order1:=xlAscending, _

Header:=xlGuess

Columns("e:e").Insert Shift:=xlToRight

[E1] = "ColE"

[E2].FormulaR1C1 = "=IF(RC[-1]=R[-1]C[-1],1,0)"

[E2].AutoFill Destination:=Range("E2:E" & [L65000].End(xlUp).Row)

[E:E].Value = [E:E].Value

[L2].CurrentRegion.Sort Key1:=Range("L2"), Order1:=xlAscending, Header:=xlGuess

[E:E].Replace What:="1", Replacement:="", LookAt:=xlPart

Range("E2:E65000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Columns("e:e").Delete Shift:=xlToLeft

End Sub

Bonjour,

le mieux, pour commencer est d'ouvrir un nouveau message et ensuite de joindre un fichier exemple.

dans l'attente de ton nouveau message.

je ne peux pas communiquer mon fichier excel je suis en stage et je ne peux pas divulger des informations je veux juste avoir un codage type


je veux savoir comment on somme le chiffre d affaire en supprimant les doublons

Rechercher des sujets similaires à "vba recherche doublons criteres filtres"