IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer un par un les mots d'une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Récupérer un par un les mots d'une cellule
    Salut à tous !

    J'ai une cellule contenant X mots (séparés par des espaces ou de la ponctuation). Ce que je veux c'est récupérer chaque mot dans une variable (via un script VB) pour lui appliquer un traitement ultérieur dans une boucle. Existe t'il une fonction pour récupérer les mot d'une cellule ?

    Puis je procéder de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim mot as Object
     
    For Each mot in Range ("A1")
     
    Next mot
    merci pour votre aide :-)

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Non, dans ton code Mot est un range. mais tu peux faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub test()
    Dim Mot as variant, tablo as variant
    Dim i as integer, NoLig as long
     
    'Tableau des ponctuations possibles
    Pontuation = array(",", ".", ";", "?", "!", ":")
     
    'Parcours de la colonne contenant les cellules (ici la colonne A)
    For NoLig = 1 to Range("A65536").end(xlup).row
        'test pour savoir si la cellule est vide
        if cells(NoLigne, 1) <> "" then 
             mot = cells(NoLigne, 1)
             'on retire toutes les ponctuations de la liste
             For i = 1 to Ubound(Ponctuation)
                  Mot = Replace(Mot,Ponctuation(i), " ")
             Next
     
             'on crée un tableau des mots contenus dans la cellule
             Tablo = Split(Mot, " ")
     
             'on écrit le tableau dans la ligne, un mot par colonne
             For i = 0 to Ubound(Tablo)
                  Cells(NoLig, i + 1) = Tablo(i)
             Next
        endif
    Next
    End sub
    La liste (",", ".", ";", "?", "!", ":") est celle des ponctuations possibles, tu peux en retirer ou en ajouter entre guillemets, séparés par une virgule.
    Range("A65536").end(xlup).row donne le nombre de lignes renseignées de la colonne des cellules à diviser.

    Pas testé. Tu peux le faire pour moi ?
    A+

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonsoir,

    ou encore, si l'on veut éviter tous ces replace qui risquent de ralentir une phrase longue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Command1_Click()
     Dim toto As String, i As Integer, messeps As String, lesmots As String, titi
     toto = "il est parti, avec sa mère, faire des courses au marché ! il reviendra; j'en suis certain."
     titi = Split(toto & " ", " ")
     messeps = ",;:!."
     lesmots = ""
     For i = 0 To UBound(titi)
      If Len(titi(i)) > 1 Then
        While InStr(messeps, Right(titi(i), 1)) > 0
          titi(i) = Left(titi(i), Len(titi(i)) - 1)
        Wend
        lesmots = Trim(lesmots) & titi(i) & vbCrLf
      End If
     Next
       MsgBox lesmots
    End Sub
    on part tout simplement du principe selon lequel une ponctuation est forcément suivie d'un espace...

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    Bonsoir à vous tous
    voici une variante à testée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim i As Integer, Chaine As String
    Chaine = Range("A2").Value
      For i = 1 To Len(Chaine)
        If Mid(Chaine, i, 1) = "," Or Mid(Chaine, i, 1) = "." _
           Or Mid(Chaine, i, 1) = ";" Or Mid(Chaine, i, 1) = "?" _
           Or Mid(Chaine, i, 1) = "!" Or Mid(Chaine, i, 1) = ":" Then
           Mid(Chaine, i, 1) = " ": End If
      Next i
       ChaineTraitée = Split(Chaine, " ")
            For j = 0 To UBound(ChaineTraitée)
              MsgBox ChaineTraitée(j)
            Next j
    End Sub
    Bonne soirée

    Abed_H

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    AHH tu as fait une seconde réponse. je vais l'étudier dès demain. Merci pour tes réponse rapide en tout cas !

    Une question sur le premier source : le script bloque sur la fonction REPLACE qui en effet ne me semble pas académique (telle que je l'utilise directement dans les cellules sans faire de VBS)... la syntaxe diffère...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Pour une version d'office antérieure à 2000, Replace ne fonctionne pas.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Pour une version d'office antérieure à 2000, Replace ne fonctionne pas.
    Merci à tous les deux,

    je suis coincé dans les 2 cas car la fonction SPLIT n'est pas reconnue. j'ai pourtant une version de Excel et VBA (11.0)récente, mais sur Mac :-(

    Bon je vais essayer de réécrire la fonction SPLIT avec les moyens du bord (j'vous jure :-)

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Plus simple encore, je suis passé sur un PC et tout marche impec __

    Merci pour votre aide précieuse et en plus quel bonheur de découvrir de si beaux codes :=)

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tiens, je m'étais fait ça, à l'époque où je n'avais pas de poil au menton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Function Spliit(Adresse, separateur)
    Dim Tableau(), Phrase, i As Byte, j As Byte
        Phrase = Adresse
        i = 1
        j = 0
        Do While i < Len(Phrase)
            If Mid(Phrase, i, 1) = separateur Then
                ReDim Preserve Tableau(j)
                Tableau(j) = Left(Phrase, InStr(Phrase, separateur) - 1)
                Phrase = Right(Phrase, Len(Phrase) - InStr(Phrase, separateur))
                j = j + 1
                i = 0
            End If
            i = i + 1
        Loop
        ReDim Preserve Tableau(j)
        Tableau(j) = Phrase
        Spliit = Tableau
    End Function
    Tu lui envoies la phrase et le séparateur et ça te renvoie un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub appel()
    Dim tablo As Variant, i As Integer
    tablo = Spliit("J'ai deux grands boeufs dans mon étable", " ")
    For i = 0 To UBound(tablo)
         MsgBox tablo(i)
    Next
    End Sub
    A+

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Tiens !

    J'avais également fait quelque chose du même genre, mais en permettant le traitement avec un éclatement sur "plus long qu'un seul caractère) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Function Split(ByVal MyString As String, ByVal Separator As String) As Variant
      Dim iPosit As Long
      Dim Table() As String
      ReDim Table(0) 'ATTENTION : Il semble qu'il faille commencer à  et pas à 0 pour coller à VB6
      iPosit = InStr(MyString, Separator)
      If iPosit = 1 Then
        MyString = Mid$(MyString, Len(Separator) + 1)
        iPosit = InStr(MyString, Separator)
      End If
      While iPosit > 0
        Table(UBound(Table)) = Left(MyString, iPosit - 1)
        MyString = Mid$(MyString, iPosit + Len(Separator))
        ReDim Preserve Table(UBound(Table) + 1)
        iPosit = InStr(MyString, Separator)
      Wend
      Table(UBound(Table)) = MyString
      Split = Table
    End Function

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Attention, dans VBA 97, Split est une propriété, à ne pas donner au nom de la fonction
    Citation Envoyé par L'aide VBA 97
    Split, propriété
    Cette propriété a la valeur True si la fenêtre est fractionnée. Type de données Boolean en lecture-écriture.

    Remarques

    La propriété FreezePanes peut avoir la valeur True et la propriété Split, la valeur False, et inversement.
    Cette propriété s'applique uniquement aux feuilles de calcul et aux feuilles macro.
    A toutes fins utiles

Discussions similaires

  1. Compter les mots d'une phrase
    Par miss64 dans le forum Langage
    Réponses: 12
    Dernier message: 07/01/2017, 10h57
  2. Réponses: 2
    Dernier message: 17/02/2015, 17h38
  3. Récupérer les mots d'une phrase
    Par ehtpistesigiste dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 05/11/2012, 16h49
  4. comment en VBA mettre les mots dans une cellule en oblique
    Par antoine.dandois dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/02/2007, 17h10
  5. Récupérer tous les mots d'une chaine de caractère
    Par steps5ive dans le forum Access
    Réponses: 2
    Dernier message: 05/09/2006, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo