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 :

VBA REGEXP Pattern


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut VBA REGEXP Pattern
    Bonjour,

    je bloque sur la fonction RegExP en VBA.
    Je cherche à supprimer une partie d'une chaine provenant d'un emploi du temps.
    J'ai 2 cas de figure qui fonctionnent séparément, mais je n'arrive pas à trouver le bon pattern qui fonctionnerait pour les 2.

    1° cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sChaine = "abc| 08:00 à 10:00 |def"
    2° cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sChaine = "abc| 08:00 à 10:00"
    j'ai défini un pattern comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sPattern = "..\d\d:\d\d à \d\d:\d\d.."
    Cela fonctionne pour le 1° cas, mais pas pour le second.
    Je voudrais supprimer tous ce qui est entre les 2 | (pipe), ou entre le pipe et la fin de chaine.
    Je ne trouve pas le paramètre qui précise qu'un caractère est peut être présent ou non.

    Merci pour votre aide, je ne maitrise pas très bien cette fonction.
    Cordialement,
    Alain

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    hello,
    montre-nous ton code complet et la chaîne que tu veux obtenir.
    A noter qu'il y a un sous-forum dédié aux Macros et code VBA.
    Ami calmant, J.P

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut VBA REGEXP Pattern avec sources
    Bonjour Jurassic Pork,

    merci pour ta célérité.
    Je suis allé faire un tour sur ce forum, mais je n'ai pas trouvé la réponse.

    Voici le code très limité, mais c'est un test avant intégration dans le vrai programme.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Sub testREGEX()
        Dim sChaine1 As String
        Dim sChaine2 As String
        Dim fResult1 As Boolean
        Dim fResult2 As Boolean
        Dim sPattern As String
     
        ' Suppression de la plage d'horaire, | compris
        ' Il ne doit rester que soit abcdef, soit abc
     
     
        sChaine1 = "abc| 08:00 à 10:00 |def"
        sChaine2 = "abc| 08:00 à 10:00"
        sPattern = "..\d\d:\d\d à \d\d:\d\d.."
     
        fResult1 = REGEX_Test(sPattern, sChaine1)
        fResult2 = REGEX_Test(sPattern, sChaine2)
     
        sChaine1 = REGEX_Replace(sPattern, sChaine1, "", False, True)
        sChaine2 = REGEX_Replace(sPattern, sChaine2, "", False, True)
     
     
    End Sub
     
    ' https://cafeine.developpez.com/access/tutoriel/regexp/
    ' https://www.developpez.net/forums/d2130886/logiciels/microsoft-office/excel/vba-regexp-pattern/#post11835975
     
    ' Pour utiliser Regex dans VBA, il faut d’abord définir la référence dans l’éditeur VBE.
    ' Dans l’éditeur VBE, aller dans Outils > Références > Microsoft VBScript Regular Expressions
     
    Function REGEX_Test(sPattern As String, sString As String) As Boolean
        Dim oRegex As Object
        Set oRegex = New RegExp
     
        oRegex.Pattern = sPattern
     
        REGEX_Test = oRegex.Test(sString)
     
    End Function
     
    Function REGEX_Replace(sPattern As String, sOldString As String, sNewString As String, fGlobal As Boolean, fIgnoreCase As Boolean) As String
        Dim oRegex As Object
        Set oRegex = New RegExp
     
        oRegex.Pattern = sPattern
        oRegex.Global = fGlobal
        oRegex.IgnoreCase = fIgnoreCase
     
        REGEX_Replace = oRegex.Replace(sOldString, sNewString)
     
    End Function

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    hello,
    voici une solution qui capture deux groupes au maximum (dans le motif entre parenthèses).
    Mon motif n'est peut-être pas optimal mais il a l'air de fonctionner avec tes chaînes d'essai :
    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
    Sub ExtractData()
    sChaine1 = "abc| 08:00 à 10:00 |def"
    sChaine2 = "abc| 08:00 à 10:00"
    Debug.Print RecupChaine(sChaine1)
    Debug.Print RecupChaine(sChaine2)
    End Sub
     
    Function RecupChaine(maChaine) As String
    Dim res
    Dim objReg As RegExp
    Set objReg = New RegExp
    objReg.Pattern = "(.+?)\|[^\|]+\|*(.*)$"
    Set objMatches = objReg.Execute(maChaine)
    For Each Match In objMatches             'The variable match will contain the full match
        a = Match.Submatches.Count           'total number of groups in the full match
        For i = 0 To a - 1
            'Debug.Print Match.Submatches.Item(i)  'display each group
            res = res & Match.Submatches.Item(i)
        Next
    Next
    RecupChaine = res
    Set objReg = Nothing
    End Function
    Résultat :
    abcdef
    abc

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Tu veux absolument le réaliser par RegExp? VBA est outillé de base pour les cas que tu énonces.

    Dois-tu garder les pipes?

    Sans RegExp, voici une fonction qui réalise ce que tu souhaites:
    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
    Function CleanText(Text As String) As String
      Dim ToClean As String
      Dim P1 As Long, P2 As Long
     
      P1 = InStr(1, Text, "|")
      If P1 <> 0 Then
        P2 = InStr(P1 + 1, Text, "|")
        If P2 = 0 Then
          CleanText = Left(Text, P1 - 1)
        Else
          CleanText = Replace(Text, Mid(Text, P1, P2 - P1 + 1), "")
        End If
      Else
        CleanText = Text
      End If
    End Function
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut
    Bonjour à tous les deux,

    merci pour vous réponses et conseils, mais aucune des solutions n'est satisfaisante.
    Sur les exemples donnés, cela fonctionne, mais les chaines à modifier comportent d'autres informations séparées par d'autres pipes.

    Je vais m'orienter vers la décomposition de mes chaines par un split et les traiter indépendamment.

    Merci encore,
    Alain

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Alain BENOIST Voir le message
    [...]mais aucune des solutions n'est satisfaisante.[...]
    Il est toujours plus fructueux d'expliquer le besoin en détails dès le début. Comme le disait JP, les solutions proposées reprenaient tes exemples avec un \ ou deux \. Les RegExp n'aiment pas l'approximation et, plus que le pattern "technique" en lui-même, c'est souvent l'expression même du besoin qui est "compliquée".

    Tu ne couperas pas à l'expression claire de ton besoin, agrémentée d'exemples pertinents et si possible exhaustifs des cas rencontrés, quelle que soit la solution que tu voudras mettre en place. Ce n'est qu'au départ de l'expression claire et détaillée de ton besoin qu'il sera possible de choisir la meilleure voie de résolution (RegExp, split, ...).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Hello,
    Citation Envoyé par Alain BENOIST Voir le message
    merci pour vous réponses et conseils, mais aucune des solutions n'est satisfaisante.
    Pierre a raison , si tu nous donnes pas tous les cas de figures, l'expression régulière ne fonctionnera pas forcément, elle doit être écrite en fonction des différents cas de figures et parfois ce n'est pas possible. Alors si tu peux nous donner d'autres cas de figures pour voir si cela est faisable en expression régulière.
    Ami calmant J.P

  9. #9
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Par défaut
    Bonjour,

    vous avez entièrement raison.
    Mais il y a trop de cas possibles (2 à 6 données séparées par des pipes).
    Je fais ce programme pour quelqu'un qui le maintiendra par la suite, mais qui débute en VBA.
    L'emploi de regexp est déjà complexe pour moi, alors ce sera pire pour lui.

    C'est pour cette raison que je vais rester simple et à sa portée en utilisant split.

    A titre d'exemple, voici ce que je dois traiter, et récupérer quelques bribes dans chacun des items :
    Repas | 12:00 à 14:00
    Congés | 14:00 à 23:00
    Indisponible | 08:00 à 10:00 | piscine
    DIVERS | 08:00 à 10:00 | Lieu(x): BI 1014 EAO INTRANET BUR | Intervenant(s): Bousseau | Groupe(s): HORS CF [DFG] | Création | Cours de bureautique au profit de la SRP.
    BUR 802 | 16:00 à 18:00 | Lieu(x): BI 0005 EAO INTRANET | Intervenant(s): Bousseau | Groupe(s): BAT4 D 356 (HL94) [411] | Validé | 1 enseignant guide les élèves.
    Encore merci pour votre aide et pour votre ténacité.
    Alain

  10. #10
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Avec ce code :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub ExtractData()
    sChaine1 = "abc| 08:00 à 10:00 | 08:00 à 10:00 | 08:00 à 10:00 |def"
    sChaine2 = "xyz| 08:00 à 10:00"
    sChaine3 = "Repas | 12:00 à 14:00"
    sChaine4 = "Congés | 14:00 à 23:00"
    sChaine5 = "Indisponible | 08:00 à 10:00 | piscine"
    sChaine6 = "DIVERS | 08:00 à 10:00 | Lieu(x): BI 1014 EAO INTRANET BUR | Intervenant(s): Bousseau | Groupe(s): HORS CF [DFG] | Création | Cours de bureautique au profit de la SRP."
    sChaine7 = "BUR 802 | 16:00 à 18:00 | Lieu(x): BI 0005 EAO INTRANET | Intervenant(s): Bousseau | Groupe(s): BAT4 D 356 (HL94) [411] | Validé | 1 enseignant guide les élèves."
    Debug.Print RecupChaine(sChaine1)
    Debug.Print RecupChaine(sChaine2)
    Debug.Print RecupChaine(sChaine3)
    Debug.Print RecupChaine(sChaine4)
    Debug.Print RecupChaine(sChaine5)
    Debug.Print RecupChaine(sChaine6)
    Debug.Print RecupChaine(sChaine7)
    End Sub
     
    Function RecupChaine(maChaine) As String
    Dim res
    Dim objReg As RegExp
    Set objReg = New RegExp
    objReg.Pattern = "(.+?)\s*\|.*\|\s*(.+)$"
    If objReg.Test(maChaine) Then
    Set objMatches = objReg.Execute(maChaine)
    For Each Match In objMatches             'The variable match will contain the full match
        a = Match.Submatches.Count           'total number of groups in the full match
        For i = 0 To a - 1
            'Debug.Print Match.Submatches.Item(i)  'display each group
            res = res & Match.Submatches.Item(i) & " : "
        Next
    Next
    Else
    objReg.Pattern = "(.+?)\s*\|.*$"
    Set objMatches = objReg.Execute(maChaine)
    For Each Match In objMatches             'The variable match will contain the full match
        a = Match.Submatches.Count           'total number of groups in the full match
        For i = 0 To a - 1
            'Debug.Print Match.Submatches.Item(i)  'display each group
            res = res & Match.Submatches.Item(i) & " : "
        Next
    Next
    End If
    RecupChaine = res
    Set objReg = Nothing
    End Function
    Voici ce que j'obtiens :
    abc : def :
    xyz :
    Repas :
    Congés :
    Indisponible : piscine :
    DIVERS : Cours de bureautique au profit de la SRP. :
    BUR 802 : 1 enseignant guide les élèves. :
    C'est vrai qu'avec un split sur | c'est plus simple : si il n'y a que 2 éléments prendre le premier. Si il y a plus de 2 éléments prendre le premier et le dernier.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    perso, je m'orienterais vers Power Query

    Nom : 2022-04-23_194801.png
Affichages : 601
Taille : 138,8 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. VBA Regexp et couleur
    Par cadjer dans le forum Excel
    Réponses: 3
    Dernier message: 26/09/2016, 11h59
  2. Regexp Pattern et Matcher
    Par Space23 dans le forum Général Java
    Réponses: 3
    Dernier message: 23/09/2011, 00h08
  3. [RegExp] pattern matching adapté
    Par thierry_b dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 06/07/2009, 18h13
  4. [Java][Regexp] Pattern spécial.
    Par Maya_vega dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 05/04/2007, 20h09
  5. [Regexp] pattern pour trouver des fichiers par exclusion d'extension
    Par mnementh64 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 07/09/2006, 10h34

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