RECHERCHE DES DOUBLONS

Résolu

Bonjour

je cherche une formule s'il existe  ou bien faire une procédure en vba

une astuce pour chercher et signaler les doublons sur plusieurs feuille

dans un classeur excell

exemple j'ai  N° Fact sur plusieurs feuille est ce qu'il ya  une solution

pour contrôler les doublons (comme mfc: nb.si(.....)>1)

merci d'avance.

13 réponses

  1. oui

    mais le nouveau code m'indique le chemin oû ce trouve le doublon

    1. re;

      pardon je revient :  il ya pas de doublon le transfert ne marche pas

      Call valider(st, li)
        Sheets(FJ).Cells(li, co).Value = txtS
        Sheets(FJ).Cells(li, co).Interior.ColorIndex = rouge

      ne s’exécute pas msg: doublon a la ligne 2

      c'est pas nécessaire de faire le contrôle sur date en A6

      merci.

      1. Contributeur

        Il faut reprendre l'ancienne version de valider(), il n'est plus utile d'y tester les doublons.

        .

        Le contrôle sur "Date" se fait pour ne chercher les doublons que dans les feuilles de destination.

    2. oui

      le contrôle ce fait surtout sur les N° fact ou chèque

      colonne B.

      maintenant j'ai exécuter le nouveau code et ca marche très bien (le bouton reste vert

      et le transfert de ligne n'est pas effectuer et indique ou ce trouve le doublon)

      c'est ce que je cherche a faire

      merci beaucoup monsieur

      si jamais, comment est ce que je veux revenir

      encore merci et bonne journée.

      1. Contributeur

        revenir?

    3. Contributeur

      Ce code ( pour la feuille MVT Journalier) recherche un doublon dans toutes les feuilles ayant "Date" en A6:

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Const cofacFJ = 11  ' numero de colonne de la facture dans la feuille source
      Const cofacFS = 2  ' numero de colonne de la facture dans la feuille destination
      Dim li As Long, co As Long, st As String, s As String, doub As Range, fl As Worksheet
      li = Target.Row
      co = Target.Column
      If Target.Value = "" Then GoTo fin
      If li < lidebFJ Then GoTo fin
      If Not Intersect(Target, Columns(coclic)) Is Nothing Then
          s = Target.Value
          If s = txtS Then MsgBox "ligne déjà traitée ": GoTo fin
          st = Cells(li, codatFJ + 2).Value
          If st = "" Then GoTo fin
          For Each fl In ThisWorkbook.Worksheets
              If fl.[A6] = "Date" Then
                  Set doub = fl.Columns(cofacFS).Find(Sheets(FJ).Cells(li, cofacFJ))
                  If Not doub Is Nothing Then
                      MsgBox "doublon ligne " + CStr(doub.Row) + " de la feuille " + fl.Name
                      GoTo fin
                  End If
              End If
          Next fl
          Call valider(st, li)
          Sheets(FJ).Cells(li, co).Value = txtS
          Sheets(FJ).Cells(li, co).Interior.ColorIndex = rouge
      End If
      fin:
      Sheets(FJ).Select
      Sheets(FJ).Cells(li + 1, co).Select
      End Sub
      
      1. oui

        ca marche bien il signale le doublons et pas de  transfert de ligne  et le bouton indique saisi? ,est ce qu’on peu indiquer oû ce trouve le doublon?

        cad(dans quel fiche existe-t’il).

        1. Re:

          oui bien sur contrôle sur toutes les feuilles (12 et plus)

          si je veux ajouter nouveau fournisseur dans BD double clic

          la feuille sera créer automatiquement .

          chaque jour je fait le saisie de nouveau pièces règlement et factures

          et je fait le transfert

          ci-joint mon fichier :https://www.cjoint.com/c/NGyi6dOYHjk

          merci pour votre collaboration.

          1. Contributeur

            Il faut supprimer le "not" dans "If Not doub Is Nothing Then"

        2. Bonjour

          J'ai modifier le code mais j’ai taper un numéro en double mais

          li ne signale pas qu’il en double

          et est ce qu'on peu localiser oû ce trouve le double

          merci a vous lire

          1. Contributeur

            Tu avais mentionné qu'il fallait chercher le doublon dans 12 feuilles, est-ce exact?  Le code ne cherche que dans la feuille de destination.

            SI le code ne fonctionne pas, je devrais examiner le fichier.

            Pour localiser le doublon:

            Public Sub valider(st, li)
            Const cofacFJ = 2  ' numero de colonne de la facture dans la feuille source
            Const cofacFS = 2  ' numero de colonne de la facture dans la feuille destination
            Dim plage1 As Range, plage2 As Range, lili As Long, plage3 As Range, doub As Range
            Dim obj As Object, liobj As Long, nbpg As Long, nupg As Long
            Application.ScreenUpdating = False
            Set doub = Sheets(st).Columns(cofacFS).Find(Sheets(FJ).Cells(li, cofacFJ))
            If Not doub Is Nothing Then
                lili = lidebFS
                With Sheets(st)
                  ' recupération du nombre de pages
                  nbpg = Application.WorksheetFunction.CountIf(.Columns(codatFS), "Page*")
                  ' ligne debut derniere page
                  Set obj = .Columns(codatFS).Find("Page - " & nbpg, , , xlPart)
                  If obj Is Nothing Then
                    MsgBox "erreur page ": Exit Sub
                  End If
                  liobj = obj.Row
                  lili = liobj + 3
                  While .Cells(lili, codatFS).Value <> ""
                    lili = lili + 1
                  Wend
                  ' on a trouve une ligne vide
                  ' si la ligne suivante contient le mot Total on passe à la page suivante
                  ' et on ajoute 2 lignes pour ajouter un tableau
                  If InStr(1, .Cells(lili + 1, codatFS).Value, "Total") > 0 Then
                    lili = lili + 2
                    Call AjouteTableau(st, lili, nbpg)
                    ' on ajoute 3 lignes pour la donnée suivante
                    lili = lili + 3
                  End If
                End With
                ' plages à copier
                With Sheets(FJ)
                  Set plage1 = .Range(.Cells(li, codatFJ), .Cells(li, codatFJ + 1))
                  Set plage2 = .Range(.Cells(li, codatFJ + 3), .Cells(li, codatFJ + 7))
                  Set plage3 = .Cells(li, codatFJ + 8)
                End With
                ' coller les plages en feuille st
                plage1.Copy Sheets(st).Cells(lili, codatFS)
                plage2.Copy Sheets(st).Cells(lili, codatFS + 2)
                plage3.Copy Sheets(st).Cells(lili, codatFS + 9)
            Else
                MsgBox "doublon à la ligne " + CStr(doub.Row)
            End If
            End Sub
        3. Contributeur

          J'ai modifié le code de la fonction valider(), elle va vérifier que le n° de facture n'est pas présent dans la feuille de destination.  Tu avais mentionné qu'il fallait vérifier dans 12 feuilles, est-ce exact?

          Si le numéro de facture  n'est pas en colonne B dans le feuille source, il faut modifier la constante cofacFJ dans la fonction.

          Public Sub valider(st, li)
          Const cofacFJ = 2  ' numero de colonne de la facture dans la feuille source
          Const cofacFS = 2  ' numero de colonne de la facture dans la feuille destination
          Dim plage1 As Range, plage2 As Range, lili As Long, plage3 As Range
          Dim obj As Object, liobj As Long, nbpg As Long, nupg As Long
          Application.ScreenUpdating = False
          If Not Sheets(st).Columns(cofacFS).Find(Sheets(FJ).Cells(li, cofacFJ)) Is Nothing Then
              lili = lidebFS
              With Sheets(st)
                ' recupération du nombre de pages
                nbpg = Application.WorksheetFunction.CountIf(.Columns(codatFS), "Page*")
                ' ligne debut derniere page
                Set obj = .Columns(codatFS).Find("Page - " & nbpg, , , xlPart)
                If obj Is Nothing Then
                  MsgBox "erreur page ": Exit Sub
                End If
                liobj = obj.Row
                lili = liobj + 3
                While .Cells(lili, codatFS).Value <> ""
                  lili = lili + 1
                Wend
                ' on a trouve une ligne vide
                ' si la ligne suivante contient le mot Total on passe à la page suivante
                ' et on ajoute 2 lignes pour ajouter un tableau
                If InStr(1, .Cells(lili + 1, codatFS).Value, "Total") > 0 Then
                  lili = lili + 2
                  Call AjouteTableau(st, lili, nbpg)
                  ' on ajoute 3 lignes pour la donnée suivante
                  lili = lili + 3
                End If
              End With
              ' plages à copier
              With Sheets(FJ)
                Set plage1 = .Range(.Cells(li, codatFJ), .Cells(li, codatFJ + 1))
                Set plage2 = .Range(.Cells(li, codatFJ + 3), .Cells(li, codatFJ + 7))
                Set plage3 = .Cells(li, codatFJ + 8)
              End With
              ' coller les plages en feuille st
              plage1.Copy Sheets(st).Cells(lili, codatFS)
              plage2.Copy Sheets(st).Cells(lili, codatFS + 2)
              plage3.Copy Sheets(st).Cells(lili, codatFS + 9)
          Else
              MsgBox "doublon"
          End If
          End Sub
          1. le bouton valider fait le transfert d'une seul ligne contenant

            8 colonnes.

            1. code bouton:

              Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
              Dim li As Long, co As Long, st As String, s As String
              li = Target.Row
              co = Target.Column
              If Target.Value = "" Then GoTo fin
              If li < lidebFJ Then GoTo fin
              If Not Intersect(Target, Columns(coclic)) Is Nothing Then
                s = Target.Value
                If s = txtS Then MsgBox "ligne déjà traitée ": GoTo fin
                st = Cells(li, codatFJ + 2).Value
                If st = "" Then GoTo fin
                Call valider(st, li)
                Sheets(FJ).Cells(li, co).Value = txtS
                Sheets(FJ).Cells(li, co).Interior.ColorIndex = rouge
              End If
              fin:
              Sheets(FJ).Select
              Sheets(FJ).Cells(li + 1, co).Select
              End Sub
              
              colonne qui contient le n° de facture: colonne B
              
              module1 :
              
              Option Explicit
              
              ' feuille MVT Journalier
              Public Const FJ = "MVT Journalier"
              Public Const coclic = 20    'colonne T
              Public Const lidebFJ = 4
              Public Const codatFJ = 10
              Public Const lifinFJ = 45
              
              ' feuilles sous traitants
              Public Const codatFS = 1
              Public Const lidebFS = 8
              
              ' feuille modele
              Public Const FM = "modele"
              Public Const TM = "TabMod"
              
              ' feuille BD
              Public Const FB = "BD"
              Public Const conomFS = 2
              
              ' texte saisi, valider
              Public Const txtS = "saisi"
              Public Const txtV = "valider"
              
              ' couleurs saisi, valider
              Public Const rouge = 3
              Public Const vert = 4
              
              ' heuteur ligne Page - n -
              Public Const htLignePage = 30
              
              Public Sub valider(st, li)
              Dim plage1 As Range, plage2 As Range, lili As Long, plage3 As Range
              Dim obj As Object, liobj As Long, nbpg As Long, nupg As Long
              Application.ScreenUpdating = False
              lili = lidebFS
              With Sheets(st)
                ' recupération du nombre de pages
                nbpg = Application.WorksheetFunction.CountIf(.Columns(codatFS), "Page*")
                ' ligne debut derniere page
                Set obj = .Columns(codatFS).Find("Page - " & nbpg, , , xlPart)
                If obj Is Nothing Then
                  MsgBox "erreur page ": Exit Sub
                End If
                liobj = obj.Row
                lili = liobj + 3
                While .Cells(lili, codatFS).Value <> ""
                  lili = lili + 1
                Wend
                ' on a trouve une ligne vide
                ' si la ligne suivante contient le mot Total on passe à la page suivante
                ' et on ajoute 2 lignes pour ajouter un tableau
                If InStr(1, .Cells(lili + 1, codatFS).Value, "Total") > 0 Then
                  lili = lili + 2
                  Call AjouteTableau(st, lili, nbpg)
                  ' on ajoute 3 lignes pour la donnée suivante
                  lili = lili + 3
                End If
              End With
              ' plages à copier
              With Sheets(FJ)
                Set plage1 = .Range(.Cells(li, codatFJ), .Cells(li, codatFJ + 1))
                Set plage2 = .Range(.Cells(li, codatFJ + 3), .Cells(li, codatFJ + 7))
                Set plage3 = .Cells(li, codatFJ + 8)
              End With
              ' coller les plages en feuille st
              plage1.Copy Sheets(st).Cells(lili, codatFS)
              plage2.Copy Sheets(st).Cells(lili, codatFS + 2)
              plage3.Copy Sheets(st).Cells(lili, codatFS + 9)
              End Sub
              
              Public Sub ValiderSelection()
              Dim li As Long, plage As Range, cel As Range, st As String
              Set plage = Selection
              If plage.Columns.Count > 1 Then Exit Sub
              If plage.Column <> coclic Then Exit Sub
              If MsgBox("Valider selection ", vbYesNo) <> vbYes Then Exit Sub
              For Each cel In plage
                If cel.Value = txtV Then
                  li = cel.Row
                  st = Sheets(FJ).Cells(li, codatFJ + 2)
                  If st <> "" Then Call valider(st, li)
                  cel.Value = txtS
                  cel.Interior.ColorIndex = rouge
                End If
              Next cel
              End Sub
              
              ' ajoute un tableau à la feuille st, ligne li avec np comme n° de page
              Public Sub AjouteTableau(st, li, np)
              With Sheets(st)
                Range(TM).Copy .Cells(li, codatFS)
                ' maj le n° de page et regle la hauteur de ligne
                .Cells(li, codatFS).Value = "Page - " & np + 1 & " -"
                .Rows(li & ":" & li).RowHeight = htLignePage
              End With
              End Sub
              
              ' ajoute la feuille de nom st
              Public Sub AjouteFeuille(st As String)
              Sheets("modele").Copy after:=Sheets(Sheets.Count)
              With ActiveSheet
                .Name = st
                .Cells(1, 1).Value = st
              End With
              End Sub
              
              Public Sub RAZ()
              Dim plage As Range
              If MsgBox("Etes vous sûr de tout remettre à zéro ?", vbYesNo) <> vbYes Then Exit Sub
              With Sheets(FJ)
                Set plage = .Range(.Cells(lidebFJ, codatFJ), .Cells(lifinFJ, codatFJ + 10))
                plage.ClearContents
                Set plage = .Range(.Cells(lidebFJ, coclic), .Cells(lifinFJ, coclic))
                plage.Value = txtV
                plage.Interior.ColorIndex = vert
              End With
              End Sub
              
              ' pour voir si la feuille nomF existe
              Public Function FeuilleExiste(nomF As String) As Boolean
               On Error Resume Next
               FeuilleExiste = Not (Sheets(nomF) Is Nothing)
              End Function
              
              ' non utilisé
              Public Function NomFeuille()
              Application.Volatile
              NomFeuille = ActiveSheet.Name
              End Function
              1. Contributeur

                J'ai l'impression que ce sont des groupes de lignes qui sont copiées, pas simplement une ligne.

            2. Re

              j'ai un bouton Valider dans feuille de saisie qui fait le transfert d'une ligne

              vers la feuille spécifiée je veux faire le contrôle sur

              le N° de Fact si il est en double

              je ne s’est pas comme écrire en vba

              1. Contributeur

                quel est le code VBA associé à ce bouton?

                quelle est la colonne qui contient le n° de facture dans les feuilles source et destination?

            3. Bonjour

              oui mais je cherche s'il ya encore autre astus parce-que j'ai plus que

              12 feuilles dans le classeur a part feuille de saisie la ou je fait le transfert

              voila le code de transfert une ligne vers la feuille qui convient je veux ajouter le

              contrôle sur le N°

              Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
              Dim li As Long, co As Long, st As String, s As String
              li = Target.Row
              co = Target.Column
              If Target.Value = "" Then GoTo fin
              If li < lidebFJ Then GoTo fin
              If Not Intersect(Target, Columns(coclic)) Is Nothing Then
                s = Target.Value
                If s = txtS Then MsgBox "ligne déjà traitée ": GoTo fin
                st = Cells(li, codatFJ + 2).Value
                If st = "" Then GoTo fin
                Call valider(st, li)
                Sheets(FJ).Cells(li, co).Value = txtS
                Sheets(FJ).Cells(li, co).Interior.ColorIndex = rouge
              End If
              fin:
              Sheets(FJ).Select
              Sheets(FJ).Cells(li + 1, co).Select
              End Sub

              est ce qu'il ya une idée de faire le contrôle sur N° pour

              éviter les doublons

              Merci.

              1. Contributeur

                un exemple de code qui vérifie si la valeur 19 est présente dans la colonne A:

                Dim colfact As Range
                Set colfact = [a:a]
                If Not colfact.Find(19) Is Nothing Then
                    MsgBox ("doublon")
                End If
            4. Contributeur

              bonjour,

              une façon rapide de le faire, en quelques minutes, sans vba:

              • rassembler toutes les données dans une seule feuille
              • trier sur le numéro de facture
              • dans une colonne vide, ajouter une formule qui retourne 1 si la facture a le même numéro que  la ligne suivante, sinon 0
              • figer la valeur dans cette colonne, remplacer la formule par la valeur
              • trier sur cette nouvelle colonne