[VBA] Expressions régulières et LIKE

Résolu/Fermé
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 - 19 oct. 2009 à 17:09
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 - 20 oct. 2009 à 08:51
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

5 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
19 oct. 2009 à 18:06
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
19 oct. 2009 à 17:36
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
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
20 oct. 2009 à 08:38
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 oct. 2009 à 08:50
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

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

Posez votre question
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
20 oct. 2009 à 08:51
Ah autant pour moi, j'avais oublié ce détail et mal interprété ton code :D
Merci encore ^^
0