Empecher la creation de doublons sur plusieurs colonnes

Bonjour,

Je cherche a empêcher la création de doublons sur deux colonnes.

sur mon fichier, les données sur les colonnes E et I ne doivent pas se retrouver en double.

La colonne E correspond à la date

La colonne I correspond à un nom. Ce nom est inscrit à partir d'un menu déroulant.

J'ai cherché sur le forum, j'ai testé la mise en forme conditionnelle avec SI, NB.SI, NB.SI.ENS, EQUIV.

J'ai testé en concatainant les données mais rien n'y fait.

Je vous remercie de votre aide

tseoy

15testdoub.xlsm (154.09 Ko)

Bonjour,

C'est la combinaison des 2 colonnes qui doit être unique, ou d'une part les données en E et d'autre part les données en I ?

Bonjour,

c'est la combinaison des deux colonnes.

Merci

Je vous propose une solution sans macro :

13testdoub.xlsm (158.66 Ko)

Liste des modifications :

  • Ajout d'une colonne (en rouge) contenant la concaténation de la DATE et l'AGENT
  • Ajout d'une mise en forme des lignes en doublons sur la base de cette colonne
  • Ajout d'une validation de données personnalisée pour interdire la saisie d'une date aboutissant à un doublon dans cette colonne

ATTENTION : la colonne agent ayant déjà une validation de type liste, je n'ai pas pu faire la même chose. Il faut donc d'abord saisir l'agent PUIS la date pour interdire la saisie d'un doublon.

PS : il est aussi possible de supprimer à posteriori les lignes en doublons (n'en garder qu'une) grâce à l'utilitaire "supprimer les doublons" présent dans le menu "Données".

Merci,

cela fonctionne dans ce sens, mais les collaborateurs ne rentreront pas le nom avant la date.

Si je comprends bien le fait d'avoir un menu déroulant dans la dernière condition empêche l'alerte.

Merci de votre aide

cordialement

Merci,

cela fonctionne dans ce sens, mais les collaborateurs ne rentreront pas le nom avant la date.

Si je comprends bien le fait d'avoir un menu déroulant dans la dernière condition empêche l'alerte.

Merci de votre aide

cordialement

Disons que la validation de données, c'est à ma connaissance, soit une liste (colonne agent), soit une formule personnalisée (colonne date), mais pas les 2 à la fois.

Je pensais qu'en concaténant les deux on pouvait retomber sur une nouvelle base et bloquer la création de doublons.

Merci de t'être penché sur ma problématique

cordialement

Je pensais qu'en concaténant les deux on pouvait retomber sur une nouvelle base et bloquer la création de doublons.

Merci de t'être penché sur ma problématique

cordialement

Le problème c'est que tu ne saisie pas dans le colonne concaténée, puisque c'est une formule. Donc ce n'est pas à cet endroit qu'il faut bloquer la saisie mais bien dans les 2 colonnes concernées. Pour la première c'est ce que j'ai fait, mais la validation de type liste nous empêche de le faire dans la seconde.

Je planche sur une solution VBA.

Salut tseoy,

Salut Pedro ,

une solution full VBA qui calcule une liste de validation en excluant les noms des agents déjà renseignés à la date en [E].

  • un clic en [E] vide affiche par défaut la date de la ligne supérieure si ligne > 3 ;
  • si tous les agents ont déjà un compte à la date, [E] prend par défaut la date du jour si <> de [E] ;
  • si clic en ['I] mais [E] est vide => [E].Select.
If Not Intersect(Target, Range("I:I")) Is Nothing Then
    Range("I:I").Validation.Delete
    If Target.Offset(0, -4) = "" Then
        Target.Offset(0, -4).Select
        Exit Sub
    End If
    iRowT = Target.Row
    Range("AA:AA").Value = ""
    With Worksheets("BDD")
        iRowA = .Range("A" & Rows.Count).End(xlUp).Row
        Range("AA1").Resize(iRowA - 1, 1).Value = .Range("A2:A" & iRowA).Value
    End With
    On Error Resume Next
    iRow = Range("E:E").Find(what:=Range("E" & iRowT).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row
    If iRow < iRowT Then
        For x = iRow To iRowT - 1
            If Range("E" & x).Value = Range("E" & iRowT).Value Then
                Set rCel = Range("AA:AA").Find(what:=Range("I" & x).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext)
                If Not rCel Is Nothing Then rCel.Delete shift:=xlUp
            End If
        Next
    End If
    On Error GoTo 0
    iRow = Range("AA" & Rows.Count).End(xlUp).Row
    If iRow = 1 And Range("AA1").Value = "" Then
        msgbox "Tous les agents ont un enregistrement à cette date!", vbCritical + vbOKOnly, "Heures Sup"
        Range("E" & iRowT).Value = ""
        If iRowT > 3 Then Range("E" & iRowT).Value = IIf(CDate(Range("E" & iRowT - 1).Value) <> Date, Date, "")
        Range("E" & iRowT).Select
    Else
        Range("I" & iRowT).Validation.Add Type:=xlValidateList, Formula1:="=AA1:AA" & iRow
    End If
End If

A tester en situation réelle...

A+

3tseoy.xlsm (156.01 Ko)

Salut curulis57,

Très joli travail ! Je post quand même le miens qui n'est pas aussi complet :

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 5 Or Target.Column = 9 Then 'Si modification en colonne E ou I
    If Application.CountIf(Range("J:J"), Cells(Target.Row, 5) * 1 & "_" & Cells(Target.Row, 9)) > 1 Then 'Si présence d'un doublon avec colonne J
        MsgBox "La combinaison agent et date suivante : " & Cells(Target.Row, 9) & " le " & Cells(Target.Row, 5) & " existe déjà !" 'Message d'erreur
        Target.Value = "" 'Suppression de la valeur saisie
    End If
End If

End Sub

C'est une macro évenementielle qui se déclenche automatiquement lors d'une modification en colonne E ou I.

Le fichier :

11testdoub-v2.xlsm (161.36 Ko)

Super

je vous remercie tous les deux

Cordialement

tseoy

Rechercher des sujets similaires à "empecher creation doublons colonnes"