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. 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
    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. 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,

        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. 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. 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. 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 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 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. Contributeur
                  Salut YB.

                  Rassure-moi : tu parles bien de macro ?
                  0
                  1. Bonjour,
                    Petite question, que faites-vous si un mot à la correspondance exact (la 1ere, 3 et 5 eme lettres sont des voyelles) ?
                    0