VBA Excel : tester une chaine de caracteres variable

Résolu/Fermé
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 - 17 juil. 2014 à 15:01
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 18 juil. 2014 à 12:02
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 !

6 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
18 juil. 2014 à 11:22
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)

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

2