Microsoft 365 Crée un VBA pour repérer des doublons sur un tableur excel

patrick965

XLDnaute Impliqué
bonjour cher communauté
voila j'aimerais faire ceci sur mon fichier excel
toute en concervant les fonctionalitée présente au tableau déja présentent
peu on faire en sorte que excel soie tres précis pour repérée les doubons
la première vérification de doublon dans la colonne Q (total HT) . il y aura de bonne chance de trouver des montant similaire .
ensuite
il va ensuite ce référée au autre colonne E (Fournisseurs)
ensuite
la coonne C (Brève description des achats) qui va changer dans le prochain tableau pour (bon de travail ou numéro de facture)
ensuite il va finir sa vérification sur la colonne B (date)
et au final déterminer un doublon même si le nom est pas exactement pareil partout .

il faudrait par exemple que Excel ne puisse identifier un doublons de 2 catégorie différant comme par exemple achat et temps travailler même si 2 montants en Q son identique

et

peu on faire en sorte d'avoir en plus de la surbrillance un message d'alerte quand il y a un doublon
exemple ; (attention nous détectons 2 ligne similaire soie la ligne 120 et 360 voulez vous les conserver ou supprimer la dernière entrée )...
donc a ce moment l'utilisateur peu vérifier et faire son choix en conséquence.
si on conserve le doublons la surbrillance s'enlève

parce que je trouve super les surbrillance mais reste ensuite a démeler et trouver quel ligne va avec quel ligne doublon.

le message d'alerte lui va etre interessant surtout l'ors de nouvelle entrée

si tu a des idée plus simple et ou meilleur je suis ouvert je croie que tu comprend mon message

merci pour votre temps merci beaucoup a tous pour votre aide
 

Pièces jointes

  • test cout hebdomataire job keezee expériance modifier 2023-08-30.xlsm
    99.8 KB · Affichages: 7
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
si tu inverse deux mot normalement si ils sont comptable alors il ne devrait pas y avaoir de soucis
c'est la premiere partie de la fonction ça
on prend deux chaines

et tout les mots sont testés
si il y sont tous alors on sort de la fonction elle te donne 100%
maintenant si une des chaines a plus de mot que l'autre il est évident que le pourcentage dégringole
on peut pas donner un score identique à

Patrick manges bananes flambées au rhum
et
Patrick mange des bananes
ou même
des bananes Patrick mange
les deux dernières devraient te donner 100 entre elles
mais les deux dernières avec la première devrait de donner un score bien plus faible
sachant que l'on a que 50% de mots et à cela est enlevé le decompte de chaques lettres supplémentaires et testées
c'est sur que l'on doit être pas loin de zero en tout cas moins de 10 ça c'est sur


si la partie 1 ne donne pas 100 alors c'est la partie analyse en binaire qui se met en route

maintenant vous pouvez baisser le % demandé mais en dessous 75% ça n'a plus de sens selon moi
perso je n'accepte pas en dessous de 85% et encore

l'algorytme c'est pas moi qui l'ai inventé , il a fait ses preuves depuis plus de 60 ans
 

patrick965

XLDnaute Impliqué
normal la date est différente !
bonjour gbinforme et patricktoulon
je comprend mais le bus en fait est d'avoir une alerte si deux transaction même s'il on pas la même date mais on plus de 90% de similitude j'aimerais qu'il y ait une alerte peut-être que je ne comprend pas bien ...
pour ce qui est de l'alerte je pence pas qu'il y aurais un replanissements a la saisie si a la fin de la saisie d'une journée l'alerte apparait pour montrée une possible similitude qu'and pence tu ....
pour ce qui est de la formule de patricktoulon coyer vous que celle si soie adaptable a ce tableau pour déceler a 90 et plus les possible doublons peu importe la façons quelle est saisie

voila merci beaucoup de votre ide précieuse
 

gbinforme

XLDnaute Impliqué
je comprend mais le bus en fait est d'avoir une alerte si deux transaction même s'il on pas la même date
C'est là en totale contradiction avec ce que tu demandais dans ton premier message : ensuite il va finir sa vérification sur la colonne B (date)
Je t'ai rajouté une tolérance de 2 jours pour ta date : à toi de voir
coyer vous que celle si soie adaptable a ce tableau pour déceler a 90 et plus les possible doublons
Tu n'as pas bien lu ma réponse car je l'ai adaptée et l'inversion de mots comme sur l'exemple qu'il a donné donne 6% bien loin des 90% que tu souhaites

pour ce qui est de l'alerte je pence pas qu'il y aurais un replanissements a la saisie
Quand tu exécutes du code cela utilise du processeur et donc demande du temps d'exécution et si tu fais cela à chaque rubrique saisie cela impliquera fortement la fluidité.
J'espère au moins que la réinitialisation corrigée dont tu ne dis rien répond à tes souhaits 😃
Bonne journée
 

Pièces jointes

  • test cout hebdomataire job keezee expériance modifier 2023-08-30.xlsm
    121.1 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
re
Bonjour Patrick
Dans ton exemple
MsgBox similaire("jean-yve dupont", "dupont jean-yve") & "%"
cela donne 6,66% pourtant.
Oupss!!! une parenthese oublié
VB:
'exemple
Sub test()
MsgBox similaire("patricktoulon", "patrick toulon") & "%"
MsgBox similaire("patricktoulon", "patricktoulouse") & "%"
MsgBox similaire("jean-yve dupont", "dupont jean-yve") & "%"
End Sub

Public Function similaire(ByVal s1 As String, ByVal s2 As String) As Double
    Const cFacteur As Long = &H100&, cMaxLen As Long = 256&   'Longueur maxi autorisée des chaines analysées
    Dim l1 As Long, l2 As Long, c1 As Long, c2 As Long
    Dim r() As Integer, rp() As Integer, rpp() As Integer, i As Integer, j As Integer
    Dim c As Integer, x As Integer, y As Integer, z As Integer, f1 As Integer, f2 As Integer
    Dim dls As String, ac1() As Byte, ac2() As Byte
    Dim px As Double, p As Double, oz As Long
Dim t1, t2
'*****************************************************
'analyse dans un ordre different
  If s1 = s2 Then similaire = 100: Exit Function
    
    t1 = Split(Replace(s1, "-", " "), " "):    t2 = Split(Replace(s1, "-", " "), " ")
    If UBound(t2) > UBound(t1) Then tbl = t12: s2 = s1 Else tbl = t1
    If IsArray(tbl) Then
        If UBound(tbl) > 1 Then
            p = 100 / (UBound(tbl) + 1)
            For oz = 0 To UBound(tbl): px = px + IIf(s2 Like "*" & tbl(oz) & "*", p, -p): Next
            If px = 100 Then similaire = 100: Exit Function
        End If
    End If
    '**************************************************
  'analyse binaire
  l1 = Len(s1): l2 = Len(s2)
    If l1 > 0 And l1 <= cMaxLen And l2 > 0 And l2 <= cMaxLen Then
        ac1 = s1: ac2 = s2   'conversion des chaines en tableaux de bytes
        'Initialise la ligne précédente (rp) de la matrice
        ReDim rp(0 To l2)
        For i = 0 To l2: rp(i) = i: Next i
        For i = 1 To l1
            'Initialise la ligne courante de la matrice
            ReDim r(0 To l2): r(0) = i
            'Calcul le CharCode du caractère courant de la chaine
            f1 = (i - 1) * 2: c1 = ac1(f1 + 1) * cFacteur + ac1(f1)
            For j = 1 To l2
                f2 = (j - 1) * 2: c2 = ac2(f2 + 1) * cFacteur + ac2(f2)
                c = -(c1 <> c2)   'Cout : True = -1 => c = 1
                'suppression, insertion, substitution
                x = rp(j) + 1: y = r(j - 1) + 1: z = rp(j - 1) + c
                If x < y Then
                    If x < z Then r(j) = x Else r(j) = z
                Else
                    If y < z Then r(j) = y Else r(j) = z
                End If
                'transposition
                If i > 1 And j > 1 And c = 1 Then
                    If c1 = ac2(f2 - 1) * cFacteur + ac2(f2 - 2) And c2 = ac1(f1 - 1) * cFacteur + ac1(f1 - 2) Then
                        If r(j) > rpp(j - 2) + c Then r(j) = rpp(j - 2) + c
                    End If
                End If
            Next j
            'Reculer d'un niveau la ligne précédente (rp) et courante (r)
            rpp = rp: rp = r
        Next i
        'Calcul la similarité via la distance entre les chaines r(l2)
        If l1 >= l2 Then dls = 1 - r(l2) / l1 Else dls = 1 - r(l2) / l2
    ElseIf l1 > cMaxLen Or l2 > cMaxLen Then
        dls = -1   'indique un dépassement de longueur de chaine
    ElseIf l1 = 0 And l2 = 0 Then
        dls = 1   'cas particulier
    End If
    similaire = dls * 100
End Function
ca va mieux là ;)
 

patricktoulon

XLDnaute Barbatruc
et dans le 4eme exemple
on vois la puissance de la fonction a prendre en compte les fautes d'orthopraphe
VB:
'exemple
Sub test()
MsgBox similaire("patricktoulon", "patrick toulon") & "%"
MsgBox similaire("patricktoulon", "patricktoulouse") & "%"
MsgBox similaire("jean-yve dupont", "dupont jean-yve") & "%"
MsgBox similaire("jean-yve dupont", "jeen-yve dupont") & "%"
End Sub
elle admet même la dyslexie
Code:
MsgBox similaire("jean-yve dupont", "jaen-evy dupont") & "%"
 

patrick965

XLDnaute Impliqué
C'est là en totale contradiction avec ce que tu demandais dans ton premier message : ensuite il va finir sa vérification sur la colonne B (date)
salut gbinforme
ce que je veux dire ces juste que peu importe la date je ne veux pas qu'il y ait de doublons dans le tableau :)
avant votre beau travail je n'avais rien pour détecter es doublons donc par exemple ; je fait une commande dans un magasin je paye un dépôt mon produit arrivais que dans 30 jours. je rentre la facture immédiatement dans le systeme ( tableau) et quand j'y retourne 40 jours plus tard je vais chercher mon produit et la dame me sort une facture avec la balance a payé je paye celle si et a mon retour je rentre la facture encore une foie .
au départ ces ce qui nous a vais remarque qu'il fallait faire quelque chose pour les doublons parce que il y avais 2 facture plancher Chapdelaine a 12000$ pour le même produit a 2 date différant et description différant dans le tableau . ces pour a que je cherche a ce que ce soir le plus sécuritaire possible si l'humain entre 2 facture pour le même produit quelque part dans 1 projet de 6 mois ou autre bien que le tableur reste honnête.

cest pour ca que je vous est demander de l'aide et que vous avez pris le temps pour moi :):)
 

patrick965

XLDnaute Impliqué
salut patricktoulon
merci pour ton temps ces très apprécier .
je ne comprend pas a la perfection encore le code .
quel est la différance entre ton code et celui qu'a crée gbinforme
dans le fichier excel .
je cherche pas a crée de compétition je veu juste comprendre les différance principale et leur fonction et ce qui le rend différend .
je souhaite juste rendre le fichier le plus impartial possible qu'and je le remet a mes client .
l'erreur est humain d'entrée 2 factures mais je veux a tous prix que ces erreur ne parvienne pas jusqu'à mes clients donc plus le fichier est sécuriser mieux ce sera sans toute foie ralentir celui ci ou perdre l'efficacité des autre fonction
 

patricktoulon

XLDnaute Barbatruc
ma fonction est en fait 2 fonctions en une
1° elle examine deux chaine mots par mot et si tout les mot de la chaine1 sont dans la chaine2 et que la chaine 2 ne mesure pas 3 kilomètres de plus alors ma fonction te donnera 100% de similarité

si la partie1 ne donne pas 100% alors on passe a la seconde étapes de la fonction qui va examiner les chaines
en décalant et en substituant le résultat de chaque décalage et substitution va te donner a la fin un pourcentage de similarité de 0 à 100%

et bien avec ca tu peux faire une simple boucle et dans dans une sub boucle analyser l'item de la boucle 1 à la boucle 2
je laisse @gbinforme aménager cela car c'est lui qui t'a pris en charge
j'ai juste donné un autre moteur de comparaison de similairité
 

gbinforme

XLDnaute Impliqué
re
e cherche pas a crée de compétition je veu juste comprendre les différance principale et leur fonction et ce qui le rend différend .
Tu as les 2 classeurs avec les 2 versions et c'est à toi de décider en comparant les résultats selon ce qui te convient après avoir fait les essais que tu souhaites.
Toujours aucune information sur mes modifs initialisation.
Apparemment le contrôle que tu voulais sur la date est obsolète.
 

patrick965

XLDnaute Impliqué

salut gbinforme

suite au message de patricktoulon avec ca tu peux faire une simple boucle et dans dans une sub boucle analyser l'item de la boucle 1 à la boucle 2
qu'and pence tu ...
je vais tester le tout et vous reviens .
j'aime bk le travail fait jusqu'à présent ces super et je vous en re merci vous me rendez un énorme service.
pour ce qui est de la date je veux pas comparer de date juste les doublons peu importe s'il on la même date ou pas.
 

gbinforme

XLDnaute Impliqué
je veux pas comparer de date juste les doublons peu importe s'il on la même date ou pas.
alors que tu avais dit : ensuite il va finir sa vérification sur la colonne B (date)
je te met les 2 classeurs sans la date
 

Pièces jointes

  • test cout hebdomataire job keezee expériance modifier 2023-08-30.xlsm
    121.1 KB · Affichages: 3
  • toulon.xlsm
    126.2 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
313 224
Messages
2 096 338
Membres
106 572
dernier inscrit
JM04082023!