Variable appartenant a une collection

yan1954 -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    Bonjour,
    Petite question, que faites-vous si un mot à la correspondance exact (la 1ere, 3 et 5 eme lettres sont des voyelles) ?
    0
  2. Raymond PENTIER Messages postés 58213 Date d'inscription   Statut Contributeur Dernière intervention   17 482
     
    Salut YB.

    Rassure-moi : tu parles bien de macro ?
    0
  3. yan1954
     
    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
  4. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
    1. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
       
      Bonjour via55,
      Merci
      Salutations.
      Le Pingou
      0
      1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759 > Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonjour Le Pingou
        Désolé j'avais omis de te saluer, je n'avais pas vu ta courte intervention !
        Cdlmnt
        Via
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yan1954
     
    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
  7. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    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
  8. yan1954
     
    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
  9. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  10. yan1954
     
    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
  11. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
    1. yan1954
       
      Salut
      Ok via55
      je garde ton exemple
      merci à toi
      A+
      Yan
      0
  12. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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