[VBA Ragexp] Récupérer le contenu avant et après un Pattern

Résolu
Bonjour,

J'ai une cellule dans lequel est contenu :

> Commentaire 1
> Commentaire 2
> Commentaire 3

Je souhaite faire un ragexp pour récupérer chacune des lignes dans une variable incrémentable. Le problème, c'est que je ne sais récupérer que le caractère rencontré qui les sépare, en l'occurence le retour à la ligne. Comment dois-je m'y prendre pour récupérer chaque commentaire séparement ?

Voici mon bout de code :

Dim myRegExp As RegExp
Dim myMatches As MatchCollection
Dim myMatch As Match

Set myRegExp = New RegExp

myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "\n"

Set myMatches = myRegExp.Execute(Cells(3, 4))

If myMatches = 0
Commentaire = Cells(3, 4))
Else
For Each myMatch In myMatches

' Commentaire n = contenu avant le 1er retour à la ligne
' Commentaire n+1 = contenu après chaque retour à la ligne

Next

Mille mercis !

3 réponses

  1. Contributeur
    Merci pour ta réponse !

    J'ai remplacé Response.write par une msgbox parce qu'elle provoquait une erreur.
    Le split ne détecte pas le \n, i renvoie donc 0 et la cellule entière est affichée.
    Ai-je omis un détail ?
    1
    1. Modérateur
      Bonjour lml-mike,

      Regarde ce tutoriel de Caféine.

      Et plus particulièrement le chapitre sur les méthodes.

      Reviens en cas de besoin, mais tu connais la maison...
      0
    2. Contributeur
      J'ai plus touché au dév VBA depuis 3 ans, Je suis effectivement sur le tuto et je prends conscience qu'en fait c'est le choix du pattern qui est mauvais...

      Cependant je n'ai pas encore la logique sur le choix des symboles...
      Je vais potasser dessus, merci !
      0
    3. Contributeur
      Le pattern (.*) sépare les commentaires, mais il prend en compte les retour à la ligne à chaque mymatch ce qui n'est pas bon.
      Je cherche un moyen d'exclure les retour à la ligne via le tuto.
      0
    4. Contributeur
      Le pattern (.*)\n supprime les occurences de retour à la ligne, mais ne prennent pas en compte le dernier commentaire (normal, vu qu'il n'y a pas de retour à la ligne après le dernier commentaire...

      Je sens que je vais finir avec une camisole xD
      0
    5. Modérateur
      normal, vu qu'il n'y a pas de retour à la ligne après le dernier commentaire

      Ben oui...

      Alors pourquoi ne pas utiliser Split...
      Comme ceci :
      Sub SplitLml_Mike()
      Dim monTab() As String

      monTab = Split(Cells(1, 1).Value, Chr(10)) 'Chr(10) = renvoi à la ligne
      For i = LBound(monTab) To UBound(monTab)
      Debug.Print monTab(i)
      Next i
      End Sub
      0
  2. Je n'utiliserais pas d'expression régulière pour ce genre de travail, le SPLIT semble mieux indiqué. La fonction SPLIT permet de séparer une chaîne de caractères selon un délimiteur. Chaque expression séparée par un séparateur sera placée dans un tableau.

    Voici un exemple d'utilisation:

    Dim arrCommentaires
    Dim strValeur

    strValeur = "> Commentaire 1\n> Commentaire 2\n> Commentaire 3"

    arrCommentaires = Split(strValeur, "\n")

    Dim i
    For i = 0 to Ubound(arrCommentaires)
    Response.Write i & " = " & arrCommentaires(i) & "<BR>"
    Next

    Bonne chance!
    0
    1. Contributeur
      Je me suis permis de garder Ragexp pour en profiter en supprimant les "> " dans les commentaires afin de mieux présenter les commentaires.

      Le contenu de la cellule peut être :

      Commentaire 1

      ou

      > Commentaire 2
      > Commentaire 3
      > Commentaire 4
      > Commentaire n (le nombre est variable)

      Mon code est le suivant :

      Private Sub CommandButton1_Click()

      Dim myRegExp As RegExp
      Dim myMatches As MatchCollection
      Dim myMatch As Match

      Set myRegExp = New RegExp

      myRegExp.IgnoreCase = True
      myRegExp.Global = True
      myRegExp.Pattern = "(> )|(.*)"

      Set myMatches = myRegExp.Execute(Cells(3, 4))

      For Each myMatch In myMatches

      If myMatch <> "> " And myMatch <> "" Then
      MsgBox myMatch
      End If

      Next

      End Sub

      Maintenant, il me manque à foutre toutes les occurences myMatch dans une variable incrémentale...

      J'aimerais le faire via un tableau, mais même étant dynamique, je ne peut pas déclarer la taille du tableau à l'avance. Je ne peux même pas utiliser mymatches.count, vu qu'il est 3x supérieur au nombre de commentaires...

      Une idée sur comment je peux assigner chaque mymatch à commentaire_n, n étant incrémental ?
      0
      1. Modérateur
        Oui, une idée : revoir le cours sur les variables tableaux ;-)

        Il te faut redimensionner ta variable tableau à chaque occurence valide. Pour cela, il convient d'utiliser ReDim et Preserve.
        Comme ceci :
        Dim myRegExp As RegExp
        Dim myMatches As MatchCollection
        Dim myMatch As Match
        Dim monTab() As String
        Dim indTab As Integer

        Set myRegExp = New RegExp

        myRegExp.IgnoreCase = True
        myRegExp.Global = True
        myRegExp.Pattern = "(> )|(.*)"

        Set myMatches = myRegExp.Execute(Cells(3, 4))

        For Each myMatch In myMatches

        If myMatch <> "> " And myMatch <> "" Then
        ReDim Preserve monTab(indTab) 'redimensionnement de la variable tableau
        monTab(indTab) = myMatch 'stockage de sa valeur en mémoire
        indTab = indTab + 1 'incrémentation de l'indice de la variable tableau
        End If

        Next
        'boucle sur la variable tableau
        For indTab = 0 To UBound(monTab)
        Debug.Print monTab(indTab)
        Next

        Un petit rappel sur les variables tableaux, pour quand tu auras un peu de temps...
        0
      2. Contributeur
        J'avais utilisé ce même tableau comme référence pour la création de mon tableau dynamique, mais je n'avais pas eu la logique de penser que je pouvais incrémenter simplement via un ++ au lieu d'un "For"... Comme quoi je suis vraiment rouillé !

        Je vais pouvoir finir mon code grâce à ça ! Merci beaucoup pour l'aide et les références qui sont maintenant bookmarkées ^_^

        Excellente journée !
        0
      3. Modérateur
        De rien.
        Merci et bonne journée à toi également.
        A+
        0