VBA Excel : tester une chaine de caracteres variable [Résolu/Fermé]

Signaler
Messages postés
197
Date d'inscription
mercredi 23 juin 2010
Statut
Membre
Dernière intervention
12 mars 2018
-
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
-
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 !
A voir également:

6 réponses

Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
197
Date d'inscription
mercredi 23 juin 2010
Statut
Membre
Dernière intervention
12 mars 2018
20
Alors j'ai testé ca :

Pour comparer a "Vis CHC M8-30 classe 12.9"

For i = 3 To lasti
If Cells(i, 1) Like "VIS.VIS01" Then
Cstring = Cells(i, 2)
Select Case Cstring
Case "Vis ??? M#-## classe ##.#"
MsgBox "Designation ok"
Case Else
MsgBox "Designation incorrecte"
End Select
End If
Next i

et ca ne fonctionne pas :/ mais je ne vois pas pourquoi ...
Messages postés
34
Date d'inscription
vendredi 27 juin 2014
Statut
Membre
Dernière intervention
8 août 2014
1
Essaye le code suivant qui t'indiquera les cellules dont le format est incorrect. Je n'ai pas mis de msgbox quand la désignation est ok car il faut cliquer sur ok pour chaque cellule sinon.


Sub test()

Dim derligne As Long
Dim i As Integer

With Sheets("Feuil1")
derligne = Range("A" & .Rows.Count).End(xlUp).Row
For i = 1 To derligne
.Cells(i, 2).Select
If Cells(i, 1) Like "Vis*" Then
If Not Cells(i, 2) Like "Vis * M*-* classe *.*" Then
MsgBox ("Désignation incorrecte en cellule : " & ActiveCell.Address & " !")
End If
End If
Next i
End With

End Sub
Messages postés
197
Date d'inscription
mercredi 23 juin 2010
Statut
Membre
Dernière intervention
12 mars 2018
20
Merci pour ta réponse :)

Je pense que ça fonctionne ainsi, mais j'avais pensé partir sur un "select case" car je vais devoir gérer plusieurs type de désignations (vis, écrous, roulements, etc...).
De plus le caractère joker "*" est trop permissif car a sa place je peux insérer une chaîne de caractères, des chiffres, des espaces ..
Hors le but de la macro est bien de cadrer la manière de remplir les désignations suivant le bon format. C'est pour ça que le caractère jioker "?" ne permet d'insérer qu'une lettre (pas plusieurs et pas de chiffre), le caractère "#" permet d'insérer un chiffre (pas plusieurs et pas de lettre)

Voila j'espère que mes explications sont claires :p
Au pire, je pourrais surement gérer mon problème avec des if..then..else, mais il me semble qu'un select case serait moins lourd dans la macro.
Messages postés
197
Date d'inscription
mercredi 23 juin 2010
Statut
Membre
Dernière intervention
12 mars 2018
20
Effectivement, c'est un codage que je ne connais pas du tout, je test ca dès cet AM et je reviens te dire.
Merci beaucoup car ça semble répondre a la question et je vais me coucher moins bête.. c'est pas si mal :)
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575
Allez zou un tuto et au boulot!...
Messages postés
197
Date d'inscription
mercredi 23 juin 2010
Statut
Membre
Dernière intervention
12 mars 2018
20
Merci ^^

Avant de m'attaquer au tuto, j'aurais une question :
Lorsque tu ecris
'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})

Je comprend que le fait que l'on puisse insérer des lettres est du a la définition [a-aA-Z]
Hors je voudrais limiter ces paramètres à des chiffres, syntaxe serait elle [0-9] ?
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575
Tout à fait. Avec les parenthèses, bien sur ([0-9])

Pour le nombre d'occurrences, s'il est fixe (3 par exemple), utilises {3}. Si tu en as entre 1 et 5, {1,5}

EDIT : si tu veux un chiffre entre 1 et 5 : ([1-5])
Messages postés
197
Date d'inscription
mercredi 23 juin 2010
Statut
Membre
Dernière intervention
12 mars 2018
20
Parfait, je viens de tester et ça fonctionne parfaitement.
Il m'a fallu remplacer les [a-aA-Z] par [0-9] au niveau des indications de diamètre, longueur et classe de résistance et ça roule !
Merci beaucoup pour ton aide ! :)
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575
Mais de rien, si ça peut aider...
A+