Rechercher : dans
Par :

[VBA] Expressions régulières et LIKE

Dernière réponse le 20 oct 2009 à 08:51:45 Yoskopolite, le 19 oct 2009 à 17:09:31 
 Signaler ce message aux modérateurs

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)

Meilleures réponses pour « [VBA] Expressions régulières et LIKE » dans :
PHP - Expressions régulières Voir Qu'est-ce qu'une expression régulière? Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au...
[RegExp] Récupérer une adresse IP VoirFinalité Mise en œuvre Explications Interprétation du motif Récupérer une adresse IP Finalité Pour récupérer une IP dans un fichier texte, fichiers journaux, pages web, etc. Mise en œuvre L'expression régulière suivante combinée à la...
Sed - Trucs et astuces VoirSubstitution Affichage Suppression Espace et tabulation Ligne vide Intervalle régulier Divers Joindre des lignes Affichage insensible à la casse Substitution Substituer "foo" par "bar" à chaque ligne Seulement la 1ère...
Javascript - L'objet RegExp VoirLes particularités de l'objet RegExp L'objet RegExp est un objet permettant de manipuler des expressions régulières, c'est-à-dire des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, afin de trouver des...
VBScript - Les opérateurs VoirQu'est-ce qu'un opérateur? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, ... On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs de...

1

michel_m, le 19 oct 2009 à 17:36:22

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 Cordialement, Michel

Répondre à michel_m

2

lami20j, le 19 oct 2009 à 18:06:17
  • +1

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
106485010510997108

Répondre à lami20j

3

Yoskopolite, le 20 oct 2009 à 08:38: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

Répondre à Yoskopolite

4

lami20j, le 20 oct 2009 à 08:50:30

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"

106485010510997108

Répondre à lami20j

5

 Yoskopolite, le 20 oct 2009 à 08:51:45

Ah autant pour moi, j'avais oublié ce détail et mal interprété ton code :D
Merci encore ^^

Répondre à Yoskopolite