Variable appartenant a une collection

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. Bonjour,
    Petite question, que faites-vous si un mot à la correspondance exact (la 1ere, 3 et 5 eme lettres sont des voyelles) ?
    0
    1. Contributeur
      Salut YB.

      Rassure-moi : tu parles bien de macro ?
      0
      1. 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
        1. 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. Bonjour via55,
            Merci
            Salutations.
            Le Pingou
            0
          2. @Le PingouBonjour Le Pingou
            Désolé j'avais omis de te saluer, je n'avais pas vu ta courte intervention !
            Cdlmnt
            Via
            0
        2. 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
          1. 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
            1. 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
              1. 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
                1. 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
                  1. 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. Salut
                      Ok via55
                      je garde ton exemple
                      merci à toi
                      A+
                      Yan
                      0
                  2. Contributeur
                    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