Extraction d'un caractère après comparaison de chaines [Résolu/Fermé]

Signaler
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
-
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
-
Bonjour,
Je suis sous Excel 2007 - autodidacte en VBA - 2 questions s'il vous le voulez bien .....
1ère question : le but est de retrouver un mot formé dans une liste (B1:B4) à partir d'une chaine de caractères mis aléatoirement dans une cellule (A1).
Exemple :
Dans la cellule A1 la chaine est : "XMEPELE".
Dans la plage (B1:B4) j'ai en B1 la chaine "PROBLEME" en B2 "QUESTION" en B3 "EXEMPLE" en B4 "MERCI". (longueurs de chaine différentes !)
Par action avec un bouton de commande, en C1 je veux voir apparaitre (tout le monde aura compris) le mot "EXEMPLE".
Dans la continuité de la 1ère question :
2ème question : le but est de comparer deux chaines de caractères de longueur différente et en extraire le delta de la façon suivante :
Exemple :
Dans la cellule A1 la chaine est : "VRENEU".
Dans la cellule B1 la chaine est : "RNDEEVU".
Après action par bouton de commande, le delta de comparaison est le "D".
Dans la cellule B1 et je veux que ce "D" (donc le delta entre les deux chaines) passe en rouge gras.
On peut aussi réunir les deux questions dans une seule réponse. Mais séparer les deux réponses me permettra certainement de mieux comprendre et décortiquer la macro.
Merci à vous si vous avez une réponse. Ce que je ne doute pas. Et bonne année à Tous !

16 réponses

Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449
Bonjour,

Sujet très intéressant.

Pour la liste des scrabble ou scrabble+, voici un exemple :
Source de la Sub Combiner : https://www.commentcamarche.net/faq/41042-vba-excel-initiation-a-la-recursivite#combinaisons-d-une-chaine-de-caracteres

Nota : pour visualiser les résultats des Debug.Print, tapez Ctrl+G dans l'interface VBA
Public T_Out(), IndTab As Long, Dico As Object

Sub Vazy()
'appel de la procédure
   'CAISSIE ==> correspond aux 7 lettres du rack
   'Array("A", "R", "T", "U", "I", "O", "P") ==> Liste des 8èmes lettres possibles
   'True ou False selon si l'on souhaite un Scrabble (False) ou un scrabble + (True)
'exemple d'appel :
Scrabble "CAISSIE", Array("A", "R", "T", "U", "I", "O", "P"), True
End Sub

Sub Scrabble(Chaine As String, Lettres_Sup As Variant, Plus As Boolean)
Dim t As Single, i As Integer, test As Long

   t = Timer
   On Error Resume Next
   test = Dico.Count
   If Err <> 0 Then Creation_Dico
   Erase T_Out: IndTab = 0
   On Error GoTo 0
   
   Combiner Chaine, ""
   If Plus Then 'si le choix = Scrabble+
      For i = LBound(Lettres_Sup) To UBound(Lettres_Sup)
         'alors on combine avec toutes les lettres supplémentaires possibles
         Combiner Chaine & Lettres_Sup(i), ""
      Next i
   End If
   Debug.Print "procédure complète en : " & Timer - t & " nombre de mots trouvés : " & UBound(T_Out)
End Sub

Sub Combiner(strText As String, debut As String)
'Combiner établit la liste des combinaisons possibles
'avec la chaîne strText
Dim i As Integer

   If Len(strText) = 1 Then
      'si la combinaison existe dans le Dico ==> mot trouvé
      If Dico.Exists(debut & strText) Then
         'on stocke ici le mot trouvé dans la variable T_Out
         ReDim Preserve T_Out(IndTab)
         T_Out(IndTab) = debut & strText
         IndTab = IndTab + 1
      End If
   Else
       For i = 1 To Len(strText)
           Combiner Mid(strText, 2, Len(strText) - 1), debut & Mid(strText, 1, 1)
           strText = Mid(strText, 2, Len(strText) - 1) & Mid(strText, 1, 1)
       Next
   End If
End Sub

Sub Creation_Dico()
'création du dictionnaire en mémoire à partir de la feuille dico
Dim Lig As Long, DL As Long, Col As Integer, Tbl, tbis As Single

   tbis = Timer
   Set Dico = CreateObject("Scripting.Dictionary")
   Tbl = Sheets("dico").Range("A6:Z" & Sheets("dico").Cells.SpecialCells(xlCellTypeLastCell).Row)
   For Lig = LBound(Tbl, 1) To UBound(Tbl, 1)
      For Col = LBound(Tbl, 2) To UBound(Tbl, 2)
         Dico(Tbl(Lig, Col)) = ""
      Next Col
   Next Lig
   Debug.Print "création du dictionnaire en : " & Timer - tbis & " pour : " & Dico.Count & " mots"
End Sub


La procédure de création en mémoire de l'objet Dictionary n'est à faire qu'une seule fois, à l'ouverture du classeur par exemple. L'avantage est de garder, en mémoire, tous les mots de la feuille dico sans avoir à y accéder.

Pour gagner encore du temps dans la recherche des mots et dans la création d'un dictionnaire, j'avais eu une conversation à ce sujet. La méthode retenue à l'époque avait été de créer un arbre dans un module de classe.

La discussion ici : https://codes-sources.commentcamarche.net/forum/oldest/10019292-vba-excel-recursivite-jeu-du-boggle

Le résultat ici : https://www.commentcamarche.net/faq/34606-jeu-sous-excel-vba-le-boogle-tactile-souris

3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60352 internautes nous ont dit merci ce mois-ci

Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
Bonjour
Chapeau Frank !
je te plussoie et te laisse le bébé ! ;o)
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449 >
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020

Bonjour Michel et bonne année,

A ce propos bonne année aux participants de ce sujet.

Oui c'est un beau bébé que tu me laisses la...
Parce que, juste pour cette histoire de Scrabble+, moussaillon est parti sur une unique lettre supplémentaire. Donc 8 lettres maxi, ma réponse.
Mais quid des Scrabble+++ ou l'on pourrait, à partir d'un mot déjà placé, utiliser les 7 lettres du rack pour former un mot de plus de 10 lettres...

Exemple :
sur le plateau de jeu figure le mot : LUT
le rack est : IVOENOR
on pourrait donc placer le mot REVO LUT ION
...
à suivre.

Je te renouvelle mes voeux pour cette année à toi et tes proches.
A+
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990 >
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020

j'avais oublié: Meilleurs vœux à tous

Et bravo pour ta révolution, Kamarade !
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449
En complément, il faudra revenir après pour ton dictionnaire. Il n'est pas très pratique de traiter un classeur Excel de 7Mo. Le plus aisé est de placer le dictionnaire dans un fichier txt à côté est de le charger en mémoire lors de l'ouverture du classeur.
Messages postés
9500
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
13 juillet 2020
1 859
Bonjour

Pour la question 1
http://www.cjoint.com/c/ELFpLPEw0Pk

Cdlmnt
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1
Merci ccm81. Ca marche bien en effet. Je ne voyais pas une macro aussi compliquée pour moi à décortiquer. J'en comprends une bonne partie. Après les fêtes je vais creuser pour tout comprendre car c'est cela qui m'intéresse le plus. Merci à toi et bonne année .....
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
Bonjour Moussaillon
Salut CCM81 ca va ?

Pour la question 2
Function extrait_intrus(dummy As String, texto As String) As String
Dim reg As Object
Dim extraction As Object
Set reg = CreateObject("vbscript.regexp")
reg.Global = True
reg.Pattern = "([^" & dummy & "])"
Set extraction = reg.Execute(texto)
For Each digit In extraction
extrait_lettres = extrait_lettres & (digit.Value)
Next digit
Set extraction = Nothing
Set reg = Nothing
End Function


"dummy" (modèle) correspond à A1
Texto à A2
donc écrire
=extrait_intrus(A1, A2)

EDIT:
si tu avais en A2:
"RNDEEAVUWA"
la fonction te retournerait DAWA
 Michel
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
j'avais pas tout lu !

pour colorier D en rouge (tiré de mon grenier)

Function colorier_mot(mot As String, cellule As Range)
Dim depart As Byte
On Error GoTo inconnu
depart = Application.Search(mot, cellule)
With cellule
colorier_mot = .Characters(start:=depart, Length:=Len(mot)).Font.ColorIndex = 3
End With
Exit Function
inconnu:
MsgBox "mot inconnu dansla cellule"
End Function
Messages postés
9500
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
13 juillet 2020
1 859
Pour la question 2, essaies ceci
http://www.cjoint.com/c/ELFrHm2hOpk

Cdlmnt
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1
Pour ccm81
Merci pour ces réponses aussi rapides. Je me suis peu être lancé un défi trop haut pour moi car quand je vois vos macros, je trouve beaucoup de termes utilisés que je connais pas. Mais ça, ça se travaille avec le temps je pense.
De plus je pensais qu'en vous donnant des exemples simples (une seule colonne), je pourrai retranscrire ces écritures dans d'autres proportions comme utiliser une liste à plusieurs colonnes(je travaille sur 26 colonnes et 40000 lignes environ parfois plus selon la colonne). J'ai déjà essayé de faire des tests mais la réponse à la question 1 est toujours "mot non trouvé"... c'est balo !!!
Pour la 2eme questions ce n'est pas vraiment cela que j'ai demandé. C'est uniquement le delta dans le deuxième mot (cellule B1) qui doit être en rouge gras après sa comparaison avec le 1er mot (cellule A1) et non le delta en rouge dans chaque cellule en ne gardant en noir que les lettres communes. Regarde bien ma question 2, je me suis peut être mal exprimé ??
Mais je garde la macro pour y travailler et essayer de la comprendre.

Pour michel_m
Tout d'abord merci pour ta réponse aussi rapide.
Je sais que je ne suis pas un as de la macro mais néanmoins j'ai vraiment du mal à comprendre tes réponses . Pourrais tu expliquer un peu plus ? Quand tu auras du temps libre. Il n'y as pas d'urgence.

Encore merci à vous deux et bon réveillon - bonne année
Messages postés
9500
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
13 juillet 2020
1 859
De plus je pensais qu'en vous donnant des exemples simples (une seule colonne), je pourrai retranscrire ces écritures ....
Eh oui, si tu ne dis pas tout ... !

Pour la 2eme questions ce n'est pas vraiment cela que j'ai demandé. C'est uniquement le delta dans le deuxième mot (cellule B1)
Pour une ffois qu'on t'en donne deux pour le prix d'un ... ;-)
Il te suffit de mettre un apostrophe devant les 12 lignes concernant le delta S1-S2, pour les passer en commentaire, ou carrément les supprimer
'd = delta(s1, s2)
'............
'End If

Bon réveillon, bonne année et bon courage

Cdlmnt
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
Bonjour à tous et meilleurs vœux

Moussaillon, tu écris:
je pensais qu'en vous donnant des exemples simples (une seule colonne), je pourrai retranscrire ces écritures dans d'autres proportions comme utiliser une liste à plusieurs colonnes(je travaille sur 26 colonnes et 40000 lignes environ parfois plus selon la colonne)

Excuse le terme abrupt mais c'est une grosse bétise.
En te disant" je vais faire simple et puis après je verrai..." tu résonnes à l'inverse : en info,on commence par poser le contexte en entier et on le décompose les problèmes en fonction du contexte. notamment, on procède tout à fait différemment suivant la grandeur du tableau

Donc, on ne peut pas te répondre pour l'instant; pour la deuxième question:
Quel est(sont) le(s) modèle(s) et où les trouve(nt) t'on: dans le tableau où a l'extérieur du tableau ?
avec quelles cellules faut il(s) le(s) comparer ?

au besoin et avec des explications détaillées et complètes:
Mettre un extrait du classeur env. 1000 lignes, 10 colonnes) sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le raccourci proposé (clic droit) dans le message de réponse

Dans l’attente


--
 Michel
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1
Bonjour Michel et ccm81,
Je vous l'avais dit que je n'étais pas un pro de la macro .... ! Apprendre tout seul, n'est pas aussi simple. Je vais préparer un fichier avec mon besoin en essayant d'être plus précis et plus clair dans ma demande. En même temps je vous montrerai ce que j'ai déjà fait. Vous verrez ainsi mon niveau (mais ne rigolez pas trop ....) et si vous le voulez bien vous me direz très objectivement ce que vous en pensez. Merci à vous deux
Bonne journée
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
Vous verrez ainsi mon niveau (mais ne rigolez pas trop ....)

Arrête de pleurnicher, on a tous débuté et on continue toujours à tomber sur des os...
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1
Bonjour Michel et ccm81
Tu sais Michel, je suis retraité et à mon âge on ne pleurniche plus depuis longtemps. Le VBA est un de mes passe-temps. Si ça ne marche pas comme je veux, je ne m'en fais pas une montagne et / ou je passe à autre chose.
En dehors de cela, comme j'aime beaucoup jouer avec les lettres, voici le fichier sur lequel je m'amuse.
J'ai mis dans l'onglet Notice, la vue que j'ai sur ce fichier avec les différentes actions que j'essaie de faire fonctionner.... avec mes connaissances !!
J'espère avoir été assez clair et explicite pour vous montrer mes problèmes.
Si vous avez des solutions pour améliorer les performances, je suis preneur.
Merci à vous
Bon WE
Voici le lien pour le fichier

http://www.cjoint.com/c/FAcmy3SxsQK
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
bonjour

Ta demande initiale:
Dans la cellule A1 la chaine est : "VRENEU".
Dans la cellule B1 la chaine est : "RNDEEVU".
Après action par bouton de commande, le delta de comparaison est le "D".
Dans la cellule B1 et je veux que ce "D" (donc le delta entre les deux chaines) passe en rouge gras.

Maintenant:
Dans les mots de 8 lettres, n'afficher que la 8eme lettre en rouge gras
http://www.commentcamarche.net/forum/affich-32973816-extraction-d-un-caractere-apres-comparaison-de-chaines#

???? pas sympa !


Mais sacré boulot que tu as pondu avec quelques trouvailles, bravo !!!

Au bout de > 1 heure pour piger ce que tu voudrais:

Si par exemple j'ai trouvé "ABAISSE" donc 1 scrabble

il faut que je cherche dans "dico" colonne AJ (8 lettres) les mots possibles avec "ABAISSE"
(abaissee, abaisser, rabaisse....) les mettre dans H6:H26 (feuille contrôle) avec la lettre supplémentaire en rouge (pour placer mon scrabble en m'accrochant sur la lettre rouge)

Questions



On cherche = 8 lettres ou >=8 lettres ?

Mot avec anagramme ABAiSSE + N lettres ?

Tu parles de 7 lettres mais est ce valable pour des mots plus petits?
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1 >
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020

Bonjour Michel
Il faut dire qu'au départ de notre discussion j'ai voulu vous donner un exemple de travail pour que je puisse avoir une idée et la réintégrer dans une de mes macros en la mettant conforme à tous les paramètres de ma macro. Manque de bol je n'y suis pas arrivé. Je n'aime pas avoir du "maché" et l'utiliser sans comprendre. J'aime bien m'appuyer sur des exemples et retravailler la macro et la mettre à ma sauce. C'est comme cela que j'arrive à progresser.
Pour le bouton "Trouver le Scrabble" (car je joue beaucoup de Scrabble) on part uniquement et obligatoirement sur un groupe de 7 lettres (pas forcément un mot de 7 lettres). Pour la 8ème lettre je m'explique. Quand tu joues au Scrabble tu as un rack de 7 lettres avec lesquelles tu essaies de faire ton Scrabble. Mais tu peux aussi faire un Scrabble ( que j'appelle Scrabble + ) de 8 lettres en utilisant une lettre déjà posée sur le plateau de jeu. Ce que je recherche c'est donc une 8ème lettre qui pourrait me servir à poser mes 7 lettres du rack. Tu peux avoir 7 lettres sans pouvoir faire un Scrabble mais avec une 8ème lettre pouvoir tout poser sur le plateau. Suis-je assez explicite ?
Dans la plage H6:H26 on ne doit voir que des mots de 7 lettres (donc tous les Scrabbles directs) ou de 8 lettres avec la 8ème lettre qui ne fait pas partie de la cellule C6 et qui sera mise en rouge gras.
exemple: dans mon rack j'ai "CAISSIE" Je ne peux pas faire de Scrabble. Par contre si j'ai un "R" sur le plateau que je peux jouer, je peux poser tout mon rack et mettre CAISSIER.
Je continue de travailler sur ce fichier bien sûr et j'ai réglé le problème des minuscules. J'ai réglé aussi je pense le problème des anagrammes mais je n'ai peut être pas fait tout le tour de la question.
Merci pour ton aide. Bon dimanche.
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
Ok, je laisse macérer un peu mes neurones...
la liste des scrabble+ s'insérera dans la colonne H
 Michel
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
oups !
Avant, donne moi un ou deux mots de 7 lettres ayant plusieurs Anagrammes : ce me fera gagner pas mal de temps !
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1 >
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020

1ER Groupe de 7 lettres : EAEMRIN
Anagrammes : ANEMIER MANIERE MARINEE MENERAI RANIMEE REANIME
2EME Groupe de 7 lettres : RRAPAEI
Anagrammes : PARERAI RAPERAI REPAIRA REPARAI
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1 >
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020

Bonjour,
Je sais que c'est moi le demandeur mais ....
Je ne sais quelle réflexion dois je tenir :
Je dois encore attendre un peu pour une aide
ou
Le dico que j'ai mis dans mon fichier est plus intéressant et l'aide je peux m'asseoir dessus ????
ou
tout simplement, manque de temps ....?
Des nouvelles ? Merci
Messages postés
16173
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 juillet 2020
2 990
Bonjour
Frank (Pijaku) a fourni une réponse intéressante le 4 janvier, non?
l'as tu regardée car tu n'as pas réagi depuis cette date?
voir post 16

 Michel
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1
Bonjour,
J'ai complément zappé ce passage. J'ai du ouvrir la discussion beaucoup plus loin et je ne suis pas remonté assez haut pour lire ce qui précédait. Mea Culpa. En fait j'attendais et j'étais resté sur le dialogue avec michel car tu me demandais de te donner 2 exemples que je t'ai fournis. J'en avais déduit que tu allais me donner une réponse ... ? non ?. Bon ce n'est pas grave. Je vais regarder ce que me propose Frank (merci à Toi). De prime à bord je n'ai pas tout compris mais je vais tester dès que je pourrai et essayer de comprendre. Mais ce qui m'intéresse pour répondre à ta question Franck, c'est uniquement le Scrabble et le Scrabble + (7 ou 8 lettres pas plus).
Bonne semaine
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449
Bonjour,

J'ai complément zappé ce passage
Tu as, pour cela, la possibilité, sous ta question, de faire un tri par date (ou date décroissante) ou par vote. Le tri par date reconstituera ta discussion dans l'ordre des dates de réponses.

J'en avais déduit que tu allais me donner une réponse ... ? non ?
Ben en fait, il a aussi répondu plus haut :
Bonjour
Chapeau Frank !
je te plussoie et te laisse le bébé ! ;o)

Donc, à mon tour...

De prime à bord je n'ai pas tout compris mais je vais tester dès que je pourrai et essayer de comprendre.
N'hésite surtout pas à poser toutes tes questions sur ce fil.
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1 >
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020

Bonjour Frank et Michel

Tout d'abord, je remercie Michel pour ses réponses en espérant que je ne lui ai pas fait perdre du temps.
Frank, j'ai travaillé sur la macro que tu as donnée le 4 janvier. Je l'ai décortiquée avec mes connaissances et j'ai réalisé des essais en l'adaptant un peu. Dans le fichier dont l'adresse est la suivante :

http://www.cjoint.com/c/FABpRWETSJ7

J'ai réalisé 6 tests. Les explications, les résultats et mes questions sont mentionnés dans la Feuil1 du fichier. Des erreurs se sont glissées. Peut être parce que mes lignes de code sont mal placées ou mal formulées ... ou pour tout autre raison que je ne vois pas ??
Très important pour moi :
J'attends surtout des réponses (si possible bien sûr ...) aux questions que j'ai mises dans la zone de texte en vert pour que je puisse continuer à comprendre la macro et voir les résultats escomptés.

Je pars d'une chaine de caractères de 7 lettres max (range("I6")).
Pour une chaine de caractères allant de 3 à 6 lettres :
Je veux tirer de cette chaine, tous les mots possibles présents dans le dico ayant le même nombre de lettres et qui seront affichés dans la colonne A par exemple.
J'ai fait des essais avec 5 lettres et cela fonctionne hormis les doublons.
Pour une chaine de caractères de 7 lettres max uniquement :
Je veux tirer de cette chaine, tous les mots possibles présents dans le dico ayant le même nombre de lettres qui seront affichés dans la colonne A par exemple.
mais aussi
Avoir la possibilité de trouver des mots dans le dico supportant ces 7 lettres de départ avec une possibilité d'en ajouter une et qui passerait en rouge dans la liste d'affichage.
Pourquoi ? :
Sur un plateau de jeu de lettres tu peux poser tes 7 lettres formant un mot existant en le collant à une lettre déjà placée sur le plateau de jeu.
Ce principe d'une lettre supplémentaire pour une chaine de caractères inférieure à 7 ne m'intéresse pas.

Grâce à Toi, je ne suis plus très loin du but final. Je pense qu'il reste à corriger ces histoires de doublons et cette différence de comptage du nombre de mots trouvés par rapport à ceux affichés.

Je pense que le travail doit être fait uniquement sur ce fichier qui est très proche, fonctionnellement parlant, de ce que j'ai envie d'en faire. Le reste n'est qu'une question d'adaptation, de design, d'ergonomie et d'options.

Par avance, merci et bonne soirée.
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449
Bonjour,

Pour ce qui concerne les doublons, je ne suis pas encore certain d'avoir trouvé le pourquoi.

J'ai remplacé le T_Out par un Dico_Out, viré les variables obsolètes indTab et fin, enlevé le paramètre Plus (remplacé par la variable Plus dans la Sub Scrabble) et ajouté un paramètre String. C'est l'adresse de la première cellule de restitution des données (+ simple pendant les tests).
Ainsi, un exemple d'appel :
Scrabble lettres_cherchees, Array("A", "R", "T", "U", "I", "O", "P"), "A4"

restituera la liste à partir de la cellule A4
En tout état de cause, voici le nouveau code qui corrige les bugs.

Public Dico_Out As Object, Dico As Object

Sub Vazy()
Dim lettres_cherchees As String

'appel de la procédure
   'CAISSIE ==> correspond aux 7 lettres du rack
   'Array("A", "R", "T", "U", "I", "O", "P") ==> Liste des 8èmes lettres possibles
      'Si pas de lettres supp exemple Array() ==> pas de recherche supplémentaire
   '"C4" ==> String correspondant à la première cellule ou l'on veut restituer les mots trouvés
'exemples d'appels
   'Scrabble "CAISSIE", Array("A", "R", "T", "U", "I", "O", "P"), "A4" ==> Scrabble +
   'Scrabble "CAISSIE", Array(), "A4" ==> Scrabble
'========================================================================
   lettres_cherchees = UCase(Sheets("Feuil1").Range("I6").Value)
   
   Scrabble lettres_cherchees, Array("A", "R", "T", "U", "I", "O", "P"), "C4"
End Sub

Sub Scrabble(Chaine As String, Lettres_Sup As Variant, Cell_Restit As String)
Dim t As Single, i As Integer, test As Long, Plus As Boolean
Dim start
Dim finish
Dim duree

'départ chrono
   start = Time
   
   On Error Resume Next
   test = Dico.Count
   If Err <> 0 Then Creation_Dico
   On Error GoTo 0
   
   'création du dictionary pour stocker les résultats
   Set Dico_Out = CreateObject("Scripting.Dictionary")
   
   Combiner Chaine, ""
   'analyse si pas de valeur dans Lettres_Sup alors Scrabble simple sinon Scrabble +
   Plus = (UBound(Lettres_Sup) > -1)
   If Plus Then 'si le choix = Scrabble+
      For i = LBound(Lettres_Sup) To UBound(Lettres_Sup)
         'alors on combine avec toutes les lettres supplémentaires possibles
         Combiner Chaine & Lettres_Sup(i), ""
      Next i
   End If

'fin chrono
   finish = Time
'======================================================================== AFFICHAGES
   'affiche le timer de départ
   Sheets("Feuil1").Range("I1").Value = start
   'affiche le timer de fin
   Sheets("Feuil1").Range("I2").Value = finish
   duree = finish - start
   'affiche le temps mis pour la recherche
   Sheets("Feuil1").Range("I3").Value = duree
   'affiche le nombre de mots trouvés
   Sheets("Feuil1").Range("I4").Value = Dico_Out.Count
   'affiche la liste des mots trouvés
   Sheets("Feuil1").Range(Cell_Restit).Resize(Dico_Out.Count, 1) = Application.Transpose(Dico_Out.keys)
'========================================================================

   Debug.Print "procédure complète en : " & Timer - t & " nombre de mots trouvés : " & Dico_Out.Count
End Sub

Sub Combiner(strText As String, debut As String)
'Combiner établit la liste des combinaisons possibles
'avec la chaîne strText
Dim i As Integer, l As Integer

   If Len(strText) = 1 Then
      'si la combinaison existe dans le Dico ==> mot trouvé
      If Dico.Exists(debut & strText) Then
         'on stocke ici le mot trouvé dans la variable Dico_Out
         Dico_Out(debut & strText) = ""
      End If
   Else
       For i = 1 To Len(strText)
           Combiner Mid(strText, 2, Len(strText) - 1), debut & Mid(strText, 1, 1)
           strText = Mid(strText, 2, Len(strText) - 1) & Mid(strText, 1, 1)
       Next
   End If
End Sub

Sub Creation_Dico()
'création du dictionnaire en mémoire à partir de la feuille dico
Dim Lig As Long, DL As Long, Col As Integer, Tbl, tbis As Single
   
   tbis = Timer
   Set Dico = CreateObject("Scripting.Dictionary")
   Tbl = Sheets("dico").Range("A6:Z" & Sheets("dico").Cells.SpecialCells(xlCellTypeLastCell).Row)
   For Lig = LBound(Tbl, 1) To UBound(Tbl, 1)
      For Col = LBound(Tbl, 2) To UBound(Tbl, 2)
         Dico(Tbl(Lig, Col)) = ""
      Next Col
   Next Lig
   
   Debug.Print "création du dictionnaire en : " & Timer - tbis & " pour : " & Dico.Count & " mots"
End Sub



Et la réponse à tes questions :

Question 1
Le pourquoi des doublons ? Pour ma part, je pense peut être à un mauvais placement de ma ligne de code pour l'affichage des résultats ? Mais ça n'explique pas, que pour une chaine de 7 lettres on ait un doublon à chaque mot et non sur une chaine de 5 lettres.
Les doublons sont, à mon avis, dus à un "double lancement" de la Sub Combiner.
Bon, je ne me l'explique pas complètement. Je me pencherais là dessus plus tard.
La parade la plus simple en attendant l'explication, est d'utiliser un Dictionary (Dico_Out) pour la restitution des données. C'est fait.

Question 2
Dans la macro Sub Vazy
Je suppose que les lettres dans le Array dans l'exemple donné (Array("A", "R", "T", "U", "I", "O", "P")) ont été mises au hasard pour traiter l'exemple ?
Si je veux que le test se fasse sur tout l'alphabet, il faut indiquer toutes les lettres dans le Array ?
Oui
J'ai enlevé le paramètre Plus. Cela évite de lancer la macro avec un Array vide et une demande de scrabble +. Le Scrabble + (8 lettres) ne se calculera que si des lettres sont données dans l'Array. La variable Booléenne Plus est maintenant calculée en fonction de l'UBound de l'Array passé en paramètre.

Question 3
Pourquoi une différence entre le nombre d'affichage de résultats et le nombre donné par la macro ?
Le nombre donné par la macro était faux. De ma faute... UBound(T_Out) nous donne l'indice du dernier élément du tableau, pas le nombre de valeurs contenues dans ce tableau. Comme le premier indice du tableau est 0, le nombre d'éléments est égal à UBound(T_Out) + 1. 
Cette question n'a plus lieu d'être puisqu'on utilise un Dictionary. Il suffit d'utiliser Dico_Out.Count.

Question 4
Comment mettre La procédure de création en mémoire de l'objet Dictionary à l'ouverture du classeur pour ne l'utiliser qu'une seule fois ?
Dans VBE, dans la fenêtre VBA-Project, tu as les objets du classeurs. Dont l'objet Thisworkbook. Double clic dessus pour en ouvrir le Module de code.
C'est dans ce module que tu peux travailler avec les événements du classeur : ouverture (Open), fermeture (BeforeClose) etc...
Ici, tu veux à l'ouverture du classeur lancer la Sub Creation_Dico, je t'ai placé ce code :

Private Sub Workbook_Open()
Creation_Dico
End Sub

Il se déclenchera à chaque ouverture du classeur.



Et voici ton FICHIER EXEMPLE

Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1
Est ce que tu as vu mes réponses que j'ai faites le 03/02/16 en fin de matinée suite à tes réponses 42 et 43 car je ne les vois pas sur la toile alors que je les ai bien validées à chaque fois ? sinon je disais que j'ai refait ma macro pour la conversion. Elle fonctionne bien. Pas de doublons, pas de caractères indésirables et trié comme dans excel. Ce qui va certainement changer avec la tienne, c'est le temps de conversion du fichier.xls en fichier.txt.
Merci encore pour ton aide. Il ne reste plus qu'à savoir comment utiliser ce fichier .txt pour accélérer le travail des scrabbles.
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449 >
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016

Bonjour,

Il ne reste plus qu'à savoir comment utiliser ce fichier .txt pour accélérer le travail des scrabbles.
Pour cela tu utilises la macro Charge_dico donnée à mon message 43.
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1 >
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020

Bonjour Pijaku,

D'accord pour l'utilisation de la macro mais j'ai un problème de compréhension ... Jusqu'à maintenant quand je faisais mes macros, je travaillais sur un onglet xls comme ici l'onglet "dico". mais maintenant que l'on travaille avec un fichier.txt, je ne peux avoir le même langage ? quand j'utilisais par exemple des For col...next ou For ligne...next maintenant je ne peux plus travailler comme cela pour rechercher un mot par exemple ? je dois raisonner avec un fichier.txt et non plus avec un onglet.xls ? Tout le travail doit se faire maintenant dans "NomFicTxt" ? Si c'est le cas, je n'ai jamais travaillé avec un langage attaquant un fichier.txt. Mais s'il le faut , je vais m'y mettre.
Ce n'est pas facile d'expliquer. Je ne sais pas si j'arrive à me faire comprendre ? c'est pour cette raison que j'avais écrit : "Il ne me reste plus qu'à savoir comment utiliser ce fichier .txt pour accélérer le travail des scrabbles."
Bonne journée.
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449 >
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016

Bonjour,

Non, ton analyse n'est pas tout à fait exacte.
Avant tu travaillais avec une variable tableau qui reprenait les valeurs contenues dans ta feuille.
Maintenant, tu travailles avec une variable Dictionary qui contient les données d'un fichier txt.
La démarche est la même mais rendue plus aisée.
Si tu veux savoir si un mot existe dans le dictionnaire, il te suffit d'écrire :
If Dico.Exists(monMot) Then

Cf mon code du message 26 du 28 janv. 2016 à 09:44
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1 >
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020

Bonjour Pijaku,

Ok je vais voir si j'arrive à me débrouiller avec ce que j'ai et ce que je connais.
Merci et Bonne journée.
Messages postés
53
Date d'inscription
jeudi 30 octobre 2014
Statut
Membre
Dernière intervention
4 mars 2016
1
Bonjour Pijaku,

Très heureux de voir une réponse aussi efficace et si rapide. J'ai regardé le fichier corrigé et fait les tests. C'est super ! Là grâce à toi, je vais faire un sacré bond pour moi continuer. En plus tout est clair dans tes explications. Réponses aux questions directes, ça c'est le top.
Je vais regarder pour mettre cette feuille "dico" au format .Txt
Comment présenter le fichier .Txt ?
Qu'est ce qui est le mieux : mettre tous les mots les uns en dessous des autres (tant pis pour la longueur du fichier) ou peut on mettre les mots les uns à côtés des autres et à suivre...ligne par ligne ? Je pencherais pour la 1ère solution.
En tous les cas, un grand merci !
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449
Bonjour,

Tu as deux choix en ce qui concerne les fichiers txt.
1- tu fais un fichier avec un mot par ligne
2- tu fais un fichier type csv.

Le plus simple à exploiter comme on le fait nous (par un Objet Dictionary) étant la solution 1.
Sache toutefois que le fichier txt peut être créé, par macro, à partir de ton fichier Excel.
ça te ferait gagner beaucoup de temps.....

Mais tu n'en n'es pas encore là.
Dis nous...