RECHERCHE DES DOUBLONS

Résolu
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 - Modifié le 22 juil. 2024 à 14:11
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 - 24 juil. 2024 à 15:58

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

yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 Ambassadeur 1 579
22 juil. 2024 à 15:50

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 Ambassadeur 1 579
23 juil. 2024 à 17:21

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
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
24 juil. 2024 à 15:58

oui

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

1
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
Modifié le 23 juil. 2024 à 14:58

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 1 579
23 juil. 2024 à 12:21

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
23 juil. 2024 à 12:59

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 1 579
23 juil. 2024 à 13:20

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
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
Modifié le 23 juil. 2024 à 14:56

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 1 579
23 juil. 2024 à 14:48

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

0
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
23 juil. 2024 à 15:29

le bouton valider fait le transfert d'une seul ligne contenant

8 colonnes.

0
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
24 juil. 2024 à 10:05

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 1 579
24 juil. 2024 à 10:37

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
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
Modifié le 24 juil. 2024 à 11:32

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 1 579
24 juil. 2024 à 11:34

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

1
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
24 juil. 2024 à 11:56

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 Ambassadeur 1 579
24 juil. 2024 à 12:21

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
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
Modifié le 24 juil. 2024 à 13:11

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 1 579
24 juil. 2024 à 14:14

revenir?

0
hakimr Messages postés 259 Date d'inscription lundi 1 mai 2017 Statut Membre Dernière intervention 17 août 2024 9
Modifié le 24 juil. 2024 à 15:19

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
yg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 1 579
Modifié le 24 juil. 2024 à 15:27

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