[VBA] Expressions régulières et LIKE

Résolu
Yoskopolite Messages postés 92 Statut Membre -  
Yoskopolite Messages postés 92 Statut Membre -
Bonjour à tous,

Je cherche à vérifier par le code (en VBA Excel sur Excel 2003) si un champ contient bien certaines formes précises. En gros, voici les règles à respecter :
* 2 caractères alphabétiques (a->z ou A->Z) suivis d'un tiret, suivis de 3 chiffres, suivis d'un tiret, suivis de 2 caractères alphabétiques
* OU : entre 1 et 20 caractères alphanumériques (a->z OU A->Z ou 0->9)

Voici en gros le code que j'ai fait :

If Not Range("A1").Value Like "[A-Z][A-Z][-][1-9][2-9][3-9][-][A-Z][A-Z]" And _
     Not Range("A1").Value Like "[a-zA-Z0-9]{1,20}" Then


La première partie semble fonctionner, mais en ce qui concerne le {1,20}, ça bloque. Les accolades ne semble pas passer pour les intervalles de reconnaissance... Sauriez-vous me dire pourquoi ?

Merci d'avance pour vos réponses
Configuration: Laptop sous XP (AMDTurion64 1,6GHz, 512MoRAM)
UC sous XP Pro 64 (Core2Duo, 4GoRam, 9600GT)
Navigateur : Firefox 3 (en général), Firefox 2 et IE6 (au boulot)

5 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    mais en ce qui concerne le {1,20}, ça bloque.


    Tu peux écrire toi même la fonction
    Par exemple

    Function regexA_Za_z0_9(s As String) As Boolean
    Dim len_s As Byte, i As Byte
    Dim test As Boolean
    
    test = False
    len_s = Len(s)
    
    ' si chaîne vide la fonction renvoie FAUX
    ' si nombre caractères plus grands que 20 la fonction renvoie FAUX
    ' si caractère non inclus la fonction renvoie FAUX
    ' si entre 1 et 20 caractères inclus la fonction renvoie VRAI
    If len_s >= 1 And len_s <= 20 Then test = True
    If test = True Then
        For i = 1 To len_s
            If Mid(s, i, 1) Like "[a-zA-Z0-9]" Then
                test = True
            Else
                test = False
                Exit For
            End If
        Next
    End If
    
    If test = True Then
      regexA_Za_z0_9 = True
    Else
        regexA_Za_z0_9 = False
    End If
    
    End Function
    1
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour
    Pour la première option
    ....Like "[a-zA-Z][a-zA-Z][-]###[-][a-zA-Z][a-zA-Z]" 


    par exemple: signale une mauvaise syntaxe et l'efface
    Private Sub Worksheet_Change(ByVal Target As Range)
    'A partir démo Michel_xld
        If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
           If Target.Value Like "[a-zA-Z][a-zA-Z][-]###[-][a-zA-Z][a-zA-Z]" Then Exit Sub
            On Error GoTo Fin
            Application.EnableEvents = False
            MsgBox "Format non conforme."
            Application.Undo
        End If
    Fin:
        Application.EnableEvents = True
    End Sub


    pour la 2° je regarde avec Like mais je crois qu'on ne va pas couper à une fonction VBA avec l'objet
    vbscript.regexp

    à+ si je trouve qq chose
    0
  3. Yoskopolite Messages postés 92 Statut Membre 8
     
    Merci bien à vous deux.
    L'idée de faire moi même la fonction ne m'est venue qu'après. Merci de l'avoir implémenté pour moi : je crois que c'est ce que je vais utiliser :-)

    Après tests : ça marche bien, mais je me suis permis de modifier un petit peu ta fonction pour l'optimiser et corriger un oubli de End If, aussi :

    Function regexA_Za_z0_9(s As String) As Boolean
    Dim len_s As Byte, i As Byte
    Dim test As Boolean
    
    test = False
    len_s = Len(s)
    
    ' si chaîne vide la fonction renvoie FAUX
    ' si nombre caractères plus grands que 20 la fonction renvoie FAUX
    ' si caractère non inclus la fonction renvoie FAUX
    ' si entre 1 et 20 caractères inclus la fonction renvoie VRAI
    If len_s >= 1 And len_s <= 20 Then
        test = True
        For i = 1 To len_s
            If Not Mid(Range("A1").Value, i, 1) Like "[a-zA-Z0-9]" Then
                test = False
                Exit For
            End If
        Next
    End If
    
    If test = True Then
      regexA_Za_z0_9 = True
    Else
        regexA_Za_z0_9 = False
    End If
    
    End Function
    
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    et corriger un oubli de End If, aussi
    Si tu parles de ça
    If len_s >= 1 And len_s <= 20 Then test = True

    Alors ce n'est pas un oubli ;-)

    Voici la syntaxe de if..then..else

    Syntaxe
    
    If condition Then [statements] [Else elsestatements]
    
    Vous pouvez également utiliser la syntaxe suivante :
    
    If condition Then
    [statements]
    
    [ElseIf condition-n Then
    [elseifstatements] ...
    
    [Else
    [elsestatements]]
    
    End If


    On peut écrire par exemple
    If condition Then MsgBox "ok" Else MsgBox "pas ok"

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Yoskopolite Messages postés 92 Statut Membre 8
     
    Ah autant pour moi, j'avais oublié ce détail et mal interprété ton code :D
    Merci encore ^^
    0