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

6 réponses

Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
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 :
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
1
Arnaud3P Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   2
 
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,
0
via55 Messages postés 14512 Date d'inscription   Statut Membre Dernière intervention   2 746
 
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
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
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 :
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



0
Arnaud3P Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   2
 
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
0

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

Posez votre question
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Je me suis prêté à l'exercice aussi.
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
0
via55 Messages postés 14512 Date d'inscription   Statut Membre Dernière intervention   2 746
 
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


0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Et puis je n'ai pas trié, ça compte aussi.
Ok, j'ai rajouté une ligne. Merci
Je n'ai pas osé m'y lancer par formule... ;-)
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Et dans mon codes il y a 3 lignes inutiles :
  If Len(mot2) > Len(mot1) Then
    s = mot2: mot2 = mot1: mot1 = s
  End If


Attendons le réveil de ... lolilou79
0