Lister les lettres identiques à deux mots

lolilou79 Messages postés 1 Statut Membre -  
Patrice33740 Messages postés 8400 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

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
  2. Arnaud3P Messages postés 28 Statut Membre 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
  3. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  4. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
    1. Arnaud3P Messages postés 28 Statut Membre 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
  7. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
       
      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