[VBA] Expressions régulières et LIKE

Résolu
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. Modérateur
    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
    1. Contributeur
      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
      1. 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
        1. Modérateur
          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
          1. Ah autant pour moi, j'avais oublié ce détail et mal interprété ton code :D
            Merci encore ^^
            0