Extraction d'un caractère après comparaison de chaines

Résolu/Fermé
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 - 31 déc. 2015 à 13:57
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 - 5 févr. 2016 à 08:50
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 !
A voir également:

16 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
4 janv. 2016 à 10:29
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
4 janv. 2016 à 11:00
Bonjour
Chapeau Frank !
je te plussoie et te laisse le bébé ! ;o)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
4 janv. 2016 à 11:13
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+
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
4 janv. 2016 à 11:19
j'avais oublié: Meilleurs vœux à tous

Et bravo pour ta révolution, Kamarade !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 janv. 2016 à 09:47
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.
1
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
31 déc. 2015 à 16:38
Bonjour

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

Cdlmnt
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1
31 déc. 2015 à 17:48
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 .....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 31/12/2015 à 18:00
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
31 déc. 2015 à 18:16
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
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
31 déc. 2015 à 18:33
Pour la question 2, essaies ceci
http://www.cjoint.com/c/ELFrHm2hOpk

Cdlmnt
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1
31 déc. 2015 à 19:52
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
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
31 déc. 2015 à 20:05
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 1/01/2016 à 09:42
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
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1
1 janv. 2016 à 11:44
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
1 janv. 2016 à 13:40
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...
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1
2 janv. 2016 à 13:33
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 3/01/2016 à 09:07
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?
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
3 janv. 2016 à 11:00
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.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 3/01/2016 à 11:39
Ok, je laisse macérer un peu mes neurones...
la liste des scrabble+ s'insérera dans la colonne H
 Michel
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 3/01/2016 à 11:41
oups !
Avant, donne moi un ou deux mots de 7 lettres ayant plusieurs Anagrammes : ce me fera gagner pas mal de temps !
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
4 janv. 2016 à 10:38
1ER Groupe de 7 lettres : EAEMRIN
Anagrammes : ANEMIER MANIERE MARINEE MENERAI RANIMEE REANIME
2EME Groupe de 7 lettres : RRAPAEI
Anagrammes : PARERAI RAPERAI REPAIRA REPARAI
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
24 janv. 2016 à 10:05
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 24/01/2016 à 10:37
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
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1
25 janv. 2016 à 10:51
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
26 janv. 2016 à 07:32
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.
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
27 janv. 2016 à 17:19
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 28/01/2016 à 09:45
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 janv. 2016 à 20:01
Bonsoir,
J'ai compris, en passant l'aspirateur (rien à voir mais bon j'le signale quand même...), le problème des doublons.
Ça me turlupinais qu'il n'y en avait pas pour ton "mot" de 5 lettres mais qu'il y en avait pour 7...
C'est tout bête et j'aurais pu y penser avant. C'est toi qui m'a poussé à me poser cette question, donc tu mérites la réponse avant tout le monde.
Le souci vient du fait qu'on injecte dans la macro (Sub compiler) deux lettres identiques.
Il va trouver deux mots avec les mêmes lettres car le caractère double sera placé différemment.
Exemple :
Compiler("AAC")
nous donnera deux fois CAA :
Compiler (A1A2C) :
CA1A2
CA2A1
Ok?
Donc la solution du dictionary est bonne.
Je reviens demain pour te donner une éventuelle autre solution avec une variable tableau qui sera moins "lourde" en mémoire.
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
29 janv. 2016 à 09:32
Bonjour Pijaku
Ca vaut le coup de passer l'aspirateur .... je vais essayer lorsque j'aurai un problème à résoudre ..... ! Trêve de plaisanterie, en effet cela pourrait expliquer cela. C'est tout à fait cohérent.
J'ai travaillé un peu, encore, sur le fichier que tu m'as renvoyé. Je l'ai amélioré en faisant dans la même colonne des réponses (la colonne C), un tri sur les scrabble en haut de colonne et un tri à suivre sur les scrabble+. Ainsi, à suivre on a les scrabble triés puis les scrabbles+ triés. C'est plus lisible. J'ai également essayé avec tout l'alphabet dans le Array. Cela fonctionne bien (environ 1'45"" de temps de recherche). J'ai également mis un InputBox au début pour avoir le choix entre la sortie des scrabble ou des scrabble+. Le chargement se fait bien pour le dico ; soit juste avant la visu du fichier (juste après la fenêtre Office Excel) ou après l'ouverture (donc la visualisation de la Feuil1). Par contre j'ai remarqué lorsque je fais une modif sur la macro et qu'ensuite je fais un essai, il me recharge parfois le dico. C'est peu être normal ?
Demain je vais travailler (enfin je vais essayer) sur la modif du dico.
Merci et bonne journée à Toi.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016
29 janv. 2016 à 10:55
Bonjour,

Par contre j'ai remarqué lorsque je fais une modif sur la macro et qu'ensuite je fais un essai, il me recharge parfois le dico. C'est peu être normal ?
Oui. Lorsque tu vas modifier sous VBE, il supprime les variables stockées en mémoire.

Je ne suis pas trop partant pour une InputBox. Pour laisser un choix à l'utilisateur, il vaut mieux utiliser une MsgBox type VbYesNo.
Un code un peu comme ça :

Dim rep As Integer
rep = MsgBox("Voulez-vous un Scrabble +?", vbQuestion + vbYesNo, "CHOIX")
If rep = vbYes Then
   MsgBox "Scrabble +++"
Else
   MsgBox "Scrabble simple"
End If

Ici, contrairement à l'inputbox, l'utilisateur ne peut pas faire d'erreur de saisie...
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
29 janv. 2016 à 17:29
Bonsoir,

Tu as raison mais s'il y a une erreur c'est moi qui l'aurais faite car il n'y aura que moi qui répondrai à la question. Alors ça devrait le faire ! Bon week !
PS : par contre je me suis posé la question suivante : pourquoi as tu mis "rep" as Integer. Est ce pour la réponse : 1 = Yes et 0 = No (ou l'inverse) donnée par les deux boutons ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016
29 janv. 2016 à 18:39
Bonsoir,

pourquoi as tu mis "rep" as Integer. Est ce pour la réponse : 1 = Yes et 0 = No (ou l'inverse) donnée par les deux boutons ?
Presque.
vbYes, tout comme vbNo sont des constantes. Elles sont toutes deux des Integer et leurs valeurs respectives sont 6 et 7.
Le code donné précédemment aurait donc pu s'écrire :
Dim rep As Integer
rep = MsgBox("Voulez-vous un Scrabble +?", vbQuestion + vbYesNoCancel, "CHOIX")
If rep = 6 Then 'vbYes
   MsgBox "Scrabble +++"
ElseIf rep = 2 Then 'vbCancel
   MsgBox "Annulation"
ElseIf rep = 7 Then 'vbNo
   MsgBox "Scrabble simple"
Else 'dans tous les autres cas ==> mais comme il n'y a pas d'autres boutons cf MsgBox
   MsgBox "impossible de voir ce message"
End If

Pour toutes les valeurs de ces constantes vois ceci :
https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/msgbox-constants?redirectedfrom=MSDN
0
mousaillon Messages postés 53 Date d'inscription jeudi 30 octobre 2014 Statut Membre Dernière intervention 3 mars 2016 1
28 janv. 2016 à 14:46
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 !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 janv. 2016 à 15:34
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...
0