Macro complémentaire de dédoublonnage pour excel

Description

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 / Exemple :


'*********************************************************
' 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.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.