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 :

Rechercher une séquence de texte dans un tableau Excel


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : décembre 2013
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Rechercher une séquence de texte dans un tableau Excel
    Bonjour,

    Dans une tableau Excel, je dois rechercher une séquence de texte de type xx-xxxx dans une cellule, où x est un entier de 0 à 9.
    Cette séquence peut être mélangée à du texte, on peut donc avoir dans la cellule Excel :
    - seulement la séquence de type xx-xxxx
    - cette séquence précédée et/ou suivie par du texte : blabla xx-xxxx blabla

    J'arrive à trouver la séquence en balayant chaque ligne à l'aide du macro vba et en utilisant une expression régulière (0-9){2}-(0-9){4}.

    Mais je voudrai exclure les cas où la séquence est précédée par "I" ou "I-".
    Je ne sais pas comment intégrer cette restriction dans mon expression régulière.

    Je me suis dis qu'une macro et les expressions régulières pouvaient résoudre ce besoin, mais si vous voyez d'autres méthodes, je suis également preneur.

    Merci d'avance si vous pouvez m'aider à résoudre cette difficulté.

    Bien cordialement,
    Emmanuel

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA, C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    14 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Developpeur VBA, C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 14 268
    Points : 33 415
    Points
    33 415
    Par défaut
    Salut,

    de combien de lignes x colonnes serait-il question dans ton tableau ?

    Un expression régulière soit, mais si ton tableau fait 100 lignes ou 100 000 lignes, ca sera un sacré paquet de recherche.

    Peux tu nous en dire plus ?
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 265
    Points : 52 877
    Points
    52 877
    Billets dans le blog
    121
    Par défaut
    Salut.

    Le pattern à utiliser est le suivant: "^((?!I|I-).)*\d{2}-\d{4}.*$"

    Par exemple, dans une fonction perso qui validerait une regexp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function MatchRegExp(Value As String, Pattern As String)
      Dim RegExp As Object
     
      Set RegExp = CreateObject("VBScript.RegExp")
      RegExp.Pattern = Pattern
      RegExp.Global = True
      MatchRegExp = RegExp.Test(Value)
      Set RegExp = Nothing
    End Function
    Nom : 2021-09-27_113931.png
Affichages : 68
Taille : 13,9 Ko

    Il faudrait voir si I ou I- peuvent se trouver avant la séquence de chiffres mais non collés. Avec mon pattern, "I- bonjour 12-1234 au revoir" va renvoyer FAUX...

    Peut-être faudrait-il que tu précises les possibilités?
    "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...
    ---------------

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : décembre 2013
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Un grand merci pour cette réponse.

    Dans les données que j'ai à traiter, je n'ai jamais rencontré de cas où il y avait un espace entre I / I- et la séquence à détecter, mais si la réponse peut aussi couvrir ce cas, je serai certain de couvrir tous les cas de figure.
    Petite précision sur mon besoin : dans le retour de la fonction, je voudrai extraire la séquence détectée :

    Nom : Capture.JPG
Affichages : 61
Taille : 34,7 Ko

    Pour supprimer le texte après la séquence, j'ai trouvé comment modifier le Pattern = "^((?!I|I-).)*\d{2}-\d{4}". En tout cas, ça a l'air de fonctionner.
    Mais je ne sais pas comment supprimer le texte précédant la séquence.

    Merci d'avance pour votre aide.

    Emmanuel

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 265
    Points : 52 877
    Points
    52 877
    Billets dans le blog
    121
    Par défaut
    Dans ce cas, tu peux créer des groupes dans ton pattern, puis extraire le énième groupe. Les groupes sont séquencés par des parenthèses et commencent à 1. Le groupe d'exclusion n'est pas pris en compte, puisqu'il est vide, par définition. L'objet RegExp permet le remplacement de chaines de caractères, et les groupes sont repris dans la chaine de remplacement par $ suivi du rang du groupe. Dans ton cas, il suffit donc de renvoyer le groupe du rang souhaité.

    Voici la fonction que tu peux utiliser pour cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function ExtraireTexte(Value As String, Pattern As String, Index As Long) As String
      Dim RegExp As Object
     
      Set RegExp = CreateObject("VBScript.RegExp")
      RegExp.Pattern = Pattern
      If RegExp.test(Value) Then ExtraireTexte = RegExp.Replace(Value, "$" & Index)
    End Function

    Pour ton cas, tu utiliseras le pattern suivant: "^((?!I|I-).)*(\d{2}-\d{4})(.*)" => le groupe (\d{2}-\d{4}) est donc le deuxième. Il est important ici de regrouper ce qui suit le code dans un groupe pour pouvoir l'exclure du remplacement. Tu peux utiliser la fonction dans une feuille de calcul:

    Nom : 2021-09-28_054951.png
Affichages : 53
Taille : 9,6 Ko


    Le tuto de Caféine sur le sujet: https://cafeine.developpez.com/access/tutoriel/regexp/
    "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
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 265
    Points : 52 877
    Points
    52 877
    Billets dans le blog
    121
    Par défaut
    En fait, tes exemples ont confirmé mes craintes. Avec le pattern que je t'ai donné, une cellule qui contiendrait un I ou I- n'importe où AVANT le code à extraire serait rejeté. Dans l'illustration suivante, Incident F12-7858 sera rejeté alors qu'il devrait normalement être repris. C'est ce que je voulais exprimer, probablement de façon maladroite, dans le message #3.

    Nom : 2021-09-28_085804.png
Affichages : 46
Taille : 17,7 Ko

    Je pense que la bibliothèque utilisée ne permet pas la recherche arrière. Du coup, il va falloir ruser et passer par une fonction spécifique pour extraire le code, et non plus une fonction générique comme celle que j'avais proposée.

    Le but est de créer des groupes de captures que l'on peut isoler avec Execute. Un groupe est englobé dans des parenthèses et est repris dans la collection Matches liée à la RegExp. L'idée est donc de tester si, juste avant le code, on a I ou I- et d'isoler cela dans un groupe. On isole le code dans un second groupe. Le pattern particulier devient alors : (I|I-)?(\d{2}-\d{4}) et on peut extraire le groupe capturé (\d{2}-\d{4}). il reste à tester si le premier groupe capturé est vide. Si oui, on récupère le code, sinon c'est qu'il contient I ou I- et on ne récupère rien...

    Code vba : 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
    Function ExtraireCode(Value As String) As String
      Dim Matches As Object
      Dim Pattern As String
      Dim RegExp As Object
     
      Pattern = "(I|I-)?(\d{2}-\d{4})"
      Set RegExp = CreateObject("VBScript.RegExp")
      With RegExp
        .Pattern = Pattern
        Set Matches = RegExp.Execute(Value)
        If RegExp.test(Value) Then
          If Matches.Item(0).submatches(0) = "" Then ExtraireCode = Matches.Item(0).submatches(1)
        End If
      End With
      Set RegExp = Nothing
      Set Matches = Nothing
    End Function

    Nom : 2021-09-28_093904.png
Affichages : 44
Taille : 13,9 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...
    ---------------

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : décembre 2013
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Pierre,

    Effectivement, on peut avoir des "I" dans le texte précédent la séquence, qui seraient venus perturber l'analyse.
    Je viens de tester la dernière proposition, j'ai l'impression qu'elle répond parfaitement à mon besoin.

    Merci beaucoup, ça va singulièrement faciliter mon analyse.

    Je marque le sujet comme résolu.

    Bonne soirée,
    Emmanuel

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 265
    Points : 52 877
    Points
    52 877
    Billets dans le blog
    121
    Par défaut
    Super...

    Les RegEx, c'est toujours un peu délicat, surtout avec la bibliothèque utilisée en VBA, car elle ne permet pas toutes les finesses des bibliothèques C#, Java ou php...

    Bon boulot pour la suite et bonne soirée
    "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...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. rechercher une série d'élément dans un tableau
    Par tunizar dans le forum WinDev
    Réponses: 9
    Dernier message: 30/12/2013, 12h51
  2. Réponses: 2
    Dernier message: 16/03/2012, 12h16
  3. Réponses: 3
    Dernier message: 10/01/2012, 10h04
  4. [WD-2007] Impression d'une zone de texte dans un tableau au format livret
    Par poulinos dans le forum Word
    Réponses: 3
    Dernier message: 15/11/2010, 12h30
  5. mettre le contenu d'une zone de texte dans un tableau
    Par lepieux dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 03/05/2010, 18h19

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