Lister les lettres identiques à deux mots

Fermé
lolilou79 Messages postés 1 Date d'inscription samedi 3 février 2018 Statut Membre Dernière intervention 3 février 2018 - 3 févr. 2018 à 14:07
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 4 févr. 2018 à 17:29
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 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié le 3 févr. 2018 à 16:50
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 vendredi 4 décembre 2009 Statut Membre Dernière intervention 8 février 2018 2
3 févr. 2018 à 18:02
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 14401 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 17 avril 2024 2 701
3 févr. 2018 à 18:04
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 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié le 3 févr. 2018 à 21:22
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 vendredi 4 décembre 2009 Statut Membre Dernière intervention 8 février 2018 2
3 févr. 2018 à 22:21
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 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
3 févr. 2018 à 23:11
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 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
Modifié le 4 févr. 2018 à 00:25
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 14401 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 17 avril 2024 2 701
4 févr. 2018 à 00:19
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 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
Modifié le 4 févr. 2018 à 00:26
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 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
4 févr. 2018 à 17:29
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