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

Résolu/Fermé
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - Modifié par lml-mike le 4/11/2013 à 17:30
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 5 nov. 2013 à 13:47
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 !
A voir également:

3 réponses

lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 5/11/2013 à 10:00
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
5 nov. 2013 à 10:10
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
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
5 nov. 2013 à 10:28
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
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 5/11/2013 à 10:46
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
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
5 nov. 2013 à 10:50
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
5 nov. 2013 à 11:02
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
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
4 nov. 2013 à 22:08
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
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 5/11/2013 à 12:09
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
5 nov. 2013 à 12:25
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
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
5 nov. 2013 à 13:41
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
5 nov. 2013 à 13:47
De rien.
Merci et bonne journée à toi également.
A+
0