Vérification des doublons

Salut le forum,

Je sollicite votre aide afin d'améliorer une macro qui fait le transfert des données depuis la feuille 1 (après saisie) à la feuille 4

Les données sur la feuille 1 sont organisées sous forme des plages, chaque plage est identifiée par un acronyme

Je souhaite avant de faire le transfert des données avoir un contrôle sur la date (date sur la feuille 1 "C26" qui correspond à la colonne statut dans le tableau sur la feuille 4) et l'acronyme

si la date sur la feuille 1 = la date de la colonne A sur le tableau dans la feuille 4 et l'acronyme est identique sur les deux feuilles

alors un message box apparaissait pour deux choix :

soit Oui pour remplacer les anciens par les nouvelles données.

ou Non pour arrêter la macro de transfert

je vous remercie d'avance pour votre aide, mon fichier exemple ci-joint

12classeur2.xlsm (31.02 Ko)

Bonjour,

pourriez-vous svp me donner un coup de main

enfaite, j'ai besoin d'une macro qui me permet de faire le contrôle des lignes doublon sur le tableau

Si la date sur la colonne "A" et l'acronyme sur la colonne "C" sont répétés alors un message Box apparaissait "Voulez-vous écraser les données déjà sauvegarde"

avec deux possibilités

soit oui pour suppression de la première ligne en double

ou non pour suppression de la dernière ligne en double
merci bcp image
4exemple-bd.xlsm (28.64 Ko)

Hello,

Voici une proposition (ça ne gère que des lignes en doubles, pas les triplons, quadruplons ect ... )

Public Function SupprimeDoublon(strTheDate As String, strAcronyme As String) As Boolean

    Dim loBdd As ListObject
    Dim strConcat As String
    Dim varReponse As Variant
    Dim lrRow As ListRow
    Dim colRowNumber As Collection

    Set loBdd = ActiveSheet.ListObjects("BD_TODO")
    strConcat = strTheDate & strAcronyme
    For Each lrRow In loBdd.ListRows
        If lrRow.Range(1).Value & lrRow.Range(3).Value = strConcat Then
            If colRowNumber Is Nothing Then
                Set colRowNumber = New Collection
                colRowNumber.Add CStr(lrRow.Range.Row)
            Else
                colRowNumber.Add CStr(lrRow.Range.Row)
            End If
        End If
    Next lrRow
    If Not colRowNumber Is Nothing Then
        If colRowNumber.Count = 2 Then
            varReponse = _
                    MsgBox("Des lignes en doubles sont présentes concernant la date du : " & strTheDate & _
                    " et de l'acronyme : " & strAcronyme & vbNewLine & _
                    "Voulez-vous écraser les données déjà sauvegarde ?", vbYesNo)
            If varReponse = vbYes Then
                ActiveSheet.Rows(CInt(colRowNumber(1))).Delete
            Else
                ActiveSheet.Rows(CInt(colRowNumber(2))).Delete
            End If
        Else 'rien à faire
        End If
    Else 'rien à faire
    End If
    Set loBdd = Nothing
    Set colRowNumber = Nothing

End Function

Hi @Rag02700,

merci pour la proposition, mais je pense que "strTheDate" non définie

ainsi pourriez-vous svp me dire comme fonctionne Public Function

bonjour Niba

Sub Supprimer_Doublons()
     Dim LO, i, b, Ligne, sAnsw, aA, cnt
     With Sheets("feuil4")                   'votre feuille
          Set LO = .ListObjects("BD_TODO")   'votre tableau
          LO.ListColumns("Date").DataBodyRange.Name = "MaDate"     'colonne des dates
          LO.ListColumns("Acronyme").DataBodyRange.Name = "MonAcronyme"     'colonnes des acronymes

          Do                                 'boucle
               For i = 1 To LO.ListRows.Count     'boucle toutes les lignes
                    b = (WorksheetFunction.CountIfs(Range("MaDate"), Range("MaDate").Cells(i, 1), Range("MonAcronyme"), Range("MonAcronyme").Cells(i, 1)) > 1)     'compte doublons de date et d'acronyme
                    If b Then                'si doublons
                         aA = Application.Transpose(Evaluate(Replace(Replace("if((madate=#)*(monacronyme=@),row(madate),""~"")", "#", Range("MaDate").Cells(i, 1).Value2), "@", Chr(34) & Range("MonAcronyme").Cells(i, 1).Value & Chr(34))))
                         fl = Filter(aA, "~", 0)     'matrice avec les lignes "doublons"
                         sAnsw = Application.InputBox("il y a des doublons sur les lignes " & Join(fl, ", ") & vbLf & vbLf & "P=supprimer le premier : " & fl(0) & vbLf & "D=supprimer le dernierer : " & fl(UBound(fl)) & vbLf & vbLf & "A=Arrêter", "Supprimer les doublons", "P", , , , , 2)
                         Select Case UCase(sAnsw)
                              Case "A": GoTo FIN     'arrêter
                              Case "P": Ligne = fl(0)     'supprimer le premier
                              Case "D": Ligne = fl(UBound(fl))     'supprimer le dernier
                              Case Else: Ligne = "x"     'créer non-numeric
                         End Select
                         If IsNumeric(Ligne) Then LO.ListRows(Ligne - LO.Range.Row).Delete: cnt = cnt + 1     'supprimer listrow et incrementer compteur
                         Exit For
                    End If
               Next
          Loop While b
     End With

FIN:
     MsgBox "on a supprimé " & cnt & " lignes"
End Sub
2exemple-bd.xlsm (36.04 Ko)
6exemple-bd.xlsm (36.29 Ko)

même solution avec "oui" et "non"

Bonjour @BsAlv,

Merci pour vos solution, celle de "oui" et "non" me convient parfaitement, malgré que l'autre est originale

Rechercher des sujets similaires à "verification doublons"