VBA Excel : tester une chaine de caracteres variable
Résolu
Eaheru
Messages postés
197
Date d'inscription
Statut
Membre
Dernière intervention
-
pijaku Messages postés 12263 Date d'inscription Statut Modérateur Dernière intervention -
pijaku Messages postés 12263 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Afin de nous assurer que les réservations dans les listes de visserie sont bien renseignées, je souhaite creer une petite macro de vérification.
Le principe est le suivant :
si en colonne A de la ligne en cours j'ai la famille "VIS", alors en colonne B de la ligne en cours je dois avoir une chaîne de caractères de type : Vis CHC M8-30 classe 12.9
Le petit Hic est que la désignation peut avoir plusieurs variantes (bien sur) :
-Vis x Mx-x classe x.x
-Vis x Mxx-x classe x.x
-Vis x Mxx-x classe xx.x
-Vis x Mxx-xx classe x.x
-Vis x Mxx-xx classe xx.x
-Vis x Mxx-xxx classe x.x
-Vis x Mxx-xxx classe xx.x
-Vis xx Mx-x classe x.x
-Vis xx Mxx-x classe x.x
-Vis xx Mxx-x classe xx.x
-Vis xx Mxx-xx classe x.x
-Vis xx Mxx-xx classe xx.x
-Vis xx Mxx-xxx classe x.x
-Vis xx Mxx-xxx classe xx.x
-Vis xxx Mx-x classe x.x
-Vis xxx Mxx-x classe x.x
-Vis xxx Mxx-x classe xx.x
-Vis xxx Mxx-xx classe x.x
-Vis xxx Mxx-xx classe xx.x
-Vis xxx Mxx-xxx classe x.x
-Vis xxx Mxx-xxx classe xx.x
j'espère ne pas en oublier. Les "x" sont des caractères "jokers"
J'étais parti sur un "select case" mais cette syntaxe ne semble pas gérer les caractères jokers de type "Vis ??? M?-?? classe ??.?"
Auriez vous une idée pour gérer ce cas ?
Merci d'avance pour votre aide !
Afin de nous assurer que les réservations dans les listes de visserie sont bien renseignées, je souhaite creer une petite macro de vérification.
Le principe est le suivant :
si en colonne A de la ligne en cours j'ai la famille "VIS", alors en colonne B de la ligne en cours je dois avoir une chaîne de caractères de type : Vis CHC M8-30 classe 12.9
Le petit Hic est que la désignation peut avoir plusieurs variantes (bien sur) :
-Vis x Mx-x classe x.x
-Vis x Mxx-x classe x.x
-Vis x Mxx-x classe xx.x
-Vis x Mxx-xx classe x.x
-Vis x Mxx-xx classe xx.x
-Vis x Mxx-xxx classe x.x
-Vis x Mxx-xxx classe xx.x
-Vis xx Mx-x classe x.x
-Vis xx Mxx-x classe x.x
-Vis xx Mxx-x classe xx.x
-Vis xx Mxx-xx classe x.x
-Vis xx Mxx-xx classe xx.x
-Vis xx Mxx-xxx classe x.x
-Vis xx Mxx-xxx classe xx.x
-Vis xxx Mx-x classe x.x
-Vis xxx Mxx-x classe x.x
-Vis xxx Mxx-x classe xx.x
-Vis xxx Mxx-xx classe x.x
-Vis xxx Mxx-xx classe xx.x
-Vis xxx Mxx-xxx classe x.x
-Vis xxx Mxx-xxx classe xx.x
j'espère ne pas en oublier. Les "x" sont des caractères "jokers"
J'étais parti sur un "select case" mais cette syntaxe ne semble pas gérer les caractères jokers de type "Vis ??? M?-?? classe ??.?"
Auriez vous une idée pour gérer ce cas ?
Merci d'avance pour votre aide !
A voir également:
- Expression régulière excel
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel moyenne - Guide
6 réponses
Bonjour,
Pourquoi pas avec une petite fonction Boolean bâtie sur une expression régulière...
J'ai, normalement, suffisamment commenté la règle de l'expression pour que tu puisses l'adapter. Mais n'hésite pas si je suis à côté de la plaque!!
ATTENTION : Bien cocher la référence nécessaire (cf code)
Pourquoi pas avec une petite fonction Boolean bâtie sur une expression régulière...
J'ai, normalement, suffisamment commenté la règle de l'expression pour que tu puisses l'adapter. Mais n'hésite pas si je suis à côté de la plaque!!
ATTENTION : Bien cocher la référence nécessaire (cf code)
Option Explicit 'cocher la référence Microsoft vbscript regular expression 5.5 'Dans Outils/Références Function TestVis(texto As Range) As Boolean Dim reg As Object Set reg = CreateObject("vbscript.regexp") reg.Global = False reg.Pattern = "(^Vis )([a-zA-Z]{1,3})( )(M)([a-zA-Z]{1,2})(-)([a-zA-Z]{1,3})( classe )([a-zA-Z]{1,2})(.)([a-zA-Z]{1})" TestVis = reg.Test(texto) 'Explication du Pattern : 'entre chaque parenthèse, on place un élément de l'enchainement 'La chaine de caractères à tester est un enchainement précis de : 'Le mot Vis au début de la chaine, => (^Vis) ^ représente le début de la chaine et Vis respecte la casse (Majusc, minusc) 'suivi de 1 à 3 lettres, => ([a-zA-Z]{1,3}) 'suivi d'un espace, => ( ) *--- Note : on aurait pu l'insérer avec le M qui suit... Mis pour l'exemple 'suivi de la lettre M, => (M) 'suivie de 1 à 2 lettres, => ([a-zA-Z]{1,2}) 'suivie d'un tiret, => (-) 'suivi de 1 à 3 lettres, => ([a-zA-Z]{1,3}) 'suivi du mot classe entouré d'espace ET en minuscules, => ( classe ) 'suivi d'1 à 2 lettres, => ([a-zA-Z]{1,2}) 'suivi d'un point, => (.) 'suivi d'une lettre. => ([a-zA-Z]{1}) 'Le tout mis bout à bout nous donne la règle (Pattern) à respecter, soit : ' "(^Vis )([a-zA-Z]{1,3})( )(M)([a-zA-Z]{1,2})(-)([a-zA-Z]{1,3})( classe )([a-zA-Z]{1,2})(.)([a-zA-Z]{1})" End Function Sub Test() Dim i& For i = 1 To 5 'Lance le test sur les cellules de A1 à A5 MsgBox TestVis(Range("A" & i)) Next i End Sub