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 :

expressions rationnelles récupération de dates sous 3 formats [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut expressions rationnelles récupération de dates sous 3 formats
    bonjours a tous

    alors aujourd'hui j'ai un tout petit soucis
    je récupère des dates dans un texte il y en a 3

    date1:sous se format :27 juillet 2015
    date2:sous se format :28/07/2015
    date3:sous se format :29-07-2015

    ma petite fonction utilisant le regex

    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
    Function chainevalide(txt As String, matrice) As Variant
        Dim Matches
        With CreateObject("VBScript.RegExp")
            .Global = True
            .Pattern = matrice
            .IgnoreCase = True
            Set Matches = .Execute(txt)
            ReDim tablo(Matches.Count): i = 0
            For Each Match In Matches
                tablo(i) = Match.Value
                i = i + 1
            Next
        End With
        chainevalide = tablo
    End Function
    et voila la sub qui injecte le pattern dans la fonction

    la fonction est sensée me retourner 3 dates elle le fait mais avec une erreur dans la 2 eme
    voila ce la fonction me reourne
    27 Juillet 2015
    17 28/07/2015 ici!! ce qui est en rouge est une erreur!!!!!!!!!!!
    29-07-2015

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test2()
     Dim texte As String
        texte = "blablabla blabla bla bla Lundi 27 Juillet 2015: 147 - 536 - 945 - 611 - 317 28/07/2015 blabla bla bla blablablabla blabla bla Mercredi le 29-07-2015, blablabla blabla"
    newdate = chainevalide(texte, "  [(\d{2})] + [//-/-/( )] + [a-z/0-9] +[( )-//]+(\d{4}) ")
     
     MsgBox newdate(0) & vbCrLf & newdate(1) & vbCrLf & newdate(2)
    End Sub
    definition des operateurs
    2numero + un espaces ou un tiret ou un slash +un ou plusieur numero ou lettre + pareil que le vert + les 4 derniers chiffres pour l'année


    alors effectivement les 2 premiers operateurs pourais me retourner cela mais le 5 eme devrait eliminer cette possibilité non?
    puisque en dernier 4 nulmero sont attendus??

    merci pour le coup de main
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    puré j'ai trouvé
    c'etait [a-z-0-9] a la place de [a-z/0-9]

    du coup ca remet en question ma comprehention de l'indicateur "ou"

    je le met pas en résolu tout de suite au cas ou une ame générereuse voudrait bien m'apporter la lumiere sur ce point
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    Bonjour,
    J'ai testé avec la correction mais je ne retourne que 2 dates
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    newdate = chainevalide(texte, "(\d{2})(-|/|( ))((\d{2})|\w{3,12})(-|/|( ))(\d{4})")
    je retourne bien les 3 dates

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    bonjour Helas et merci de t'intérésser a mon soucis
    je vois des operateur dans ta version que je n'utilise pas par manque de connaissance
    en effet les expressions régulieres je m'y suis mis il y a 3 jours

    ma version de la sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test2()
        Dim texte As String
        texte = "blablablabla bla blabla bla bla blabla 2 AOUT 2015: 5 - 12 - 15 - 3 - 7 03/08/2015 blablabla bla bla blabla blabla bla Lundi le 03-08-2015, blablablablab blabla blmab balbla"
         mesdates = chainevalide(texte, "[(\d{2})]+[//-/-( )]+[a-z-0-9]+[( )-/]+(\d{4})")
        MsgBox mesdates(0) & vbCrLf & mesdates(1) & vbCrLf & mesdates(2)
     
    End Sub
    la fonction
    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
    Function chainevalide(txt As String, matrice) As Variant
        Dim Matches, ReG
        Set ReG = CreateObject("VBScript.RegExp")
        With ReG
            .Global = True: .Pattern = matrice: .IgnoreCase = True
            Set Matches = .Execute(Replace(txt, " - ", "-"))
            ReDim tablo(Matches.Count): i = 0
            For Each Match In Matches
                tablo(i) = Trim(Match.Value)
                i = i + 1
            Next
        End With
        chainevalide = tablo
        Set ReG = Nothing
    End Function
    le résultat
    Nom : Capture.JPG
Affichages : 366
Taille : 25,6 Ko

    j'aimerait bien des explication sur le symbol "|" dans ton code c'est peut etre l'operateur "ou" que je cherche désespérément
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    je vois des operateur dans ta version que je n'utilise pas par manque de connaissance
    Bonjour,

    Peut être que cela aidera
    VB/VBA regular expression

    1. Definition


    Regular expressions (RE) are used for pattern matching purpose in programming.
    Most important cases that RE are used include string searching and replacement.

    The RE facility exists in many programming languages, including VB, VBA,
    VBScript, Javascript, Delphi, C#, VB.NET, Java, Perl, PHP etc.

    2. Quick view on basic principles


    - : means a range.
    E.g., a-z means all the letters a to z.
    [] : means exactly one of the letters quoted.
    E.g., [abc] means exactly one of a, b or c.
    [A-Z] means exactly one of A, B, ..., Z
    () : just for grouping purpose.
    | : means "or".
    E.g. a|b means a or b.
    + : means one or more of the pattern before it.
    E.g., a+ means one or more consequtive a. (ab)+ means ab, abab, ababab, ..
    * : means zero or more.
    E.g., [a-z]* means empty string, or any string consisting of a, .., z.
    ? : means zero or one.
    E.g., [a-z]? means empty string, or any one of a, b, .., z.

    3. Principles by classification


    3.1 Single-character patterns


    . : a single dot. Matches any character except newline (\n).
    E.g., "x." matches a string of length 2, first letter is 'x',
    second is any letter except '\n'.
    [] : character class, a list of characters enclosed by '[' and ']'.
    Exactly one of these characters is used.
    E.g., [abcdef], [a-z], [A-Z], [0123456789], [0-9],
    [a-zA-Z], [a-zA-Z0-9_].
    ^ : used at the beginning of a character class, means the
    negated character class.
    E.g., [^0-9], [^abcdABCD], [^a-z], [^\^].

    Some predefined character class abbreviations:

    abr: same as | meaning
    ------------------------------
    \d : [0-9] : a digit
    \D : [^0-9] : non-digits
    \w : [a-zA-Z0-9_] : word char
    \W : [^a-zA-Z0-9_] : non-word char
    \s : [ \r\t\n\f] : space char
    \S : [^ \r\t\n\f] : non-space char
    \n : [\n] : new line

    3.2 Grouping patterns


    - Sequence: a continuous series of patterns.
    E.g., abc, 123456

    - Multiplier, repeated copies of the immediately previous pattern
    1) {min, max} : general multiplier: min to max copies
    {n} : exactly n copies.
    2) * : zero or more. same as {0,}.
    3) + : one or more. same as {1,}.
    4) ? : zero or one. same as {0,1}.
    E.g., [a]*, a+, a?, [a]{0,}, a{1,}, a{0,1}.

    - Memory: remember the pattern quoted by '(' and ')', the remembered
    patterns are refered to as \1, \2, \3, ... in the pattern string,
    and also can be refered to by $1, $2, $3, ... later.
    E.g., fred(.)barney\1, this matches "fredxbarneyx".
    and now the value of $1 is "x".

    - Alternation: match exactly one of the alternatives.
    1) |
    E.g., red|green|blue

    3.3 Anchoring patterns


    1) ^ : marks the beginning of a pattern.
    E.g., ^a, the 'a' must appear at the beginning of the matched string.
    2) $ : marks the end of a pattern.
    E.g., a$, the 'a' must appear at the end of the matched string.
    3) \b : marks a word boundary (a spot between 2 characters that has a
    \w on one side of it, and a \W on the other side).
    4) \B : marks a non-boundary of word.
    3) more ...

    3.4 Other issues


    - Escape sequence:
    To escape special charaters, e.g., those used above.
    E.g., \., \[, \], \(, \), \\, \*, \+, \?, \^, \$.

    - Case sensitivity: Specify whether case (upper case or lower case) matters.

    - Global v.s. Local: Mostly used for replacing: replace the first match (local)
    or all the matches (global)?

    - Precedence: which combination of the patterns match first?
    e.g., a|b* - is this (a|b)* or a|(b*) ?
    The precedence table of most common regex grouping patterns is:

    -----------------------------------------------------
    Name | Representation
    -----------------------------------------------------
    1) Parentheses | ( )
    2) Multipliers | ? + * {m,n} {m, n}?
    3) Sequence and anchoring | abc ^ $
    4) Alternation | |
    -----------------------------------------------------

    4. Limitations of regular expression


    - Some patterns cannot be matched by regular expressions.
    One example involves counting the number of occurences of a pattern.
    E.g. It can't match a pattern anbn, where a and b are
    both repeated n times. This is because regular expression can't
    keep track of the number of occurences.

    Similarly, anbncn ... also cannot be matched.

    - When there are lots of data to process, improper use of the regular
    expression pattern may lead to low efficiency of the program.

    5. Example use in VBA


    See Demo files COF.RegExp.xls and RegExp_Sept_1_2004.xls.

    The latter also comes with a documentation: RegExp_Sept_1_2004.doc.

    References:


    Mastering Regular Expressions. By Jeffrey E. F. Friedl. 1st Ed. 1997. ISBN 10: 1-56592-257-3
    http://en.wikipedia.org/wiki/Regular_expression
    Excel VBA Regular Expression example
    Perl regular expression
    www.google.com


    XC. Created on: 7/1/2008, Last modified: 7/14/2008

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Tu peux aussi aller voir là

    https://msdn.microsoft.com/en-us/library/ms974570.aspx

    Et aussi Expresso, un outil pour tester des expressions rationnelles

    http://www.ultrapico.com/Expresso.htm

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    PMO merci por didactiel
    clementmarcotte merci pour le lien je suis alles voir la tasse de café
    je vais analyser ça a tete reposée

    j'aurais préféré du francais mais bon
    je vais googletranslaté a gogo encore une fois
    merci a tout les deux en tout cas
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut re
    Bonjour
    C'est bien un ou
    (-|/|( )) = tiret ou / ou espace

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour helas

    ouic'est bien ca un tiret ou un slash ou un espace
    c'est assez etonnant chez moi ca fonctionne comme ca

    [//-/-( )]
    mais je vais essayer ton ecriture
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re

    bon alors




    bon avec ton ecriture j'ai la 2 date en premier a la place de la premiere
    'ta version
    texte = "bablablabla bla blablabla blabla bla Dimanche 2 AOUT 2015: 455 - 623 - 236 - 845 - 427 03/08/2015 blablablablabla bla bla bla blabla Lundi le 03-08-2015, blablabla blabla bla bla blablabla

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mesdates= chainevalide(texte, "[(\d{2})]+(-|/|( ))+[a-z-A-Z-0-9-/]+ (-|/|( ))+(\d{4})")(0)
    je n'ai plus la date qui a le mois en lettre

    avec un mix des deux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mesdates= chainevalide(texte, "[(\d{2})]+(-|/|( ))+[a-z-A-Z-0-9-/]+[( )-/]  +(\d{4})")(0)
    je n'ai plus la date avec le mois en lettre mais je me retrouve avec la date2 en double mais avec un des chiffre qui precede la date 2 en plus

    'ma version
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mesdates= chainevalide(texte, "[(\d{2})]+[//-/-( )]+[a-z-A-Z-0-9-/]+[( )-/] +(\d{4})")(0)
    celle la fonctionne nickel

    msgbox mesdates(0) & vbcrlf & mesdates(1) & vbcrlf & mesdates(2)

    dans tout les cas je doit me retrouver avec ca
    2 AOUT 2015
    03/08/2015
    03-08-2015
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bon apres test
    j'ai reussi a adapter ton ecriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mesdates = chainevalide(texte, "[0-9]+(-|/|( ))+[a-z-A-Z-0-9]+(-|/|( ))+(\d{4})")
        MsgBox mesdates(2)
    la date 0,1,2 sont impec!!
    voila maintenant je sais comment argumenter avec "OU"
    merci nikel Helas
    des fois la demo vaut mieux d'un tuto
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. récupérer la date sous le format 'JJ/MM/AA-HH-Mn'
    Par med_alpa dans le forum JDBC
    Réponses: 4
    Dernier message: 01/04/2008, 18h51
  2. Expression régulière sur une date
    Par mattyeux dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/09/2007, 17h08
  3. [RegEx] Expression régulière sur une date
    Par mattyeux dans le forum Langage
    Réponses: 1
    Dernier message: 21/09/2007, 11h16
  4. Récupération de résultat sous le format décimal
    Par CREZ59 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/07/2006, 12h14
  5. Réponses: 2
    Dernier message: 03/11/2005, 15h03

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