Supprimer les doublons dans certains cas

Bonjour tout le monde,

Je n’arrive pas à continuer la macro SupprimeDoublons malgré pas mal de tentatives.

Dans l’état actuel le but de cette macro c’est qu’en cas d’erreur dans la dernière saisie on puisse la corriger, on refait une nouvelle saisie et la macro supprime la ligne du dessus « exemple 1 dans la feuille Bdd » le doublon du dessus sera supprimé ave le message "Les Données sont Enregistrées jusque-là tout va bien, ça marche.

Je voudrais maintenant interdire la saisie des doublons qui ont une date inférieure à la date de saisie comme exemple 2, ou supprimer la dernière saisie, avec l’annulation du MsgBox du premier cas et affiché un nouveau MsgBox du style les données non enregistrées. (le nombre de lignes par année dans Bdd sera d’environ 500 ligne se qui comporte le risque d’erreur de date).

Pour info et en cas de besoin le MOT DE PASSE c’est le chiffre 1

J’espère avoir été clair et vous remercie pour votre aide

Bonjour,

Pourquoi ne pas détecter l'anomalie dès la saisie de la date dans l'onglet "Formulaire" et interdire l'enregistrement s'il y a déjà des infos saisies à cette même date ?

Ce serait plus simple, il n'y aurait pas de suppression de doublons à traiter, non ?

Cdlt,

Cylfo

bonjour Cylfo, et merci pour la réponse,

j'ai essayé de le faire sur le bouton,

mais si je le fais sur la cellule, automatiquement il m'empêche de faire une correction sur une même date comme dans le cas 1,

ce qui doit pouvoir se faire.

je voudrais l'interdire uniquement si la date est antérieure comme l'exemple 2

Re,

C'est possible en testant si la date renseignée correspond à la dernière du tableau, les contrôles sont fait suite à las saisie de la date.

Je te joins une proposition basée sur le contrôle de la date dans le formulaire, contrôle refait également au moment de l'enregistrement. J'ai modifié le tableau des données en tableau structuré (TS) nommé "T_CONVOCS" et j'ai également nommé dans l'onglet "Formulaire" la cellule de la date en "V_DT_CONVOC".

Le code est dans l'évènement "Worksheet_Change" du module associé à l'onglet "Formulaire" et j'ai adapté l'enregistrement dans le "module 1" pour utiliser les propriétés des TS.

Je te laisse regarder et me revenir si tu as besoin de plus amples informations.

Cdlt,

Cylfo

merci pour ta réponse, Jai peut-être pas tout compris mais c'est pas très grave, je vais approfondir.

mais à première vue çà semble faire ce que je voudrais sauf les deux choses suivantes:

1°) dans ton fichier si on remet une date quelconque dans formulaire après une saisie, les anciennes valeurs réapparaissent en E4, E6 ...., il faudrait que les cellules soient vides pour la nouvelle saisie.

2°) Si tu regarde mon fichier et que tu refait une saisie avec la dernière date enregistrée dans Bdd comme l'exemple ci-dessous,

ligne 6 30/08/2025 1 2 3 4 2

ligne 7 30/08/2025 1 2 3 4 6

à la fin de la macro les valeurs de la ligne 6 n'existe plus elles sont remplacées par les valeurs de la ligne 7 il n'y a plus de doublons. dans ton fichier les doublons restent et il ne faut pas.

Je vais quand même commencer à modifier mon fichier original en attendant de voir si tu peux m'aider sur les deux points.

Encore merci pour ton aide

Je corrige !!!

Re,

J'ai corrigé le pbm du doublon par contre je ne comprends pas le point 1. Après l'enregistrement, les valeurs sont effacées, elles ne réapparaissent pas. Le seul cas où les anciennes valeurs sont affichées c'est lorsque tu saisis une date correspondant à la dernière date de convocation et qui, sauf erreur de compréhension, correspond au cas où tu veux autoriser la modification.

Cdlt,

Cylfo

merci beaucoup, pour l'instant, laisse comme ça je vais modifier mon fichier orignal et faire quelques essais,

le point 1 c'est uniquement le cas de correction autorisé donc sil doit y avoir des corrections pour ne pas induire en erreur je voulais que la personne retape

toutes les valeurs (ce fichier c'est pour une toute petite assos et le fichier va être rempli par des personnes qui ont peux de pratique sur un ordi)

je vais laisser quelques jours le post ouvert, avant de revenir vers toi si besoin

bon weekend

Ok. En cas de modification si tu veux que les personnes ressaisissent les valeurs : dans le module associé à l'onglet "Formulaire" et la procédure "WorkSheet_Change ", il suffit de mettre en commentaire les lignes comme ci-dessous en fin de procédure à partir du ElseIf :

' Evènement déclenché par la modification de la valeur d'une cellule
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nDerLigDtConvoc As Long
Dim dDerDtConvoc As Date
   ' Si la cellule modifiée n'est pas celle de la date de convocation => sortie
   If Application.Intersect(Target, ActiveSheet.Range("V_DT_CONVOC")) Is Nothing Then Exit Sub
   ' Vérifier que le format correspond bien à une date
   If Target.Value = "" Or IsDate(Target.Value) = False Then
      MsgBox "La date de convocation ne correspond pas à un format de date valide ...", vbExclamation, "Date de convocation incorrecte"
      ' Annuler la saisie
      AnnuleSaisie
      Exit Sub
   End If
   ' Contrôle de la date par rapport à la dernière date de convocation saisie
   With Worksheets("Bdd").ListObjects("T_CONVOCS")
      nDerLigDtConvoc = .ListRows.Count
      dDerDtConvoc = .ListColumns("Date").DataBodyRange(nDerLigDtConvoc).Value
      ' Si la date saisie est antérieure => message d'erreur et sortie
      If Target.Value < dDerDtConvoc Then
         MsgBox "Vous ne pouvez pas saisir une convocation antérieure à la dernière réalisée en date du " & dDerDtConvoc & " ...", vbExclamation, "Convocation impossible"
         AnnuleSaisie
         Exit Sub
      ' Si la date correspond à la dernière convocation => rapatrier les donnée
      'ElseIf Target.Value = dDerDtConvoc Then
      '   ActiveSheet.Range("E4").Value = .ListColumns(TC_COL_NB_CONV).DataBodyRange(nDerLigDtConvoc).Value
      '   ActiveSheet.Range("E6").Value = .ListColumns(TC_COL_CONV_FLUX).DataBodyRange(nDerLigDtConvoc).Value
      '   ActiveSheet.Range("E8").Value = .ListColumns(TC_COL_CONV_STOCK).DataBodyRange(nDerLigDtConvoc).Value
      '   ActiveSheet.Range("E10").Value = .ListColumns(TC_COL_NB_PRES).DataBodyRange(nDerLigDtConvoc).Value
      '   ActiveSheet.Range("E13").Value = .ListColumns(TC_COL_NB_PRES).DataBodyRange(nDerLigDtConvoc).Value
      End If
   End With
End Sub

Cdlt,

Cylfo

Bonjour Cylfo,

Je reviens te remercier, mon fichier est maintenant terminé grâce à toi. 
Il fonctionne parfaitement avec les deux possibilités que tu m'as donné, j'ai commencé ce matin 
à entrer des données réelles et ça correspond parfaitement.
Il ne me reste plus qu'à créer des filtres pour récupérer les données et les transformer en euros pour la compta.

 je te souhaite une bonne fin d'apprès midi, et je te remercie beaucoup. 

Ci dessous la version finale.

 ' Evènement déclenché par la modification de la valeur d'une cellule
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nDerLigDtConvoc As Long
Dim dDerDtConvoc As Date
   ' Si la cellule modifiée n'est pas celle de la date de convocation => sortie
   If Application.Intersect(Target, ActiveSheet.Range("V_DT_CONVOC")) Is Nothing Then Exit Sub
   ' Vérifier que le format correspond bien à une date
   If Target.Value = "" Or IsDate(Target.Value) = False Then
      MsgBox "La date de convocation ne correspond pas à un format de date valide ...", vbExclamation, "Date de convocation incorrecte"
      ' Annuler la saisie
      AnnuleSaisie
      Exit Sub
   End If
   ' Contrôle de la date par rapport à la dernière date de convocation saisie
   With Worksheets("Bdd").ListObjects("T_CONVOCS")
      nDerLigDtConvoc = .ListRows.Count
      dDerDtConvoc = .ListColumns("Date").DataBodyRange(nDerLigDtConvoc).Value
      ' Si la date saisie est antérieure => message d'erreur et sortie
      If Target.Value < dDerDtConvoc Then
         MsgBox "Vous ne pouvez pas saisir une convocation antérieure à la dernière réalisée en date du " & dDerDtConvoc & " ...", vbExclamation, "Convocation impossible"
         AnnuleSaisie
         Exit Sub
      ' Si la date correspond à la dernière convocation => rapatrier les donnée
      'ElseIf Target.Value = dDerDtConvoc Then
         'ActiveSheet.Range("E4").Value = .ListColumns(TC_COL_NB_CONV).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E6").Value = .ListColumns(TC_COL_CONV_FLUX).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E19").Value = .ListColumns(TC_COL_CONV_STOCK).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E8").Value = .ListColumns(TC_COL_NB_PRES).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E10").Value = .ListColumns(TC_COL_NB_ABS).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I5").Value = .ListColumns(TC_COL_NB_AS_SDSEI).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I6").Value = .ListColumns(TC_COL_NB_AS_CCAS).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I7").Value = .ListColumns(TC_COL_NB_AGV_SOCIAL).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I8").Value = .ListColumns(TC_COL_NB_ALIE).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I9").Value = .ListColumns(TC_COL_NB_PLIE).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I10").Value = .ListColumns(TC_COL_NB_FT_socio_prof).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I11").Value = .ListColumns(TC_COL_NB_GERMINAL).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I12").Value = .ListColumns(TC_COL_NB_INTECAD).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I13").Value = .ListColumns(TC_COL_NB_FT_prof).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I14").Value = .ListColumns(TC_COL_NB_VIDE1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I15").Value = .ListColumns(TC_COL_NB_VIDE2).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E21").Value = .ListColumns(TC_COL_NB_PRES1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E23").Value = .ListColumns(TC_COL_NB_ABS1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I20").Value = .ListColumns(TC_COL_NB_AS_SDSEI1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I21").Value = .ListColumns(TC_COL_NB_AS_CCAS1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I22").Value = .ListColumns(TC_COL_NB_AGV_SOCIAL1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I23").Value = .ListColumns(TC_COL_NB_ALIE1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I24").Value = .ListColumns(TC_COL_NB_PLIE1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I25").Value = .ListColumns(TC_COL_NB_FT_socio_prof1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I26").Value = .ListColumns(TC_COL_NB_GERMINAL1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I27").Value = .ListColumns(TC_COL_NB_INTECAD1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I28").Value = .ListColumns(TC_COL_NB_FT_prof1).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I29").Value = .ListColumns(TC_COL_NB_VIDE3).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("I30").Value = .ListColumns(TC_COL_NB_VIDE4).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M4").Value = .ListColumns(TC_COL_NB_A_RECONVOQUER).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M6").Value = .ListColumns(TC_COL_NB_SAISINE_EPC).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M8").Value = .ListColumns(TC_COL_NB_SORTIES_DU_DISPO).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M8").Value = .ListColumns(TC_COL_NB_SORTIES_DU_DISPO).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("O13").Value = .ListColumns(TC_COL_NB_Nbre_convoquées_sanction_en_cours).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M15").Value = .ListColumns(TC_COL_NB_Levée_sanction).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M17").Value = .ListColumns(TC_COL_NB_Maintien_sanction_absent).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M20").Value = .ListColumns(TC_COL_NB_FT_Lons).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M22").Value = .ListColumns(TC_COL_NB_Jean_Zay).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("M24").Value = .ListColumns(TC_COL_NB_Lyautey).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E13").Value = .ListColumns(TC_COL_NB_FLUX_Sur_site_PE).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E14").Value = .ListColumns(TC_COL_NB_FLUX_CD_tél).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E15").Value = .ListColumns(TC_COL_NB_FLUX_Attribution_Directe).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E25").Value = .ListColumns(TC_COL_NB_STOCK_Sur_site_PE).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E26").Value = .ListColumns(TC_COL_NB_STOCK_CD_tél).DataBodyRange(nDerLigDtConvoc).Value
         'ActiveSheet.Range("E27").Value = .ListColumns(TC_COL_NB_STOCK_Attribution_Directe).DataBodyRange(nDerLigDtConvoc).Value

      End If
   End With
End Sub

Re,

Merci pour ton retour et bonne saisie

Cdlt,

Cylfo

Bonjour Papi64,

Le bug (Erreur 13 - Incompatibilité de type) au niveau de la date, lorsque tu utilises la touche "Suppr" est lié au fait que les cellules sont fusionnées. Je te joins une V4 qui corrige ce bug mais si tu as déjà fait des saisies, tu peux reporter la modification, il y a une seule ligne à remplacer que je t'indique ci-dessous, ligne sous "<<<<<<<" :

' Evènement déclenché par la modification de la valeur d'une cellule
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nDerLigDtConvoc As Long
Dim dDerDtConvoc As Date
   ' Si la cellule modifiée n'est pas celle de la date de convocation => sortie
   If Application.Intersect(Target, ActiveSheet.Range("V_DT_CONVOC")) Is Nothing Then Exit Sub
   ' Vérifier que le format correspond bien à une date
'<<<<<<<<< Ci-dessous, la seule ligne à substituer à celle présente dans la V3 >>>>>>>>>>>
   If Target.Cells(1, 1).Value = "" Or IsDate(Target.Cells(1, 1).Value) = False Then
      MsgBox "La date de convocation ne correspond pas à un format de date valide ...", vbExclamation, "Date de convocation incorrecte"
      ' Annuler la saisie
      AnnuleSaisie
      Exit Sub
   End If

Cdlt,

Cylfo

Rechercher des sujets similaires à "supprimer doublons certains cas"