Calculer un % identique du contenu d'une cellule avec une autre

Signaler
Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021
-
Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021
-
Bonjour,

De la même manière qu'on peut dire que l'ADN d'une banane est à 50% identique à celui d'un humain, comment est-il possible de comparer le contenu de cellules Excel entre elles et de calculer le % du contenu identique ?
Pour chaque cellule, je calcule le % du contenu identique avec chacune des autres cellules de la liste, et j'inscris dans la colonne B, le % maximum trouvé.
Exemple
------------ A---------------------- B
1-------A-1010---------83% avec A2
2-------A1010----------100% avec A1
3-------A1011----------83% avec A2

Ci joint un fichier Excel, avec une petite liste de valeurs à tester.
Merci d'avance
https://www.cjoint.com/c/KBjqdyOOVa4

5 réponses

Messages postés
3085
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
3 mars 2021
426
Bonjour à tous,

T'explique comment tu trouves 83 % ?

Crdlmt
Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021
2
Bonjour,

En A1 : 5 caractères en commun avec A2 sur 6 (l'ordre étant respecté)
ça fait 83% :)

Cordialement
Messages postés
12941
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
4 mars 2021
2 139
Bonsoir

Comment peut il se faire que A1 a 83% de correspondance avec A2 et que A2 a lui100% avec A1 ??? il y a quelque chose qui m'échappe là !
Ensuite quel est l’intérêt à calculer ces % ?

Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021
2
Parce que dans A2 (A1010) , il y a 5 caractères et que ces 5 caractères sont tous retrouvés dans l'ordre dans A1, d'où le 100%.
Dans A1 (A-1010), il y a 6 caractères, et on en retrouve que 5 sur les 6 dans l'ordre dans A2, d'où le 83%.

Mon raisonnement est-il mauvais ?
Messages postés
12941
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
4 mars 2021
2 139 >
Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021

Je ne pense pas que le calcul de % seul, même en utilisant la méthode de Levenshtein indiquée par Eric, que je salue bien au passage ☺, te soit d'un grand secours :
en effet si A-1010 et A1010 donnent un % de 83% A-1010 et A51010 donnent aussi 83%

Si tu veux faire des essais avec la méthode de Levenshtein, voilà une fonction personnalisée trouvée sur Internet
Function Levenshtein(ByVal string1 As String, ByVal string2 As String) As Long

Dim i As Long, j As Long, string1_length As Long, string2_length As Long
Dim distance(0 To 60, 0 To 50) As Long, smStr1(1 To 60) As Long, smStr2(1 To 50) As Long
Dim min1 As Long, min2 As Long, min3 As Long, minmin As Long, MaxL As Long
 
string1_length = Len(string1):  string2_length = Len(string2)
 
distance(0, 0) = 0
For i = 1 To string1_length:    distance(i, 0) = i: smStr1(i) = Asc(LCase(Mid$(string1, i, 1))): Next
For j = 1 To string2_length:    distance(0, j) = j: smStr2(j) = Asc(LCase(Mid$(string2, j, 1))): Next
For i = 1 To string1_length
    For j = 1 To string2_length
        If smStr1(i) = smStr2(j) Then
            distance(i, j) = distance(i - 1, j - 1)
        Else
            min1 = distance(i - 1, j) + 1
            min2 = distance(i, j - 1) + 1
            min3 = distance(i - 1, j - 1) + 1
            If min2 < min1 Then
                If min2 < min3 Then minmin = min2 Else minmin = min3
            Else
                If min1 < min3 Then minmin = min1 Else minmin = min3
            End If
            distance(i, j) = minmin
        End If
    Next
Next
 
MaxL = string1_length: If string2_length > MaxL Then MaxL = string2_length
Levenshtein = 100 - CLng((distance(string1_length, string2_length) * 100) / MaxL)
 
End Function


A utiliser comme n'importe quelle fonction Excel avec la syntaxe :
=Levenshtein(première valeur ou cellule de la première valeur; seconde valeur ou cellule de la seconde valeur)

Cdlmnt
Via
Messages postés
23914
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 mars 2021
6 672 >
Messages postés
12941
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
4 mars 2021

Salut via,

il y en avait une dans le fichier que j'ai joint ;-)
mais tu as bien fait comme le demandeur ne m'a pas vu non plus...
eric
Messages postés
12941
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
4 mars 2021
2 139 >
Messages postés
23914
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 mars 2021

Salut Eric

oui j'avais ouvert la page Wiki mais pas le reste pensant, à tort, que cela concernait la distance de Damerau-Levenstein !

Par contre je suis en train de penser, après avoir relu la dernière réponse du demandeur, que si la différence d'encodage n'est bien à chaque fois que la présence d'un trait d'union, voir d'un espace ou non, il suffirait de comparer les références expurgées de ces éléments pour trouver les doublons, qu'en dis-tu ?
Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021
2 >
Messages postés
12941
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
4 mars 2021

Bonjour à tous,

Désolé pour le retard de réponse, je suis en déplacement pro, c'est moins évident de répondre aujourd'hui.

Merci pour cette macro et merci Eric pour ta réponse que j'avais bien vu et étudié hier soir, mais je n'avais pas encore pris le temps de répondre.
La distance de Levenshtein est vraiment quelque chose de très intéressant, je ne connaissais pas et je trouve cela passionnant. J'ai également pu consulter rapidement le fichier que tu avais joins, mais sans avoir pu encore me plonger complètement dans la macro.
J'avais même réalisé un fichier moi-même hier soir avec des formules et en utilisant des matrices comme présentées sur la page wikipédia que tu as proposée.

Merci via55 de l'avoir re-proposé aussi.

Je reviens sur la dernière remarque de Via55 : c'est une bonne idée d'avoir peut être une liste de caractères (tiret, espace, point etc...) à expurger (avec un SUBSTITUTE par exemple je suppose ?) avant de lancer la macro.

Il faudra cependant voir au cas pas cas, en regardant la manière dont sont remplies les cellules à traiter. Si des numéros de pièce s'enregistrent d'une manière à prendre un tiret, il faudrait sans doute le laisser, mais à voir.

L'autre raisonnement serait de dire que 80% est suffisant pour faire ressortir la ligne. Mais d'un autre côté, je risque de me retrouver avec de nombreuses lignes identifiées en doublon à tort.

Merci en tout cas pour votre réactivité.
Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021
2 >
Messages postés
117
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
10 février 2021

Je vous envoie en rentrant ce soir l'essai que j'avais mis en place avec des formules.
ça fonctionne mais c'est limité au nombre caractères de la chaine de caractères... avoir une chaine de 50 caractères impose de tirer les formules loin, créant de grandes matrices.
Une gestion par macro sera plus efficace, ne serait-ce que pour les boucles.
Messages postés
23914
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 mars 2021
6 672
Bonjour à tous,

la distance de Levenshtein pourrait t'intéresser : https://fr.wikipedia.org/wiki/Distance_de_Levenshtein#:~:text=La%20distance%20de%20Levenshtein%20est,une%20cha%C3%AEne%20%C3%A0%20l'autre.
Elle est égale au nombre minimal de caractères qu'il faut supprimer, insérer ou remplacer pour passer d’une chaîne à l’autre.
Tu as aussi la distance de Damerau-Levenstein plus fine mais plus lourde, peut-être pas utile dans ton cas.

https://www.cjoint.com/c/KBjsNd6U7xX
eric

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci