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
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
A voir également:
- Lister les lettres identiques à deux mots
- Deux comptes whatsapp - Guide
- Dans le document à télécharger, trouvez les lettres situées derrière les rectangles pour reconstituer le nom du chat. comment s'appelle-t-il ? - Forum InDesign
- Dans la table des matières de ce document, le chapitre 6 et ses 2 sections n'apparaissent pas. trouvez l'erreur dans la structure du document et corrigez-la. mettez à jour la table des matières. quel est le mot formé par les lettres en majuscules de la table des matières après sa mise à jour ? - Forum Word
- Supprimer une conversation messenger pour les deux personnes ✓ - Forum Facebook
- Mon clavier n'écrit plus les lettres ✓ - Forum Clavier
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
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 :
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
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
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,
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,
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
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
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
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
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 :
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
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
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
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
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
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
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
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
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 :
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
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
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
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
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
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... ;-)
Ok, j'ai rajouté une ligne. Merci
Je n'ai pas osé m'y lancer par formule... ;-)
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
4 févr. 2018 à 17:29
Et dans mon codes il y a 3 lignes inutiles :
Attendons le réveil de ... lolilou79
If Len(mot2) > Len(mot1) Then s = mot2: mot2 = mot1: mot1 = s End If
Attendons le réveil de ... lolilou79