[vba] équivalent d'un regex

équivalent d'un regex [vba] - VB/VBA/VBS - Programmation

Marsh Posté le 24-05-2007 à 08:48:40    

Nouveau problème de syntaxe plus bas !
 
Bonjour ! :)
 
Je cherche à lire une cellule sous Excel et à vérifier qu'elle contienne une chaîne de 3 chiffres suivis de 6 caractères alphanumériques avec un espace ou non au milieu.  
 
Ex : FGT 125698
      FHG0125871

 
Y a t-il en VBA un outil, un peu comme le regex en php, qui permette celà ? J'ai cherché sur le net, je n'ai rien trouvé de vraiment probant :/
 
Merci d'avance  :hello:


Message édité par Xocs le 25-05-2007 à 13:38:16
Reply

Marsh Posté le 24-05-2007 à 08:48:40   

Reply

Marsh Posté le 24-05-2007 à 09:14:29    

Il est possible d'ajouter à ton projet VBA une référence vers la bibliothèque « Microsoft VBScript Regular Expressions 5.5 »
 
Ça n'est pas aussi puissant qu'en Perl ou PHP mais ça dépanne bien.

Reply

Marsh Posté le 24-05-2007 à 11:34:54    

tu as trouvé ?
tu peux regarder aussi du coté de la fonction mid et trim

Reply

Marsh Posté le 24-05-2007 à 19:50:22    

Oui ! Merci bien tegu :)
 
Avec la fonction mid/trimça serait plus complexe et y'aurait bp d'inclusions successives de If, ça ralentirait un peu trop je crois ... non ?

Reply

Marsh Posté le 24-05-2007 à 20:38:40    

Mais j'ai un problème sur le regex.
 
Pour reconnaître une série comme "aozheohezoai aodh daojoih323 sp 34", j'ai mis : "^{a-z0-9 }$"
     
et pour reconnaître "D.DR 0345695" j'ai mis "^{a-z0-9 }$" "^{ }?[a-z][.]?[a-z][a-z]{ }?[0]?[0-9][0-9][0-9][0-9][0-9][0-9]$"
 
 
Cependant, je n'obtiens aucun résultat. Je me suis trompé ?

Reply

Marsh Posté le 25-05-2007 à 08:18:09    

Je ne comprends pas que ça ne marche pas ...
 
J'ai fait :
 

Code :
  1. Set CodeChantier = New RegExp
  2.    CodeChantier.Pattern = "[a-z][.]?[a-z][a-z]{ }?[0]?[0-9][0-9][0-9][0-9][0-9][0-9]"
  3.    CodeChantier.IgnoreCase = True
  4.    CodeChantier.Global = False
  5.    
  6.    For k = LigneDebutBalayage To LigneFinBalayage
  7.        CodeChantierPotentiel = FeuilleJour.Cells(k, 3)
  8.        Set occurrences = CodeChantier.Execute(CodeChantierPotentiel)
  9.        If occurrences.Count = 1 Then
  10.            CodeChantierValide = CodeChantierPotentiel
  11.        End If
  12.    Next


 
Ce code sert (normalement :D) à regarder si dans la feuille"FeuilleJour", les cellules(k,3) où k représente une valeur de balayage s'incrémentant contiennent une valeur correspondant au regex défini. Si c'est le cas, CodeChantierValide doit prendre cette valeur, sinon, le balayage continue.
 
Le problème : occurences ne change jamais de valeur alors que CodeChantierPotentiel prend des valeurs qui correspondent au regex (CFR 589745 par exemple).  
 
Vous sauriez m'aider ?


Message édité par Xocs le 25-05-2007 à 08:21:16
Reply

Marsh Posté le 25-05-2007 à 10:56:19    

Sans passer par des expressions régulières, à adapter


Option Explicit
Dim sStr as string
     .....
     sStr = ShData.Cells(k, 3)
     if sStr Like "[A-Z][.][A-Z][A-Z] #######" then
     ....
end if

Message cité 1 fois
Message édité par kiki29 le 25-05-2007 à 11:01:30
Reply

Marsh Posté le 25-05-2007 à 13:01:34    

kiki29 a écrit :

Sans passer par des expressions régulières, à adapter


Option Explicit
Dim sStr as string
     .....
     sStr = ShData.Cells(k, 3)
     if sStr Like "[A-Z][.][A-Z][A-Z] #######" then
     ....
end if



 
 
Ah je vais essayer ça ... :)

Reply

Marsh Posté le 25-05-2007 à 13:28:17    

Xocs a écrit :

Ah je vais essayer ça ... :)


 
 
ça marche, mais mon problème veint en fait de la syntaxe de mon regex :/
 
Si j'écris " *[A-Z][A-Z][A-Z] *0*[0-9][0-9][0-9][0-9][0-9][0-9] *" ça ne marche pas avec une chaîne telle que KDJ 158975 alors que "[A-Z][A-Z][A-Z] [0-9][0-9][0-9][0-9][0-9][0-9]" va la reconnaître ... Je fais une faute quelque part ?


Message édité par Xocs le 25-05-2007 à 13:36:31
Reply

Marsh Posté le 25-05-2007 à 14:03:39    

pkoi y a-t-il un 0 tout seul, et pas un [0-9] dans ta commande ?

Reply

Marsh Posté le 25-05-2007 à 14:03:39   

Reply

Marsh Posté le 25-05-2007 à 14:48:25    

jpcheck a écrit :

pkoi y a-t-il un 0 tout seul, et pas un [0-9] dans ta commande ?


 
 
Parce que parfois le CodeChantier est écrit comme ça : DJH0128754 , j'essaie donc de parer à toutes les éventualités ...

Reply

Marsh Posté le 25-05-2007 à 14:50:44    

et à la place de mettre *0*, quel est la séquence pour dire "espace ou 0" ?  
(je ne connais pas la syntaxe :()

Reply

Marsh Posté le 25-05-2007 à 15:02:46    

jpcheck a écrit :

et à la place de mettre *0*, quel est la séquence pour dire "espace ou 0" ?  
(je ne connais pas la syntaxe :()


 
 
 
ah, pas bête tiens, espace ou 0 normalement s'écrit " |0" mais là il peut y avoir un espace et un 0 aussi : DFT 0125897 :D

Reply

Marsh Posté le 25-05-2007 à 15:23:07    

casse-b***** :D

Reply

Marsh Posté le 25-05-2007 à 15:35:47    

Pour ton masque RegExp, le problème vient des accolades enserrant l'espace.

 

Ta version : [a-z][.]?[a-z][a-z]{ }?[0]?[0-9][0-9][0-9][0-9][0-9][0-9]

 

La mienne, testée avec "D.DR 0345695" et "CFR 589745" : [a-z][.]?[a-z]{2}( )?[0-9]{6}

Message cité 1 fois
Message édité par tegu le 25-05-2007 à 15:36:42
Reply

Marsh Posté le 25-05-2007 à 23:02:15    

tegu a écrit :

Pour ton masque RegExp, le problème vient des accolades enserrant l'espace.
 
Ta version : [a-z][.]?[a-z][a-z]{ }?[0]?[0-9][0-9][0-9][0-9][0-9][0-9]
 
La mienne, testée avec "D.DR 0345695" et "CFR 589745" : [a-z][.]?[a-z]{2}( )?[0-9]{6}


Ah, merci bien de ta réponse :)
Je ne peux pas tester là mais je n'y manquerai pas dès mardi :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed