Sécuriser formule VBA - tri dans chaine de caractère

Tonino7

XLDnaute Occasionnel
Bonjour à tous,

j'ai une chaine de caractère representée comme une variable sous VBA. Et je souhaite controle tous les caractère de cette chaines afin de savoir s'ils sont autorisés ou non :
mon code :
Code:
For i = 1 To Len(FormulaBasic)
If Mid(FormulaBasic, i, 1) <> "#" or Mid(FormulaBasic, i, 1) <> "[" or Mid(FormulaBasic, i, 1) <> "]" Then

MsgBox "are authorized only the characters:[]#", vbExclamation, "Attention!"
Exit Sub
End If
Next i
mais cela ne marche pas, et avez vous une solution plus concise avec un genre de Array ou quelquechose comme ça. Je suis bloqué depuis plusieurs heures!

merci d'avance
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Sécuriser formule VBA - tri dans chaine de caractère

Bonjour à tous


1) voir du côté de Asc
Code:
Sub a() [COLOR=Green]'exemple basique à peaufiner[/COLOR]
Dim i&, f As Boolean
s = "[]#"
For i = 1 To Len(s)
Select Case Asc(Mid(s, i, 1))
Case 35, 91, 93
f = True
Case Else
f = False
End Select
Next i
MsgBox f
End Sub

2) Voir du côté des expressions régulières (regexp)
Un exemple ici (ici il suffit d'inverser la logique)
Lien supprimé
facilement adaptable à ta question (il suffit pour cela de définir le bon pattern )

PS1: je propose cette piste de solution regexp , bien qu'aux fils de mes réponses intégrant regexp, je m'aperçois que peu de monde sur XLD s'intéresse
aux grandes possibilités offertes par celles-ci. :confused:

PS2
:
MsgBox "are authorized only the characters:[]#"
Je comprends différemment de camarchepas que seuls ces 3 caractères
sont autorisés: [ ] #
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Sécuriser formule VBA - tri dans chaine de caractère

Re :),
Une autre solution :
CaracInterdit = "#,',[,]" et tape le retour de la saisie
if InStr(1,CaracInterdit , tape) >0 then msgbox "interdit"
Intéressant, mais c'est le contraire qu'il souhaite, ces caractères sont les seuls autorisés (d'après ce qu'il a mis, aussi surprenant que ça paraisse :p...), et là la liste va être longue :D.
A + :cool:
 

Tonino7

XLDnaute Occasionnel
Re : Sécuriser formule VBA - tri dans chaine de caractère

wahouu... merci à tous pour vos réponses. Un de mes problèmes était aussi que le nombre de caractère autorisé n'était pas de 3 mais de 20, donc je ne voulais pas de formule à rallonge grace à du array ou autre.

Je me suis donc inspiré de la méthode Replace proposée par JNP, en faisant une boucle, cela donne :

Code:
FormulaTest = FormulaBasic
caract = Array("[", "]", "#", "+", "-", "/", "*", "=", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "<", ">", "$", "(", ")", ".")
For numcaract = 0 To 23
FormulaTest = Replace(FormulaTest, caract(numcaract), "")
Next numcaract
If FormulaTest <> "" Then
MsgBox "are authorized only the characters:()[]#0123456789+-*/.<>$=", vbExclamation, "Attention!"
Exit Sub
End If

et ça marche ;)

La méthode de Staple a l'air pas mal, mais j'ai du mal à la comprendre pour l'instant.. :)
 

Paritec

XLDnaute Barbatruc
Re : Sécuriser formule VBA - tri dans chaine de caractère

Bonsoir JNP Tonino JM
Jean Noël j'ai demandé la même chose à Jean Marie mais il ne m'a pas répondu!!!
bonne nuit je pars de bonne heure alors dodo
a+
papou :)
 

Staple1600

XLDnaute Barbatruc
Re : Sécuriser formule VBA - tri dans chaine de caractère

Eh Oh j'arrive les gars ;)
Bonsoir à tous

J'étais en famille , à crapahuter avec mes neveux et nièce dans un parc.

Ils m'ont vanné.

Donc de retour, devant le clavier, je vais essayer (mais c'est pas gagné) de pondre un exemple avec regexp.

Sinon pour les plus curieux (car ce soir je suis encore en famille alors le temps me manque )

faites une recherche avancé sur mon pseudo avec regexp pour mot-clé

EDITION: Voici un exemple fait sur le pouce
Le souci étant que [] sont utilisés par regexp

C'est donc ici , que votre aide serait la bienvenue à savoir
déterminer le bon pattern
(c'est ce que je dis avec peu de succès dans les autres fils ou j'évoque regexp
j'ai encore du mal à trouver les bons patterns, et c'est là que l'aide XLD serai la bienvenue, mais regexep semble être boudé par la majorité d'entre vous sans que je sache pourquoi :confused: )

Code:
Sub testregexp()
Dim s$, i&
s = "[#]"
's = "123"
With CreateObject("vbscript.regexp")
    .Global = True
    '.Pattern = "\#"
    .Pattern = "\["
        For i = 1 To Len(s)
        If .test(Mid(s, i, 1)) = True Then
        MsgBox "Test"
        End If
        Next i
    End With
End Sub
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Sécuriser formule VBA - tri dans chaine de caractère

Bonjour Jean-Marie :),
Après 2, 3 aspros pour comprendre RegExp :p...
Code:
Sub testregexp()
Dim s$, I%, Motif, Drapeau As Boolean
s = "[123"
Motif = Array("[a-z]", "[A-Z]")
With CreateObject("vbscript.regexp")
    .Global = True
    For I = LBound(Motif) To UBound(Motif)
        .Pattern = Motif(I)
            If .test(s) = True Then Drapeau = True
    Next I
    If Drapeau = True Then MsgBox "Test"
End With
End Sub
va permettre de vérifier s'il y a un (des) caractère(s) de "a à z" et de "A à Z", mais il ne détecte pas les accents, ni les caractères spéciaux, donc dans le cas présent, pour être exhaustif, on va avoit un Array de 10 km :p...
Mais c'est vrai que RegExp peux faire des choses sympa si on cherche quelque chose de particulier, et non le contraire ;).
A creuser donc :rolleyes:...
Bonne journée :cool:
 

JNP

XLDnaute Barbatruc
Re : Sécuriser formule VBA - tri dans chaine de caractère

Re :),
Finalement, je retire ce que j'ai dit, RegExp fonctionne parfaitement une fois le bon Pattern trouvé (une pharmacie, vite :p...)
Code:
Sub testregexp()
Dim s$
s = "[123-*$"
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "[^\[\]#\+/\-\*=0-9<>$\(\)\.]"
        If .test(s) = True Then MsgBox "Test"
End With
End Sub
Bravo Jean-Marie, effectivement, ça vaut le coup de creuser ;)!
Bon lundi :cool:
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 098
Membres
103 116
dernier inscrit
kutobi87