Formule pour trier les lettres d'un mot

Tibo

XLDnaute Barbatruc
Bonjour à tous,

Je suis à la recherche d'une formule pour trier les lettres d'un mot.

J'ai adopté et adapté une formule de notre Déesse Monique (ainsi que l'a récemment baptisée Chris) basée sur LIGNE(INDIRECT(1&':'&....

Cette formule semble donner des résultats plutôt intéressants, mais je n'arrive pas à conclure.

J'obtiens une liste matricielle des lettres triées, mais je n'arrive pas à la transformer en 'vraie' chaîne.

Voir exemple joint.

J'ai l'impression que la solution n'est pas très loin, mais je suis encore assez loin de maîtriser les formules matricielles.

Merci d'avance pour la solution.
[file name=_tri_lettres_mot.zip size=2477]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/_tri_lettres_mot.zip[/file]
 

Pièces jointes

  • _tri_lettres_mot.zip
    2.4 KB · Affichages: 76

Monique

Nous a quitté
Repose en paix
Bonjour,

En attendant mieux, 1 lettre par cellule, en colonne ou en ligne.
En colonne : tu valides ta formule en ayant sélectionné 'plusieurs' cellules
En ligne : Transpose(Formule)
=TRANSPOSE(CAR(PETITE.VALEUR(CODE(STXT(B16;LIGNE(INDIRECT(1&':'&NBCAR(B16)));1));LIGNE(INDIRECT(1&':'&NBCAR(B16))))))
(plus un format conditionnel pour masquer les #N/A)

Mais j'ai du mal à imaginer le résultat en 1 seule cellule.
 

Tibo

XLDnaute Barbatruc
Bonjour Monique, José, le Forum,

La solution de décomposition sur plusieurs cellules est effectivement la plus simple. C'est celle que j'avais adopté dans un premier temps et elle donne satisfaction.

Dans le cas présent, lorsque je sélectionne dans la barre de calcul la formule proposée et que je fais F9, j'obtiens :

={'A';'B';'B';'E';'E';'R';'R';'U'}

C'est ce qui m'avait incité à explorer le domaine des matrices et formules matricielles.

Est-ce une vraie bonne piste ou bien une fausse ?

Je croise encore un peu les doigts en me disant : 'Et pourquoi pas ?'.

Sinon, je resterais sur la décomposition sur plusieurs cellules.

Réponse pour José : ma préférence va vers une solution Formule 100 % (je sais : il faudrait que je me mette au VBA, mais le monde des formules est malgré tout très riche : demande à Monique ... )

Merci à ceux qui se sont penchés (qui se pencheront ?) sur ce problème.

Bon après-midi à tous.
 

Monique

Nous a quitté
Repose en paix
Re,

Quand tu obtiens ={'A';'B';'B';'E';'E';'R';'R';'U'} par F9,
c'est le 'tableau' que se fait la formule

Si tu valides ={'A';'B';'B';'E';'E';'R';'R';'U'} en colonne, tu obtiens le tableau en question, sur plusieurs cellules.
Idem en ligne avec ={'A'.'B'.'B'.'E'.'E'.'R'.'R'.'U'}
Tu ne veux pas rien que les voyelles ? (non, sûrement)
 

Monique

Nous a quitté
Repose en paix
Re,

Jusqu'à 48 caractères mis par ordre alpha
8 formules nommées, chacune prenant 6 caractères en compte
[file name=LettresTibo.zip size=4315]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/LettresTibo.zip[/file]
 

Pièces jointes

  • LettresTibo.zip
    4.2 KB · Affichages: 69

JeanMarie

XLDnaute Barbatruc
Bonjour tout le monde

Une possibilité tirée par les cheveux, en utilisant l'itération d'Excel

1) Menu Outils/Options.../Onglet Calcul
2) Cocher 'Itération'
3) Mettre 1024 dans le champ 'Nb maximal d'Itérations'.
4) Valider

Dans la cellule A1, mettre cette formule, elle permet de faire une boucle de calcul de 1 à 1024.
Code:
=SI(A1=1024;1;A1+1)
Dans la cellule B4, la formule matricielle retourne les lettres triées par ordre alphabétique contenue dans la cellule B3.
Code:
=SI(ESTVIDE(B3);' ';B4)&SI(ET(NBCAR(B4)<=NBCAR(B$3);NBVAL(B3)=1);CAR(PETITE.VALEUR(CODE(STXT(B$3;LIGNE(DECALER(A1;;;NBCAR(B$3)));1));NBCAR(B4)));'')
Petit inconvénient, il faut obligatoire repasser la cellule B3 à vide, avant de rentrer une nouvelle donnée.

@+Jean-Marie

PS : suivant l'importance des calculs de la feuille et de la vitesse de votre micro, vous devrez voir défiler de 1 à 1024 la valeur de la cellule A1 [file name=trilettresmot.zip size=1868]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/trilettresmot.zip[/file]
 

Pièces jointes

  • trilettresmot.zip
    1.8 KB · Affichages: 49

Tibo

XLDnaute Barbatruc
Rebonjour Monique, Bonjour Jean-Marie,

Un grand merci pour vos solutions.

Je vais profiter de la soirée pour les étudier et en tirer quelques leçons.

En ce qui concerne le formule de Jean-Marie : le nombre 1024 (nbre d'itérations) fait-il référence au nombre de lettres ou bien la notion d'itération n'a-t-elle rien à voir avec le nombre de lettres.

Il me semble que cette option (cocher Validation) s'applique sur tous les classeurs ouverts. Est-ce un problème ? Est-il préférable de décocher cette option dès que l'on ferme le fichier ?

Sinon, cette petite application est prévue pour s'appliquer à des mots de 15 lettres maximum (ne s'applique pas à des phrases, donc pas d'espace à gérer). Ca va me permettre d'alléger un peu les formules de Monique.

Encore merci pour le temps que vous avez consacré à ma question.

Xldiennement vôtre.

Bonne soirée
 

JeanMarie

XLDnaute Barbatruc
Re...

La valeur 1024 indiquée dans mon précédent post fait bien référence au nombre de caractères maximum supporté par une cellule. Dans ton cas modifie cette valeur dans le champ des options d'Excel, et dans la formule de la cellule A1, cela diminuera aussi les temps de calcul.

Oui il est préférable de décoche cette option quand le fichier sera fermé.

@+Jean-Marie
 

Tibo

XLDnaute Barbatruc
Bonjour à tous,

Un proverbe dit que la nuit porte conseil.

Je l'ai mis en application hier soir pour retravailler sur le thème de ce post.

J'ai adopté une approche légèrement différente.

J'ai nommé la formule que j'utilisais en direct dans une cellule.

Et chose curieuse, je parviens alors à utiliser la fonction INDEX sur la chaîne matricielle générée.

Du coup, ça simplifie énormément le travail.

Je n'ai plus que 2 formules (1 nommée et 1 en direct dans Excel).

Cette formule est nommée zmot (mot correspond au mot dont il faut trier les lettres)

=CAR(PETITE.VALEUR(CODE(STXT(mot;LIGNE(INDIRECT(1&':'&NBCAR(mot)));1));LIGNE(INDIRECT(1&':'&NBCAR(mot)))))

et j'utilise ensuite une formule de ce type :

'=SI(ESTERR(INDEX(zmot;1));;INDEX(zmot;1))
&SI(ESTERR(INDEX(zmot;2));;INDEX(zmot;2))
&SI(ESTERR(INDEX(zmot;3));;INDEX(zmot;3))
....
....
&SI(ESTERR(INDEX(zmot;15));;INDEX(zmot;15))

(15 correspondant à la longueur maxi des mots que je suis amené à traiter, mais la formule ne faisant 'que' 627 caractère, il est possible d'aller bien au-delà)

Sur ces nouvelles bases, il y a peut-être encore moyen de simplifier. Je n'ai pas su trouver, les bras de Morphée ayant été plus forts.

Ce qui est curieux malgré tout, c'est que la formule zmot ne donne pas de résultat lorsqu'elle est utilisée directement dans une cellule (qu'elle soit validée normalement ou validée matriciellement), alors qu'une fois nommée, il n'y a plus aucun problème.

Est-ce un mystère d'Excel, ou bien y-a-t-il une explication logique ?


Bonne journée à tous

[file name=_tri_lettres_motv2.zip size=2281]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/_tri_lettres_motv2.zip[/file]
 

Pièces jointes

  • _tri_lettres_motv2.zip
    2.2 KB · Affichages: 59

JeanMarie

XLDnaute Barbatruc
Bonjour

Tu peux remplacer ta gestion d'erreur ESTERR(INDEX(zmot;1);) par une comparaison du nombre de caractères.

=SI(NBCAR(mot)>0;INDEX(zmot;1);)&SI(NBCAR(mot)>1;INDEX(zmot;2);)&SI(NBCAR(mot)>2;INDEX(zmot;3);)&SI(NBCAR(mot)>3;INDEX(zmot;4);)&SI(NBCAR(mot)>4;INDEX(zmot;5);)&SI(NBCAR(mot)>5;INDEX(zmot;6);)&SI(NBCAR(mot)>6;INDEX(zmot;7);)&SI(NBCAR(mot)>7;INDEX(zmot;8);)&SI(NBCAR(mot)>8;INDEX(zmot;9);)&SI(NBCAR(mot)>9;INDEX(zmot;10);)&SI(NBCAR(mot)>10;INDEX(zmot;11);)&SI(NBCAR(mot)>11;INDEX(zmot;12);)&SI(NBCAR(mot)>12;INDEX(zmot;13);)&SI(NBCAR(mot)>13;INDEX(zmot;14);)&SI(NBCAR(mot)>14;INDEX(zmot;15);)

Tu peux aussi nommé une variable qui retournera ce nombre de caractère, et l'utilisé dans la formule.

Il est impossible de concaténation dans une formule matricielle.

@+Jean-Marie

Message édité par: JeanMarie, à: 18/08/2005 23:22
 

Tibo

XLDnaute Barbatruc
Bonjour Jean-Marie,

Merci pour cette explication.

J'avais effectivement pensé à une concaténation, mais sans trop voir comment la mettre en place. Maintenant, je sais que c'est pas possible.

Merci encore.

Bonne journée.
 

Gael

XLDnaute Barbatruc
Bonjour Tibo, monique, Jean-Marie, Le Forum,

Une réponse de Monique sur un autre FIL m'a donnée l'idée qui me manquait pour te répondre.

En téléchargeant la macro complémentaire MOREFUN, tu as accès à de nouvelles fonctions qui permettent de répondre à ta demande en une seule formule, quel que soit le nombre de caractères du mot:

{=MCONCAT(TRIV(STXT(B23;LIGNE(INDIRECT(1&':'&NBCAR(B23)));1);STXT(B23;LIGNE(INDIRECT(1&':'&NBCAR(B23)));1);1))}

STXT(B23;LIGNE(INDIRECT(1&':'&NBCAR(B23)));1) est due à Monique et crée une matrice des lettres.

TRIV (de Morefun) Trie les lettres de la matrice. Le STXT est présent une 2ème fois en tant que clé de tri et le ;1 final pour l'ordre croissant.

Enfin MCONCAT va concaténer la matrice triée donc regrouper toutes les lettres dans une seule cellule.

Adresse du téléchargement :
Ce lien n'existe plus

nom de la macro: morefun.xll

@+

Gael

Un petit complément:

En utilisant la fonction VALEURS.UNIQUES on a une formule plus simple et qui élimine les lettres en double:

{=MCONCAT(VALEURS.UNIQUES(STXT(B23);LIGNE(INDIRECT(1&':'&NBCAR(B23)));1);1))}

Gael

Message édité par: Gael, à: 17/08/2005 18:20
 

Tibo

XLDnaute Barbatruc
Salut Gael,

Je te remercie de cette nouvelle formule.

J'hésite toujours à utiliser des macros complémentaires. De par ma profession, je suis parfois amené à faire des minis applications destinées à être installées chez les clients, qui eux, n'auront pas installé les macros complémentaires.

C'est pourquoi j'hésite toujours à me servir de macros complémentaires, surtout quand le fichier est prévu pour voyager de poste en poste.

Il est cependant évident que cette macro MOREFUN doit apporter un grand nombre de fonctions très utiles.


Bonne soirée à toi.
 

Gael

XLDnaute Barbatruc
Bonsoir Tibo,

Je comprends très bien ta réaction, c'est vrai que pour la portabilité ce n'est pas l'idéal.

Mais au moins, sois sympa et essaye la formule car ça marche vraiment bien, tu pourras toujours désinstaller morefun après.

En fait, j'ai même été surpris de voir le résultat directement dans une cellule, sans passer par des matrices intermédiaires.

tiens-moi au courant.

@+

Gael
 

Tibo

XLDnaute Barbatruc
Salut Gael, le Forum,

Gael, j'ai téléchargé Morefun et l'ai installé.

J'ai ensuite récupéré ta formule, mais j'obtiens un #VALEUR!.

J'ai pourtant bien contrôlé (j'ai récupéré ta formule par un Copier/Coller).

Ne maîtrisant pas ces nouvelles fonctions, peux-tu me donner une piste pour que ça marche.

Merci et à bientôt
 

Statistiques des forums

Discussions
312 320
Messages
2 087 223
Membres
103 497
dernier inscrit
JP9231