Extraire le texte entre les parenthèses

Messages postés
2
Date d'inscription
jeudi 1 avril 2010
Statut
Membre
Dernière intervention
5 septembre 2012
- - Dernière réponse :  horakad - 4 janv. 2013 à 15:49
Bonjour,

je veux créer un code vba qui me permer d'extraire le texte entre parenthèse dans un champ donné de ma table.

merci d'avance.

Cordialement
Wissem
Afficher la suite 

11 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bonjour,
Intéresse-toi alors à la fonction Instr. A voir dans ton aidse VBA.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
C'est plus sympa de donner la réponse que de renvoyer à l'aide ...

Function ExtraireTexte(Texte As String) As String

Dim Rep1 As Integer, Rep2 As Integer

    Rep1 = InStr(1, Texte, "(", vbTextCompare)
    If Rep1 > 0 Then
        Rep2 = InStr(1, Texte, ")", vbTextCompare)
        If Rep2 > Rep1 Then
            ExtraireTexte = Mid(Texte, Rep1 + 1, Rep2 - Rep1 - 1)
        End If
    End If

End Function
Commenter la réponse de edintegral
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bonjour, edintegral,
Ce qui serait sympa, ce serait de laisser wis2010 étudier Instr et l'utiliser lui-même un peu plus astucieusement que tu ne l'as fait ici (même si tu arrives à un résultat).
Je t'encourage donc toi également vivement à rebûcher Instr.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
2
Date d'inscription
mardi 15 décembre 2009
Statut
Membre
Dernière intervention
10 septembre 2012
0
Merci
Le savoir n'a d'utilité que d'être dispensé, surtout sans fatuité, monsieur l'astucieux.
J'ai juste voulu aider, sans plus, dixit un imparfait.
Commenter la réponse de FrancisVif
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Tiens !
Qui es-tu donc ? edintegral ou FrancisVif ?
Aider, c'est apprendre à pêcher, pas à donner un poisson, hein ...
J'espère simplement que :
1) wiss2010 apprendra ce qu'est instr et l'utilisera mieux que toi (pas difficile)
2) qu'il saura éviter une option vbTextCompare qui n'a ici, s'agidssant d'un caractère sans casse, aucune utilité
3) qu'il comprendra mieux le premier paramètre de instr
4) qu'il comprendra vite qu'une seule variable de position (utilisée deux fois) lui fera faire des économies (au lieu des deux tiennes).

De surcroît : s'il s'était agi de résoudre un problème sans même comprendre comment, je lui aurais alors "passé un poisson tout cuit" fort différent, sans même Instr.
Instr est à la portée d'un débutant et je ne lui ai donc parlé que de cela.
Ton intervention est loin d'être un vrai "cadeau".









________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Parlons quand-même du plus gênant, dans cette "terrible affaire" ===>>
Je viens de tester la vitesse de l'exécution de ton code d'"aide" ===>> fois plus lent que nécessaire, y compris avec instr.
J'espère vraiment que wiss2010 comprendra l'intérêt qu'il a à réfléchir par lui-même.
Je l'attends et le guideraii, mais au vu de son seul effort propre (pas une copie de ton sac)





________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
4 fois plus lent (le chiffre avait sauté).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bon.
6 jours sont passés et je pense que wiss2010 a trouvé tout seul sa solution.
Le petit test suivant t'est donc destiné, edintegral ou FrancisVif (c'est toi, qui me parait en avoir besoin) :

Option Explicit
Private Type retour
  chaine As String
  duree As Double
End Type
Private Sub CommandButton1_Click()
  Dim toto As String
  toto = "Démonstration des différences de rapidité entre une méthode lourdaute et une méthode plus " & _
  "fine (voila ce qui est entre les parenthèses). La différence saute aux yeux, non ?"
 
  
  MsgBox voila(toto).duree & " secondes pour extraire """ & voila(toto).chaine & """ avec mon code"
  MsgBox ExtraireTexte(toto).duree & " secondes pour extraire """ & ExtraireTexte(toto).chaine & """ avec le tien"
End Sub
Private Function ExtraireTexte(ByVal Texte As String) As retour
  Dim deb As Double, i As Long, Rep1 As Integer, Rep2 As Integer
  deb = Timer
   For i = 1 To 100000
     Rep1 = InStr(1, Texte, "(", vbTextCompare)
     If Rep1 > 0 Then
        Rep2 = InStr(1, Texte, ")", vbTextCompare)
        If Rep2 > Rep1 Then
            ExtraireTexte.chaine = Mid(Texte, Rep1 + 1, Rep2 - Rep1 - 1)
        End If
     End If
   Next
  ExtraireTexte.duree = Timer - deb
End Function


 Private Function voila(ByVal Texte As String) As retour
   Dim deb As Double, i As Long, Rep1 As Integer
   deb = Timer
   For i = 1 To 100000
    Rep1 = InStr(1, Texte, "(")
    If Rep1 Then
        Texte = Mid(Texte, Rep1)
        Rep1 = InStr(2, Texte, ")")
        If Rep1 Then voila.chaine = Mid(Texte, 2, Rep1 - 2)
    End If
  Next
  voila.duree = Timer - deb
End Function


Lance et tu comprendras vite.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
Salut les filles,
Je ne comprends pas bien le pourquoi de la boucle for i = 1 To 100000

Perso en passant comme suit (fonction no_for tout en bas), le timer n'est plus assez précis pour indiquer le temps d’exécution et rend 0 seconde.
Alors que les 2 autres solutions durent respectivement 0.04 secondes et 0.31 secondes...

Quelqu'un peu m'expliquer ce que vous avez cherché à faire avec cette For ?


Option Explicit
Private Type retour
  chaine As String
  duree As Double
End Type
Private Sub CommandButton1_Click()
  Dim toto As String
  toto = "Démonstration des différences de rapidité entre une méthode lourdaute et une méthode plus " & _
  "fine (voila ce qui est entre les parenthèses). La différence saute aux yeux, non ?"
 
  
  MsgBox voila(toto).duree & " secondes pour extraire """ & voila(toto).chaine & """ avec mon code"
  MsgBox ExtraireTexte(toto).duree & " secondes pour extraire """ & ExtraireTexte(toto).chaine & """ avec le tien"

MsgBox no_for(toto).duree & " secondes pour extraire """ & voila(toto).chaine & """ sans utiliser la boucle For"

End Sub

Private Function ExtraireTexte(ByVal Texte As String) As retour
  Dim deb As Double, i As Long, Rep1 As Integer, Rep2 As Integer
  deb = Timer
   For i = 1 To 100000
     Rep1 = InStr(1, Texte, "(", vbTextCompare)
     If Rep1 > 0 Then
        Rep2 = InStr(1, Texte, ")", vbTextCompare)
        If Rep2 > Rep1 Then
            ExtraireTexte.chaine = Mid(Texte, Rep1 + 1, Rep2 - Rep1 - 1)
        End If
     End If
   Next
  ExtraireTexte.duree = Timer - deb
End Function


 Private Function voila(ByVal Texte As String) As retour
   Dim deb As Double, i As Long, Rep1 As Integer
   deb = Timer
   For i = 1 To 100000
    Rep1 = InStr(1, Texte, "(")
    If Rep1 Then
        Texte = Mid(Texte, Rep1)
        Rep1 = InStr(2, Texte, ")")
        If Rep1 Then voila.chaine = Mid(Texte, 2, Rep1 - 2)
    End If
  Next
  voila.duree = Timer - deb
End Function

Function no_for(ByVal Texte As String) As retour
    Dim deb As Double
    deb = Timer
    Dim Rep1 As Integer
    Dim Rep2 As Integer
    Rep1 = InStr(1, Texte, "(") + 1
    If Rep1 > 1 Then
        Rep2 = InStr(Rep1, Texte, ")")
        If Rep2 > 0 Then
            no_for.chaine = Mid(Texte, Rep1, Rep2 - Rep1)
        End If
    End If
    no_for.duree = Timer - deb
End Function


Commenter la réponse de horakad
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bien évidemment ! puisque tu ne fais les choses qu'une fois et que tu n'auras ainsi pas le temps de mesurer réellement la différence de durée !
La boucle de 100000 fois n'est là que pour te permettre de voir la différence de vitesse de traitement entre une méthode et l'autre.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Ah bah oui,
j'suis con
Commenter la réponse de horakad