Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MACRO COMPLÉMENTAIRE DE DÉDOUBLONNAGE POUR EXCEL


Information sur la source

Catégorie :VBA Classé sous : dédoublonnage, doublon, excel, vba, doublons Niveau : Initié Date de création : 20/03/2006 Date de mise à jour : 22/03/2006 10:48:00 Vu / téléchargé: 24 045 / 10 473

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Cette macro permet de dédoublonner une base excel en fonction de colonnes ou en-têtes de colonnes choisies par l'utilisateur.
Le classeur contient :
* un menu "Dédoublonnage" qui se met en place à l'ouverture (permettant de choisir le dédoublonnage en prenant en compte ou non la première ligne),
* un formulaire de selection permettant de sélectionner la ou les colonnes à prendre en compte et de choisir l'ordre dans lequel les colonnes seront triées,  (il est autonome et peut être utilisé dans un autre projet)
* du code VBA dont le code servant au dédoublonnage (dans le module "Dedoublonnage") présenté ci-après peut être inclu dans un autre projet.
 

Source

  • '*********************************************************
  • ' Une partie du code qui peut être utilisée séparément *
  • ' avec un exemple d'utilisation *
  • '*********************************************************
  • Sub Exemple()
  • 'Pour inséere cette macro à un autre projet copier ce module
  • 'appeler la procédure suivante
  • 'Dedoublonnage(ListCol, LigneEnTete)
  • 'ListCol : tableau contenant les numéros de colonne
  • ' si une seule colonne x utiliser quand-même un tableau : array(x)
  • 'LigneEnTete : True si la première ligne est une ligne d'entête
  • ' False s 'il n'y a pas de ligne d'entête
  • 'L'exemple suivant fait le dédoublonnage sur les colonnes 1 et 3
  • 'la première ligne étant l'entête
  • 'La première clé de tri est la colonne 1 et la seconde la colonne 3
  • Call Dedoublonnage(Array(1, 3), True)
  • End Sub
  • Sub ProcDedoublonnage(ListCol, LigneEnTete) 'LigneEnTete = True ou False
  • Cells(1, 1).Select
  • ListCol2 = IntervertionTab(ListCol)
  • If LigneEnTete Then
  • NumLig = 2
  • Else
  • NumLig = 1
  • End If
  • NoLgnFin = ActiveSheet.UsedRange.Rows.Count
  • NoColFin = ActiveSheet.UsedRange.Columns.Count
  • Min = LBound(ListCol2)
  • Max = UBound(ListCol2)
  • ReDim TabTest1(Max - Min)
  • ReDim TabTest2(Max - Min)
  • For I = Min To Max
  • Call TriTab(ListCol2(I), NumLig)
  • Next I
  • ' Tag des Doublons
  • For Ligne = NumLig To NoLgnFin - 1
  • CptColTest = Min
  • For CptTabTest = LBound(TabTest1) To UBound(TabTest1)
  • TabTest1(CptTabTest) = Cells(Ligne, ListCol2(CptColTest))
  • TabTest2(CptTabTest) = Cells(Ligne + 1, ListCol2(CptColTest))
  • CptColTest = CptColTest + 1
  • Next CptTabTest
  • VarEstDoublon = EstDoublon(TabTest1, TabTest2)
  • If VarEstDoublon Then
  • Cells(Ligne + 1, NoColFin + 1).Value = "Doublon"
  • Mini1Doublon = True
  • End If
  • Next Ligne
  • ' Suppression des doublons
  • If Mini1Doublon Then
  • Call TriTab(NoColFin + 1, NumLig)
  • LigDoub = NumLig
  • Do While Cells(LigDoub + 1, NoColFin + 1).Value = "Doublon"
  • LigDoub = LigDoub + 1
  • Loop
  • Range(Cells(NumLig, NoColFin + 1), Cells(LigDoub, NoColFin + 1)).EntireRow.Delete 'Select
  • End If
  • End Sub
  • Sub TriTab(NumCol, NumLig)
  • If NumLig = 2 Then
  • Entete = xlYes
  • Else
  • Entete = xlGuess
  • End If
  • Selection.Sort Key1:=Cells(NumLig, NumCol), Order1:=xlAscending, Header:=Entete, _
  • OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  • End Sub
  • Function EstDoublon(Tab1, Tab2)
  • EstDoublon = True
  • NbChamp = UBound(Tab1)
  • If NbChamp = UBound(Tab2) Then
  • I = 0
  • Do
  • If Tab1(I) <> Tab2(I) Then
  • EstDoublon = False
  • End If
  • I = I + 1
  • Loop While EstDoublon = True And I <= NbChamp
  • Else
  • EstDoublon = False
  • End If
  • End Function
  • Function IntervertionTab(Tableau)
  • Min = LBound(Tableau)
  • Max = UBound(Tableau)
  • Nb = (Max - Min + 1) \ 2
  • For I = Min To Nb - 1 + Min
  • VarIntermed = Tableau(I)
  • Tableau(I) = Tableau(Max - I + Min)
  • Tableau(Max - I + Min) = VarIntermed
  • Next I
  • IntervertionTab = Tableau
  • End Function
'*********************************************************
' Une partie du code qui peut être utilisée séparément   *
' avec un exemple d'utilisation                          *
'*********************************************************
Sub Exemple()
'Pour inséere cette macro à un autre projet copier ce module
'appeler la procédure suivante
'Dedoublonnage(ListCol, LigneEnTete)
'ListCol : tableau contenant les numéros de colonne
'          si une seule colonne x utiliser quand-même un tableau : array(x)
'LigneEnTete : True si la première ligne est une ligne d'entête
'               False s 'il n'y a pas de ligne d'entête
'L'exemple suivant fait le dédoublonnage sur les colonnes 1 et 3
'la première ligne étant l'entête
'La première clé de tri est la colonne 1 et la seconde la colonne 3
Call Dedoublonnage(Array(1, 3), True)
End Sub
Sub ProcDedoublonnage(ListCol, LigneEnTete) 'LigneEnTete = True ou False
    Cells(1, 1).Select
    ListCol2 = IntervertionTab(ListCol)
    If LigneEnTete Then
        NumLig = 2
    Else
        NumLig = 1
    End If

    NoLgnFin = ActiveSheet.UsedRange.Rows.Count
    NoColFin = ActiveSheet.UsedRange.Columns.Count
    Min = LBound(ListCol2)
    Max = UBound(ListCol2)
    ReDim TabTest1(Max - Min)
    ReDim TabTest2(Max - Min)
    For I = Min To Max
        Call TriTab(ListCol2(I), NumLig)
    Next I
    ' Tag des Doublons
    For Ligne = NumLig To NoLgnFin - 1
        CptColTest = Min
        For CptTabTest = LBound(TabTest1) To UBound(TabTest1)
            TabTest1(CptTabTest) = Cells(Ligne, ListCol2(CptColTest))
            TabTest2(CptTabTest) = Cells(Ligne + 1, ListCol2(CptColTest))
            CptColTest = CptColTest + 1
        Next CptTabTest
    VarEstDoublon = EstDoublon(TabTest1, TabTest2)
    If VarEstDoublon Then
    Cells(Ligne + 1, NoColFin + 1).Value = "Doublon"
    Mini1Doublon = True
    End If
    Next Ligne
    ' Suppression des doublons
        If Mini1Doublon Then
            Call TriTab(NoColFin + 1, NumLig)
            LigDoub = NumLig
            Do While Cells(LigDoub + 1, NoColFin + 1).Value = "Doublon"
                LigDoub = LigDoub + 1
            Loop
        Range(Cells(NumLig, NoColFin + 1), Cells(LigDoub, NoColFin + 1)).EntireRow.Delete 'Select
        End If
End Sub
Sub TriTab(NumCol, NumLig)
    If NumLig = 2 Then
        Entete = xlYes
    Else
        Entete = xlGuess
    End If
    Selection.Sort Key1:=Cells(NumLig, NumCol), Order1:=xlAscending, Header:=Entete, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Function EstDoublon(Tab1, Tab2)
    EstDoublon = True
    NbChamp = UBound(Tab1)
    If NbChamp = UBound(Tab2) Then
    I = 0
        Do
            If Tab1(I) <> Tab2(I) Then
                EstDoublon = False
            End If
            I = I + 1
        Loop While EstDoublon = True And I <= NbChamp
    Else
        EstDoublon = False
    End If
End Function
Function IntervertionTab(Tableau)
    Min = LBound(Tableau)
    Max = UBound(Tableau)
    Nb = (Max - Min + 1) \ 2
    For I = Min To Nb - 1 + Min
        VarIntermed = Tableau(I)
        Tableau(I) = Tableau(Max - I + Min)
        Tableau(Max - I + Min) = VarIntermed
    Next I
    IntervertionTab = Tableau
End Function

Conclusion

Prochainement, présentation du  module "Assistant" de cette source.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • dedoublonnage.xlaTélécharger ce fichier [Réservé aux membres club]84 480 octets

Télécharger le zip

Historique

20 mars 2006 17:49:26 :
Modification de l'exemple.
20 mars 2006 18:02:31 :
Suppression d'une ligne de code en double (deux fois le même tri)
22 mars 2006 10:48:00 :
Correction d'un bug (une ligne avait été placée en commentaire pour test) Ajout de deux boutons sur le formulaire : tout selectionner et tout déselectionner.

Commentaires et avis

signaler à un administrateur
Commentaire de jacquito le 16/04/2006 17:30:27

Bravo,
effectivement XL gere pas le dédoublonnage sur des colonnes disjointes, ce que ton programme permet. C'est un bon début.


Quelques remarques afin d'améliorer ta prochaine version :

Ton traitement trie ma feuille or je ne veux que supprimer les doublons

Pour etre plus rapide :
- Faire tout le traitement séquentiel en tableau et ne pas utiliser les cellules de la feuille (par exemple dans la comparaison). Quitte a copier tout dans un tableau au début et recopier les valeurs uniquement à la fin du traitement en supprimant les lignes doublonnées.  
- Eviter toute lecture séquentiel de la feuille (par exemple pour la suppression, tu devrais sélectionner tous les enregistrements "Sans Doublon" puis les supprimer en bloc.  

Pour dédoublonner j'utilise en VBA une autre methode :
je recopie les colonnes à dédoublonner (àpres la derniere colonne utilisés)
j'execute un filtre élaboré (en cochant la case sans doublon eten selectionnant les colonnes que j'ai rajouté) puis je supprime les colonnes rajouter

signaler à un administrateur
Commentaire de Soni22 le 29/10/2007 16:31:56 7/10

Salut,

j'ai testé ton code, parce que j'ai une macro qui importe environ 600 lignes de données et checher les doublons peut s'avérer tres difficile.

je trouve qu'il est très bien fait, merci de nous faire partager ces infos.

Cdt

Sony

signaler à un administrateur
Commentaire de tibofo le 07/12/2008 20:34:30

Bonjour, je n'arrive pas à l'utiliser. Je l'ai installé sur Excel 2003, je vois bien le nouveau menu mais qd je clique sur entête ou colonne, il ne se passe rien du tout : aucun formulaire n'apparait.
Que faut-il faire ?

MErci
Thibault

signaler à un administrateur
Commentaire de sybacs le 08/12/2008 10:08:37

Thibault,

Si la cellule A1 est vide, le dédoublonnage ne s'effectue pas.
Les entêtes doivent se situer en ligne 1 (à partir de colonne A) s'il y en a. S'il n'y a pas d'entête la première ligne à dédoublonner doit être en ligne 1)

Sylvain

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

vba excel combobox tri et élimination des doublons [ par alex1512 ] Bonjour,Je souhaiterais mettre les éléments d'une colonne d'une feuille excel dans une combobox sous vba(jusque la pas de problème) mais je souhaitera Vba Excel filtre de doublons [ par rvw68 ] BonjoursJ'ai une plage de données contenant des Nr d'emplacements. une autre dans laquelle j'attribue les emplacements à des personnes. Je veux avoir Recherche de doublons [ par RUGBYMAN78 ] Bonjour à tous ! J'ai quelques soucis avec vba sous excel. Tout d'abord, j'ai suivi une initiation à vba , mais voilà déjà 2 ans de passés, et mes sou vba excel +liste déroulante [ par flyersgoaler ] Bonjour, j'ai inséré une liste déroulante dans une cellule sur excel.  Chaque nom inséré dans la liste déroulante correspond à mes douze feuilles qui [VBA / macro excel] remise à vide de cellules à chaque début de mois. [ par hazzel ] Bonjour à tous,Je souhaiterai savoir s'il était possible à l'ouverture d'un classeur excel, de prendre en compte la date (inscrite dans une cellule vi ACTIVER modules 2003 dans VBA 2007 [ par vinou19 ] Bonjour,Je développe en amateur éclairé sous excel et word depuis 23 ans, c'est dire que je me suis adaptée de façon autodidacte à toutes les versions defilement feuilles excel vba [ par Mitchouboy33 ] bonjour à tous, voila j'ai un problème dans un de mes codes sous vba, je crée une base de données avec une feuille excel choisie au démarrage. Cette f VBA Excel Lien hypertect [ par Teleron ] Bonjour à tous.J'ai inséré un lien hypertexte sur un bouton vers un classeur Excel mais je ne parviens pas à faire ce lien vers une feuille précise de Passage fonction Excel dans Function VBA [ par naturel45 ] Bonsoir,je cherche à passer en paramètre une fonction logique Excel dans une function perso;Sous Excel;   MaFunction(A1:A9;OU(B1;C1))MaFunction(Plage convertion 2003-2000 vba recherche de feuille excel [ par jerem5252 ] Bonjour à tous,j ai un prob avec une partie de code lorsque je passe de  excel 2003 à 2000.Dim strmessage  As String    Dim i As Long        Set fs =


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.