Test sur texbox

P

Paul

Guest
Salut à tous,

je suis face à un petit souci qui me pose bien des problèmes...

Dans une userform me permettant de demander à l'utilisateur la saisie de différentes caractéristiques d'un matériel (code, genre, nom), je possède une textbox dans laquelle l'utilisateur saisie le code du matériel.

Le souci c'est que je ne veux pas que deux éléments est le même code, alors je compare la valeur du code entré avec les codes que j'ai dans ma liste.

Voici mon code :

Private Sub TextBox1_Change()
Dim code_mat As String
Dim L As Integer

code_mat = TextBox1.Value
L = Sheets("Liste matériel").Range("A65536").End(xlUp).Row

If code_mat <> "" Then

For i = 5 To L
If Sheets("Liste matériel").Cells(i, 1).Value = code_mat Then
A = MsgBox("Le code entré a déjà été attribué",
vbOKOnly, "Erreur")
TextBox1.Value = ""
GoTo Fin
End If
Next i
End If
Fin:

End Sub

Comme ce code peut être un entier ou un entier et des lettres, je l'ai déclaré en "String". Le problème vient du fait que le test est effectué dès que l'utilisateur a saisi un caractère de son code.
ex : on veut taper 10 mais 1 existe déjà... le message d'erreur s'affiche alors.

Avez vous une solution ?

Paul
 
S

salim

Guest
Bonjour Paul et le Forum

Paul à mon avis cette erreur survient du fait que ton code est associé a l'évenement Change de la TextboxBox du coup dès que sa valeur change le code se met en route, je pense qu'il vaudrai mieux l'associer (ton code) à un bouton par exemple avec l'évenement Click.

Tiens nous au courant.

@+ Salim
 
P

Paul

Guest
Bonjour Salim, le forum,

En fait, je voudrais pouvoir effectuer ce test automatiquement, sans que l'utilisateur n'appuie sur un bouton... je ne sais pas si cela est possible.

le code que j'ai présenté dans le 1er post fonctionne si je tape un chiffre compris entre 0 et 9, et que c chiffre est déjà associé à un code. Cependant je ne peux pas taper un chiffre > 9.

Merci pour ton aide aussi rapide
Paul
 
@

@+Thierry

Guest
Bonjour Salim, Paul, le Forum

Disons que je suis du même avis que Salim, l'évènement Change n'est pas approprié.

As-tu essayé l'évènement "Exit" ?

Option Explicit
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim code_mat As String
Dim L As Integer
Dim i As Integer

code_mat = TextBox1.Value
L = Sheets("Liste matériel").Range("A65536").End(xlUp).Row

If code_mat <> "" Then

For i = 5 To L
If Sheets("Liste matériel").Cells(i, 1).Value = code_mat Then
MsgBox "Le code entré a déjà été attribué", vbCritical + vbOKOnly, "Erreur"
TextBox1.Value = ""
Exit Sub
End If
Next i
End If

End Sub

Ce devrait être possible, bien sûr si tu as d'autres contrôles dans ce UserForm pour prendre le Focus en Sortie de cette TextBox.

Bonne Soirée
@+Thierry
 
Y

yeahou

Guest
Bonjour Paul, Salim, Thierry, le forum

Oserai je une remarque aprés une intervention de Thierry, le pape du userform ?
Il me semble qu'un controle beforeupdate serait plus approprié car un controle exit sera exécuté à chaque passage sur la textbox même si la valeur de code n'est pas modifiée.

A+
 
P

Paul

Guest
Bonjour @+Thierry, Salim, Yeahou, le forum,

Après avoir essayé la version proposée par @+Thierry et celle de Yeahou, je peux vous dire que mon pb est résolu !
Merci à vous !
Cependant, comme je ne maitrise pas assez vba, je ne suis pas en mesure de déterminer quelle est la meilleure solution, celle avec Exit ou celle avec beforeupdate.

En tout cas, mille mercis pour ces renseignements.
Paul
 
@

@+Thierry

Guest
Bonsoir Paul, Yeahou, Salim, le Forum

Bonne question soulevée ici... En fait je n'ai utilisé que l'évènement "Enter"ou l'évènement "Exit" dans 99% des cas de figure que j'ai rencontré au hazards des besoins particuliers des UserForms que j'ai eu à crée, ici dans XLD et ailleurs pour mon boulot...

Donc la question de Yeahou m'a fait un peu analyser les autres évènement que j'ai sûrement négligés jusqu'à lors. (BeforeUpdate, AfterUpdate)

Dans le cas de Figure présentement proposé, on peut préférer l'évènement BeforeUpdate car en effet comme l'a justement précisé Yeahou, qui est un Excellent Contributeur pour XLD, si on "repasse" le UserForm en cliquant revue tous les contrôles, l'évènement "Exit" se déclenchera même si on a strictement rien changé dans la TextBox.

Donc Paul "Go Ahead" pour TextBox2_BeforeUpdate qui peut être plus adapté pour ton cas si tu passes et repasses dans cette TextBox pendant la Saisie...

Ceci dit, j'ai fait une test tout bête en me disant ça va me servir ce "BeforeUpdate "... :

Matériel :
1 UserForm
2 TextBox (TextBox1 & TextBox2)
1 CommandButton (CommandButton1)

Le Code
Option Explicit
Dim PasBon As Boolean

Private Sub UserForm_Initialize()
PasBon = True
Me.TextBox2 = "Toto"
PasBon = False
End Sub

Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If Me.TextBox1 = "" Then
MsgBox "Et alors on remplit pas les TextBox dans l'ordre !!!"
Cancel = True
PasBon = True
End If
End Sub

Private Sub TextBox2_Change()
Dim TheTextBox2 As String
If PasBon = True Then Exit Sub
TheTextBox2 = Me.TextBox2
MsgBox TheTextBox2
ActiveCell = TheTextBox2
End Sub

Mais bon çà ne sert à rien dans ce cas de figure là !! lol... en fait ce BeforeUpdate est vraiment un hybride et je crois que je vais en rester à mon bon vieux Enter ou Exit pour gérer certains les cas de figures les plus courants...

Pour la petite histoire voici le même test avec "Enter"
Option Explicit
Dim PasBon As Boolean

Private Sub UserForm_Initialize()
PasBon = True
Me.TextBox2 = "Toto"
PasBon = False
End Sub

Private Sub TextBox2_Enter()
If Me.TextBox1 = "" Then
MsgBox "Et alors on remplit pas les TextBox dans l'ordre !!!"
PasBon = True
End If
End Sub

Private Sub TextBox2_Change()
Dim TheTextBox2 As String
If PasBon = True Then Exit Sub
TheTextBox2 = Me.TextBox2
MsgBox TheTextBox2
ActiveCell = TheTextBox2
End Sub

Mais je ne veux pas t'embrouiller Paul, tu n'as pas besoin de tout ceci, c'est juste moi qui suis (comme d'hab) atteint de cogitation aigue !!! lol

Bonne Soirée
@+Thierry
 
Y

yeahou

Guest
Bonjour Paul, Salim, Thierry, le Forum

Merci pour le compliment, Thierry, ça m'a vraiment fait plaisir!
voici un petit exemple basique d'utilisation sur beforeupdate et afterupdate
beforupdate controle la valeur entrée et afterupdate exécute si il y a une valeur nouvellement entrée correcte, en l'occurence TITI
Exit fait la même chose mais incrémente son compteur à chaque passage ce qui n'est pas le cas du couple before/afterupdate
fichier Testbeforeafterexit.xls
Beforeupdate est plutot un événement de controle avant de passer l'exécution à afterupdate
C'est donc vraiment une affaire de contexte et de connaissance de l'événement.
le deuxième fichier permet de bien cerner l'ordre d'exécution des événements Change, Enter, Exit, BeforeUpdate, AfterUpdate en faisant varier la valeur de textbox1, des tabulations, etc

Cordialement, A+
 

Pièces jointes

  • Evenements.zip
    18.1 KB · Affichages: 16

Statistiques des forums

Discussions
312 490
Messages
2 088 884
Membres
103 982
dernier inscrit
krakencolas