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

[Résolu/Fermé]
Signaler
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
-
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
-
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

Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
117
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 642
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...
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
117
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 !
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
117
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.
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
117
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
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 642
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
Messages postés
627
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
19 février 2016
391
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!
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
117
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 ?
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 642
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...
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
117
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 !
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 642
De rien.
Merci et bonne journée à toi également.
A+