[VBA] Expressions régulières et LIKE
Résolu
Yoskopolite
Messages postés
92
Statut
Membre
-
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 :
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
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
-
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 -
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'effacePrivate 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 -
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 -
Salut,
et corriger un oubli de End If, aussi
Si tu parles de çaIf 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"
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Ah autant pour moi, j'avais oublié ce détail et mal interprété ton code :D
Merci encore ^^