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. 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
    1
    1. 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
      1. oui

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

        1
        1. 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.

          0
          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
            1
        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

          0
          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?

            1
        3. 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
          0
          1. Contributeur

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

            0
        4. le bouton valider fait le transfert d'une seul ligne contenant

          8 colonnes.

          0
          1. 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

            0
            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
              1
          2. 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.

            0
            1. Contributeur

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

              1
          3. 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).

            0
            1. 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
              
              0
              1. 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.

                0
                1. Contributeur

                  revenir?

                  0
              2. 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.

                0
                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