[VBA]Textbox - N'autoriser une chaîne de caractère définie - VBA Excel

Résolu
talined Messages postés 44 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 14 mars 2012 - 22 janv. 2012 à 12:52
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 23 janv. 2012 à 01:23
Bonjour,

J'ai un petit souci concernant le paramétrage d'une textbox sur VBA Excel
Je vous explique : J'ai insérer une textbox directement sur une feuille ( non pas sur unseform) qui doit repondre à 2 conditions :
- N'autoriser que des lettres en majuscules (ABCDEFGHIJKLMNOPQRSTUVWXYZ), et des chiffres (123456789)
- Empecher le copier coller de n'importe quelle valeur non définie ci-dessus.

J'avais réussi à empécher le copier coller de caractères non numériques avec le code ci dessous pour une textbox n'autorisant que du numérique. Voici ce que ca donnait :

............................
Private Sub TextBox1_Change()

Static anc As String
If Not IsNumeric(TextBox1.Text) Then
TextBox1.Text = anc
Else
anc = TextBox1.Text
End If

End Sub
............................

Etant débutant, je ne vois pas comment traduire mes conditions (lettres Majuscules + chiffres)
Merci par avance

24 réponses

Utilisateur anonyme
22 janv. 2012 à 14:32
Pardon, j'étais resté en VB6...

VBA:
Dim mydate As Object

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 If InStr("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ", Chr(KeyAscii)) 0 Then KeyAscii 0
End Sub

Private Sub ClipClear()
  Set MyData = New DataObject
  MyData.SetText "Interdiction de copier/coller!"
  MyData.PutInClipboard
End Sub

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
ClipClear
End Sub

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
ClipClear
End Sub

Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
ClipClear
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
ClipClear
End Sub


Je te laisse faire, acive. Vas-y (facile)

Oui... trop facile! j'ai juste copié un de tes codes Uc
C'est à croire que c'est moi qui a besoin de l'interdiction du copier/coller...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 16:43
T'as raison, acive ! Je n'avais pas vu que tu gérais également le clavier.

Mais chose promise, chose due ===>> j'avais dit un seul évènement ===>> le voilà :
Private Sub TextBox1_Change()
  Dim toto
  Static anc As String
  toto = Array("*[" & Chr(1) & "-/]*", "*[:-@]*", "*[([)\-" & Chr(255) & "]*")
  For i = 0 To UBound(toto)
    If TextBox1.Text Like toto(i) Then
      TextBox1.Text = anc: Exit Sub
    End If
  Next
  anc = TextBox1.Text
End Sub


Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 'ceci n'est là que pour rendre la vie facile à l'utilisateur
 'on peut le supprimer, mais on force alors l'utilisateur à presser la touche Maj pour rien
 KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub


En précisant que l'évènement Change, comme expliqué, n'est là que pour faciliter la vie, rien de plus.
Pas belle, la vie ?




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 13:36
Bonjour,
Tu t'es trompé de rubrique ! VBA n'est pas VB6 !
"Fais-y dorénavant gaffe", s'il te plait (important).
Mais dis-nous (important également) :
-- sans te protéger des copiers/coller (facile et très rapide)
ou
-- en te protégeant de copiers/coller (facile mais plus lent)
?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
22 janv. 2012 à 13:41
Salut,

Déjà pour la saisie tu peux faire quelque chose de ce genre:

Private Sub Text1_Change()
Text1.Text = UCase(Text1.Text)
Text1.SelStart = Len(Text1.Text)
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
   If KeyAscii > 122 Or KeyAscii < 48 Or _
            (KeyAscii < 65 And KeyAscii > 57) Or _
            (keyascci > 90 And KeyAscii < 97) Then
      KeyAscii = 0
   End If
End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 13:49
Bonjour, acive,
on ne sait pas encore s'il veut se protéger des copier/coller (car très différent dans ce cas)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
22 janv. 2012 à 13:51
Ou encore:
 If InStr("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ", Chr(KeyAscii)) 0 Then KeyAscii 0



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
22 janv. 2012 à 13:53
Oui, Uc c'est vrai, attendons donc la suite...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 13:53
Ne change rien, acive, s'il veut se protéger des copier/coller non en conformité


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 13:55
va falloir jouer avec deux évènements, s'il veut se "protéger".
Je te laisse faire, acive. Vas-y (facile)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
talined Messages postés 44 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 14 mars 2012
22 janv. 2012 à 13:59
Désolé pour l'erreur!!

Je confirme que cela doit empecher les copier-coller, sinon, on peut insérer tout et n'importe quoi...

Merci bcp
0
Utilisateur anonyme
22 janv. 2012 à 14:12
Un simple Clipboard.clear suffit non?

Private Sub Text1_Change()
Text1.Text = UCase(Text1.Text)
Text1.SelStart = Len(Text1.Text)
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Clipboard.Clear
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
 If InStr("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ", Chr(KeyAscii)) 0 Then KeyAscii 0
End Sub

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Clipboard.Clear
End Sub

Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Clipboard.Clear
End Sub

Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Clipboard.Clear
End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
22 janv. 2012 à 14:35
J'ai même copié ta faute de frappe

Dim mydate As Object
'à remplacer par
 Dim mydata As Object


Mais bon ça fonctionne quand même...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 14:49
Je me tords littéralement de rire (non méchamment, sois rassuré), mais c'est bon, le dimanche ...
Pourquoi ?
1) Parce que sous VBA : gros problème pour savoir sur quel évènement vider le presse-papier (on s'y casse les dents dans un cas très particulier, repéré dans une autre discussion de ce jour)
2) parce-que les copier/coller ne peuvent pas se faire qu'à l'aide de la souris (et alors ? il te faudra aussi gérer le clavier !)

Alors ?
- Ou on fait une usine à gaz
- ou on fait avec un seul évènement (le 2ème, dont j'ai parlé plus haut, n'est pas nécessaire et ne sera utilisé que pour faciliter la tâche de l'utilisateur)

Je vais vous laisser vous creuser un peu le cerveau. Je ne reviendrai que plus tard, pour vous montrer la "soluce fastoche"*
A plus, donc (et soyez sages).



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
22 janv. 2012 à 14:55
Mais ce code gère les évènements de la souris et du clavier, je ne vois pas trop où tu veux en venir.



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
talined Messages postés 44 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 14 mars 2012
22 janv. 2012 à 15:02
Merci bien Messieurs. Cela fonctionne.

Pour ma compréhension, pourrai-je avoir les explications concernant les declarations Moveup, Movedown, Keyup, Keydown svp?
0
Utilisateur anonyme
22 janv. 2012 à 15:06
Re:
MouseDown c'est quand tu appuies sur un bouton de la souris (vers le bas)
MouseUp c'est quand tu relâches le bouton de la souris (vers le haut)
Et la même chose pour les touches du clavier (KeyUp et KeyDown)

A chacune de ces actions il vide le presse papiers (ClipBoard)



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
talined Messages postés 44 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 14 mars 2012
22 janv. 2012 à 15:18
Ok C'est très clair
Merci beaucoup Acive!!!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 17:05
Et au fait, talined :
Je ne vois aucun tag "réponse acceptée" sur aucune de tes 3 dernières discussions. Pourquoi ?
Pas résolues ? Vraiment ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
talined Messages postés 44 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 14 mars 2012
22 janv. 2012 à 17:17
Oui c'est vrai, j'avais oublié. C'est fait

Cependant, pourrais tu m'expliquer le contenu du code "array" car j'ai du mal a comprendre .

Merci bcp.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 janv. 2012 à 17:27
Cependant, pourrais tu m'expliquer le contenu du code "array" car j'ai du mal a comprendre .

J'attendais cette question.
Il te faut alors, pour comprendre :
- 1) apprendre ce qu'est un array (ton aide VBA avec ce mot)
et une fois la chose comprise (et c'est facile lorsque l'on a lu)
- 2)ouvrir ton aide VBA sur le mot Like (l'opérateur Like) et là également lire attentivement
puis, ce 2ème cap étant franchi et compris :
3) ouvrir ton aide en ligne sur le mot chr (et là aussi, lire)


Voilà trois excellentes occasions de te tremper dans le seul bain qui convienne : ton aide VBA.

Tout le reste (le mécanisme que j'ai mis en oeuvre) est uniquement de la gymnastique de l'esprit.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous