Variable appartenant a une collection

Fermé
yan1954 - 19 janv. 2022 à 13:37
eriiic Messages postés 24585 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 27 juin 2024 - 20 janv. 2022 à 19:42
Bonjour,
dans une colonne j'ai 15 000 mots de 6 lettres
je dois tester si la 1ere, 3 et 5 eme lettres sont des voyelles
j'ai donc crée une collection "voyelle" contenant a,e,i,o,u,y
je teste avec "for each mot ....... next" tous les mots de ma liste et a chaque mot j'extrais avec "mid" L1,L2 et L3
existe-il une instruction simple pour vérifier si mes 3 lettres extraites sont bien des voyelles, du genre
si L1 et L2 et L3 appartient a la collection alors t=1
ou séparément si L1 appartient a la collection then t1=1
Merci de votre aide
YB

11 réponses

Le Pingou Messages postés 12116 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 442
19 janv. 2022 à 15:29
Bonjour,
Petite question, que faites-vous si un mot à la correspondance exact (la 1ere, 3 et 5 eme lettres sont des voyelles) ?
0
Raymond PENTIER Messages postés 58527 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 6 juillet 2024 17 143
19 janv. 2022 à 15:46
Salut YB.

Rassure-moi : tu parles bien de macro ?
0
Merci de me répondre
soit je l'écrit dans une autre colonne avec tout les mots de la liste qui seront éligibles au test, soit je le concatène avec tous les mots éligibles
en faisant a chaque fois que le test sera "oui"
mots=mots +mot
j'aurais au final un trés grand mot pour lequel j'aurais un autre traitement a faire.
je cherche donc une instruction qui dirait
"true" si l'appartenance a la collection est vraie
ou alors permette d'écrire ceci
if L1 "appartient a voyelle" then t1=1
0
via55 Messages postés 14434 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 2 juillet 2024 2 715
Modifié le 19 janv. 2022 à 18:17
Bonjour yan, coucou RaymonD ☺

Sans macro simplement par formules simples et un filtre on obtient immédiatement (et plus rapidement que par macro je pense) la liste de mots correspondant à ton critère de voyelles en position 1, 3 et 5 (je suis parti de la liste des 17 991 mots de 6 lettres admis au scrabble)
https://www.cjoint.com/c/LAtrrhn6dzW

Si tu persistes néanmoins à vouloir faire par macro, tu peux par exemple sur ta feuille Excel avoir dans une colonne la liste des voyelles, puis dans la macro vérifier à chaque extraction de lettre avec un COUNTIF si la lettre extraite est présente dans la liste ou non (le COUNTIF retournera 0 ou 1) puis en faisant la somme des COUNTIF si on obtient 3 c'est Ok...

Cdlmnt
Via

0
Le Pingou Messages postés 12116 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 442
19 janv. 2022 à 18:13
Bonjour via55,
Merci
Salutations.
Le Pingou
0
via55 Messages postés 14434 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 2 juillet 2024 2 715 > Le Pingou Messages postés 12116 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 4 juillet 2024
19 janv. 2022 à 18:26
Bonjour Le Pingou
Désolé j'avais omis de te saluer, je n'avais pas vu ta courte intervention !
Cdlmnt
Via
0

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

Posez votre question
Merci Raymond
c'est un peu de cette façon que j'avais résolu mon problème.
Mais je suis toujours a la recherche d'une instruction a mettre dans une macro qui permettrait de savoir si une variable est présente dans une collection, mais je ne trouve rien sur le sujet.
bonne soirée
YB
0
Le Pingou Messages postés 12116 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 442
19 janv. 2022 à 18:42
Bonjour yan1954,
Merci de revoir le poste 2!
Il serait bien de mettre un petit exemple : les données et le résultat à obtenir .... la macro pourrait suivre dans se cas!
0
je suis pas un grand spécialiste des macros mais j'ai fait ceci
Sub toto()
'--crée une collection de nom "voyelle"
Dim voyelle As New Collection
voyelle.Add Item:="a"
voyelle.Add Item:="e"
voyelle.Add Item:="i"
voyelle.Add Item:="o"
voyelle.Add Item:="u"
voyelle.Add Item:="y"
'colone où est la liste
Application.Goto Reference:="plage"

For Each c In Selection
l1 = Mid(c, 1, 1)
l3 = Mid(c, 3, 1)
l5 = Mid(c, 5, 1)
'ici je voudrais tester si L1,L3,L5 appartiennent à voyelle, je sais pas faire
' et si oui garder le mot dans une autre colonne où dans une variable çà je sais faire
Next
Stop
End Sub
peut etre je cherche une instruction qui n'existe pas

ma liste contient des mots (environ 15 000) de ce type
abatte
abattu
abbaye
abetir
abimee
abimer
............. etc
abatte,abattu,abbaye je jette
abetir,abimee,abimer je garde
et ce jusqu'à épuisement de la liste

A+
YB
0
via55 Messages postés 14434 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 2 juillet 2024 2 715
19 janv. 2022 à 20:43
Re,

C'est moi qui t'avais donné ma solution par formules
Par macro pourquoi t'embêter avec une collection, inutile ici, il suffit de vérifier la présence des lettres dans la chaine de caractères aeiouy, ce qui pourrait donner quelque chose comme ceci pour recopier les mots avec 3 voyelles :
x = 1
Sub toto
For Each c In Range("A2:A17992")
l1 = Mid(c, 1, 1)
l3 = Mid(c, 3, 1)
l5 = Mid(c, 5, 1)
r1 = InStr("aeiouy", l1)
r3 = InStr("aeiouy", l3)
r5 = InStr("aeiouy", l5)
        If r1 * r3 * r5 > 0 Then
        x = x + 1
        Range("B" & x) = c
        End If
Next
End Sub


J'ai détaillé pour la compréhension et en partant de ta macro mais en fait toute la partie
l1 = Mid(c, 1, 1)
l3 = Mid(c, 3, 1)
l5 = Mid(c, 5, 1)
r1 = InStr("aeiouy", l1)
r3 = InStr("aeiouy", l3)
r5 = InStr("aeiouy", l5)
If r1 * r3 * r5 > 0 Then
pourrait être remplacée par une seule ligne simplement :
If InStr("aeiouy", Mid(c, 1, 1)) * InStr("aeiouy", Mid(c, 3, 1)) * InStr("aeiouy", Mid(c, 5, 1)) > 0 Then


Cdlmnt
Via
0
merci a tous
merci a Via55, "instr" répond parfaitement a ce que je veut faire.
Maintenant je serais trés intéressé de savoir si il est possible de tester une collection, afin de savoir si une variable appartient a cette collection.
A+
YB
0
via55 Messages postés 14434 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 2 juillet 2024 2 715
20 janv. 2022 à 14:43
Re

A ma connaissance le seul moyen est de boucler sur tous les items de la collection et de les comparer à la variable et de mettre une variable de résultat à 1 dans le cas de correspondance, exemple :
mavariable = "chat"
result = 0
For n = 1 To maliste.Count
If maliste(n) = mavariable Then result = 1
Next
If result = 1 Then
MsgBox valeurcherchee & " appartient à la collection"
Else
MsgBox valeurcherchee & " n' appartient pas à la collection"
End If

A+
0
Salut
Ok via55
je garde ton exemple
merci à toi
A+
Yan
0
eriiic Messages postés 24585 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 27 juin 2024 7 226
20 janv. 2022 à 19:42
Bonjour,

autre moyen de valider avec une expression regex :
    Dim masque As String, mot As String
    masque = "[a,e,i,o,u,y]"
    mot = "abimer"
    ok = mot Like masque & "?" & masque & "?" & masque & "*"

Tu peux ajouter les lettres accentuées sans difficulté.
eric
0