Lister les lettres identiques à deux mots
lolilou79
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
Bonjour à toutes et à tous,
Je recherche une formule qui me permettrait de lister dans une troisième cellule les lettres identiques à deux mots situés dans les deux premières cellules.
Je précise que je préférerais une formule et non un code VBA
En vous remerciant par avance pour l'aide que vous m'apporterez.
Si la question a déjà été posée et est résolue, merci de bien vouloir m'en indiquer le lien.
Cordialement
Je recherche une formule qui me permettrait de lister dans une troisième cellule les lettres identiques à deux mots situés dans les deux premières cellules.
Je précise que je préférerais une formule et non un code VBA
En vous remerciant par avance pour l'aide que vous m'apporterez.
Si la question a déjà été posée et est résolue, merci de bien vouloir m'en indiquer le lien.
Cordialement
A voir également:
- Lister les lettres identiques à deux mots
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Nombre de jours entre deux dates excel - Guide
- Où sont stockés les mots de passe sur android - Guide
- Mon clavier n'écrit plus les lettres ✓ - Forum Clavier
6 réponses
Bonjour,
Je pense pas que ce soit réalisable sans VBA !
Et avec VBA c'est pas tout simple, voici une fonction personnalisée à copier dans un module standard :
Exemple d'utilisation, formule en C2:
=LettresCommunes(A2;B2)
--
Cordialement
Patrice
Je pense pas que ce soit réalisable sans VBA !
Et avec VBA c'est pas tout simple, voici une fonction personnalisée à copier dans un module standard :
Option Explicit Function LettresCommunes(ByVal mot1 As String, mot2 As String) As String Dim d As Object, t As Variant, s As String, i As Integer Set d = CreateObject("Scripting.Dictionary") If Len(mot2) > Len(mot1) Then s = mot2: mot2 = mot1: mot1 = s End If For i = 1 To Len(mot1) If InStr(1, LCase(mot2), LCase(Mid(mot1, i, 1))) > 0 Then d(UCase(Mid(mot1, i, 1))) = i Next i If d.Count = 0 Then LettresCommunes = "" Else t = d.Keys: d.RemoveAll Call Tri(t, LBound(t), UBound(t)) LettresCommunes = Join(t, "") End If End Function Private Sub Tri(table As Variant, premier As Integer, dernier As Integer) Dim v As Variant, t As Variant, p As Integer, d As Integer p = premier: d = dernier: v = table((p + d) \ 2) Do Do While table(p) < v: p = p + 1: Loop Do While v < table(d): d = d - 1: Loop If p <= d Then t = table(p): table(p) = table(d): table(d) = t p = p + 1: d = d - 1 End If Loop While p <= d If p < dernier Then Call Tri(table, p, dernier) If premier < d Then Call Tri(table, premier, d) End Sub
Exemple d'utilisation, formule en C2:
=LettresCommunes(A2;B2)
--
Cordialement
Patrice
Bonjour,
En a2 : la première expression à comparer
en b2 : la seconde expression à comparer
Une solution avec trois colonnes intermédiaires :
Sélection de la plage c3:c50 pour valider la formule matricielle avec CTRL-Màj-Entrée, depuis c3 :
=SI(ESTNUM(TROUVE(STXT($A$2;LIGNE(INDIRECT("1:"&NBCAR($A$2)));1);$B$2));CODE(STXT(B2;TROUVE(STXT($A$2;LIGNE(INDIRECT("1:"&NBCAR($A$2)));1);$B$2);1));"")
Sélection de la plage d3:d50 pour valider la formule matricielle avec CTRL-Màj-Entrée, depuis d3 :
=SIERREUR(CAR(PETITE.VALEUR(SI(NON(ESTNA(EQUIV(C3:C50;C3:C50;0)));SI((EQUIV(C3:C50;C3:C50;0)=LIGNE(INDIRECT("1:"&LIGNES(C3:C50))));C3:C50));LIGNE(INDIRECT("1:"&LIGNES(C3:C50)))));"")
en e3, formule normale à recopier jusqu'en e50:
=SI(D3="";"";E2&D3)
Enfin, en f2, formule normale :
=DECALER(E3;SOMMEPROD((D3:D50<>"")*1)-1;)
Les colonnes c, d et e pourront être masquées (elles vont jusqu'à 50 pour éviter de ralentir le pc à cause des formules matricielles). Les titres sont en ligne 1 et il faut laisser la plage c1:e2 vide.
Les lettres seront triées par ordre alphabétique en f2. Ça fonctionne, mais il pourrait y avoir des exceptions non gérées...
Il vaudrait mieux faire ça en VBA, en tout cas
Cordialement,
En a2 : la première expression à comparer
en b2 : la seconde expression à comparer
Une solution avec trois colonnes intermédiaires :
Sélection de la plage c3:c50 pour valider la formule matricielle avec CTRL-Màj-Entrée, depuis c3 :
=SI(ESTNUM(TROUVE(STXT($A$2;LIGNE(INDIRECT("1:"&NBCAR($A$2)));1);$B$2));CODE(STXT(B2;TROUVE(STXT($A$2;LIGNE(INDIRECT("1:"&NBCAR($A$2)));1);$B$2);1));"")
Sélection de la plage d3:d50 pour valider la formule matricielle avec CTRL-Màj-Entrée, depuis d3 :
=SIERREUR(CAR(PETITE.VALEUR(SI(NON(ESTNA(EQUIV(C3:C50;C3:C50;0)));SI((EQUIV(C3:C50;C3:C50;0)=LIGNE(INDIRECT("1:"&LIGNES(C3:C50))));C3:C50));LIGNE(INDIRECT("1:"&LIGNES(C3:C50)))));"")
en e3, formule normale à recopier jusqu'en e50:
=SI(D3="";"";E2&D3)
Enfin, en f2, formule normale :
=DECALER(E3;SOMMEPROD((D3:D50<>"")*1)-1;)
Les colonnes c, d et e pourront être masquées (elles vont jusqu'à 50 pour éviter de ralentir le pc à cause des formules matricielles). Les titres sont en ligne 1 et il faut laisser la plage c1:e2 vide.
Les lettres seront triées par ordre alphabétique en f2. Ça fonctionne, mais il pourrait y avoir des exceptions non gérées...
Il vaudrait mieux faire ça en VBA, en tout cas
Cordialement,
Bonjour à vous deux
Par formules il faut décomposer sur plusieurs colonnes chaque mot
Exemple pour des mots jusqu'à 10 lettres : https://www.cjoint.com/c/HBdrcI232T6
Cdlmnt
Via
Par formules il faut décomposer sur plusieurs colonnes chaque mot
Exemple pour des mots jusqu'à 10 lettres : https://www.cjoint.com/c/HBdrcI232T6
Cdlmnt
Via
Bonjour a tous les deux,
Vos formules, c'est pour trouver des lettres situées aux mêmes emplacements dans les 2 mots, pas les lettres communes aux 2 mots !
Pour les lettres situées aux mêmes emplacements dans les 2 mots, avec VBA c'est simple :
Vos formules, c'est pour trouver des lettres situées aux mêmes emplacements dans les 2 mots, pas les lettres communes aux 2 mots !
Pour les lettres situées aux mêmes emplacements dans les 2 mots, avec VBA c'est simple :
Function LettresAuxMemesEmplacements(ByVal mot1 As String, mot2 As String) As String Dim s As String, i As Integer For i = 1 To IIf(Len(mot2) > Len(mot1), Len(mot1), Len(mot2)) If LCase(Mid(mot1, i, 1)) = LCase(Mid(mot2, i, 1)) Then s = s & UCase(Mid(mot1, i, 1)) End If Next i LettresAuxMemesEmplacements = s End Function
C'est certain, le code VBA est bien plus pratique, il vaudrait mieux l'utiliser.
Toutefois, ma solution liste bien les lettres communes aux deux mots (peu importe leurs emplacements), sans doublons et par ordre alphabétique : https://www.cjoint.com/c/HBdvsncN5xA
Toutefois, ma solution liste bien les lettres communes aux deux mots (peu importe leurs emplacements), sans doublons et par ordre alphabétique : https://www.cjoint.com/c/HBdvsncN5xA
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
je remarque ce que je pense être une anomalie dans vos 2 propositions Patrice et Arnaud :
issue , veste : 2 lettres communes : ES, ok
issue , vestes : toujours 2 lettres communes ES, je dirais 3 : ESS
eric
je remarque ce que je pense être une anomalie dans vos 2 propositions Patrice et Arnaud :
issue , veste : 2 lettres communes : ES, ok
issue , vestes : toujours 2 lettres communes ES, je dirais 3 : ESS
eric
Je me suis prêté à l'exercice aussi.
Les lettres communes sont dans l'ordre d'apparition dans le 1er mot :
Les lettres communes sont dans l'ordre d'apparition dans le 1er mot :
Function LettresCommunes2(ByVal mot1 As String, ByVal mot2 As String) As String Dim i As Long mot1 = LCase(mot1): mot2 = LCase(mot2) For i = 1 To Len(mot1) If InStr(mot2, Mid(mot1, i, 1)) Then LettresCommunes2 = LettresCommunes2 & Mid(mot1, i, 1) mot2 = Left(mot2, InStr(mot2, Mid(mot1, i, 1)) - 1) & Mid(mot2, InStr(mot2, Mid(mot1, i, 1)) + 1) End If Next i LettresCommunes2 = UCase(LettresCommunes2) End Function
Re à tous
C'est évident que le VBA est le plus pratique, j'avais proposé quelque chose par formules puisque le demandeur le souhaitait
En attente de savoir du demandeur si c'est n'importe quelle lettres ou celles au mêmes emplacements
Eriiic ton code est bien plus court que celui de Patrice mais il fait la différence entre majuscules et minuscules contrairement à celui de Patrice
C'est évident que le VBA est le plus pratique, j'avais proposé quelque chose par formules puisque le demandeur le souhaitait
En attente de savoir du demandeur si c'est n'importe quelle lettres ou celles au mêmes emplacements
Eriiic ton code est bien plus court que celui de Patrice mais il fait la différence entre majuscules et minuscules contrairement à celui de Patrice