Problème syntaxe TextBox + variable
Bonjour à tous!
Je rencontre un problème de syntaxe assez incompréhensible lors de la création d'un UserForm. Je vous explique!
Dans mon UserForm j'ai créé un certain nombre de TextBox (20). Ces TextBox doivent être remplis de nombres uniquement. Afin de vérifier que c'est le cas, j'utilise la fonction "IsNumeric", qui se déclenche via un bouton "Valider", qui scan l'ensemble de mes TextBox 1 à 1. L'objectif final est que le TextBox se colore de rouge lorsque la fonction "IsNumeric" renvoie False.
Afin de ne pas avoir à écrire
If IsNumeric(TextBox1) then...
If IsNumeric(TextBox2) then... Blablabla
Je souhaite utiliser une boucle For telle que
For i = 1 to 20
w = TextBox & i
If IsNumeric(w) then... Blablabla
Next
Mais la problème! Quelque soit la syntaxe que j'utilise pour nommer mes TextBox, aucune ne fonctionne!
Ex: w = "TextBox" & i ou w = TextBox & i
Ce qu'il se passe dans ces cas là, c'est que le programme va analyser soit le "TextBox" et me dire que ce n'est pas Numérique (ce qui est normal vu qu'il lit ça comme du texte). Ou bien il ne fait pas la différence entre une bonne et une mauvaise entrée, comme si l'incrémentation du i ne fonctionnait pas.
Après recherches, je n'a pas trouvé de résultats. Je fais donc appel aux grands sages (ou pas) de ce forum!
PS: Je vous joint le fichier!
Bonjour
pour les nombres uniquement il faire un KeyPress
A voir
Private Sub TextBox5_keyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Beep
End SubA+
Maurice
Bonjour,
C'est :
Controls("TextBox" & i)Cordialement.
Merci beaucoup MFerrand c'est tout bon!
Quelle différence y a t-il entre l'utilisation d'une fonction IsNumeric et d'un KeyPress?
Bonjour,
La Méthode de MFerrand marche bien, mais si tu veux nommer tes textbox de façon plus explicite tu peux faire une boucle de ce genre :
Dim ctrl As Control 'on déclare la variable de boucle
For Each ctrl In UserForm1.Controls 'pour tous les contrôles dans le formulaire
If TypeName(ctrl) = "TextBox" Then 'si le type de contrôle est TextBox
ctrl.BackColor = RGB(150, 150, 150) 'on colore le fond du controle
End If
Next ctrl 'controle suivantL'avantage c'est qu'en utilisant ta boucle each tu parcours tout tes controles, et avec typename tu peux nommer ton controle comme tu veux, et ça n'aura aucune incidence, je te laisse voir ça de ton côté
Sinon si tu veux tester les valeurs que rentre la personne, je te recommande de plutôt placer ce petit code dans chacun de tes contrôles textbox :
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call estnombre(ActiveControl)
End SubLe programme appelé será le suivant :
Sub estnombre(ctrl As Control) 'fonction qui contrôle que la valeur saisie est un nombre
rouge = RGB(255, 0, 0)
blanc = RGB(255, 255, 255)
If ctrl = "" Then 'si le controle est vide
Exit Sub 'on sort du programme
End If
If Not IsNumeric(ctrl.Value) Then 'si la valeur saisie n'est pas numérique
MsgBox ("La valeur saisie doit être un nombre") 'affichage d'un message
ctrl.BackColor = rouge 'on met le fond en rouge
ctrl.Value = "" 'on vide le controle
Else
ctrl.BackColor = blanc 'on met le fond en blanc
ctrl.Value = CDbl(ctrl.Value) 'on convertis la valeur en nombre pour enlever les 0 devant le nombre
End If
End SubJe ne connaissais pas du tout cette méthode c'est super intéressant!
Merci beaucoup
Re, Salut Ausecour !
Avec IsNumeric, tu testes s'il s'agit d'un nombre.
Avec KeyPress, tu interviens au niveau de la touche de clavier pressée. Si tu codes cet évènement pour que seules les touches chiffres soient validées, l'utilisateur ne pourra saisir que des nombres (plus la peine de tester avec IsNumeric...)
Attention si tu dois saisir des nombres décimaux. Un Userform n'est pas Excel, et la touche du clavier numérique renvoie un point dans une TextBox et non une virgule.
Tu peux conserver le point et convertir en nombre lors de l'affectation avec la fonction Val (qui ne reconnaît que le point comme séparateur décimal, les autres fonctions utilisant le séparateur des paramètre régionaux, soit la virgule en FR).
Ou bien, tu n'acceptes que la virgule ou tu remplaces le point par une virgule lors de la saisie, et là l'affectation peut se faire directement car Excel opèrera automatiquement la conversion en nombre.
Cordialement.
Au fait personnellement dans les formulaires que je fais je contrôle plutôt les valeurs et vide sans mettre en rouge, je met en blanc si la valeur est bonne, et comme je vide les contrôles dont la valeur n'est pas bonne, quand je mets un bouton pour exporter les valeurs, avant d'exporter je vérifie via un autre programme que tous les controles sont bien remplis et met ceux vide avec un fond rouge.
Je fais ça via une fonction :
Function ControleVide() as Boolean
rouge = RGB(255,0,0)
dim ctrl as control
nbvide = 0
For each ctrl in Userform1.Controls
if typename(ctrl) = "TextBox" or typename(ctrl) = "ComboBox" then 'si on a une combobox ou une textbox
If ctrl.value = "" then 'si le controle est vide
ctrl.backcolor = rouge 'on met son fond en rouge
nbvide = nbvide + 1 'on compte un controle vide en plus
End if
Next ctrl
If nbvide >0 then
ControleVide = true
msgbox("Certains contrôles ne sont pas renseignés, l'exportation du formulaire ne peut pas être réalisée")
else
ControleVide = false
end if
End FunctionEt après je mets dans le bouton d'export:
If not ControleVide then
call exporter
end ifEDIT: Salut MFerrand !
Re, Salut Ausecour !
Avec IsNumeric, tu testes s'il s'agit d'un nombre.
Avec KeyPress, tu interviens au niveau de la touche de clavier pressée. Si tu codes cet évènement pour que seules les touches chiffres soient validées, l'utilisateur ne pourra saisir que des nombres (plus la peine de tester avec IsNumeric...)
Attention si tu dois saisir des nombres décimaux. Un Userform n'est pas Excel, et la touche du clavier numérique renvoie un point dans une TextBox et non une virgule.
Tu peux conserver le point et convertir en nombre lors de l'affectation avec la fonction Val (qui ne reconnaît que le point comme séparateur décimal, les autres fonctions utilisant le séparateur des paramètre régionaux, soit la virgule en FR).
Ou bien, tu n'acceptes que la virgule ou tu remplaces le point par une virgule lors de la saisie, et là l'affectation peut se faire directement car Excel opèrera automatiquement la conversion en nombre.
Cordialement.
Ça peut se faire avec un code comme celui-ci :
if DecimalSeparator = "," then
ARemplacer = "."
else
ARemplacer = ","
end if
ctrl.value = replace(ctrl.value, ARemplacer, DecimalSeparator )
[...]Merci à tous de vos réponses! Vous êtes au top!
Je vais me faire un mixe de tout ça!
Je mets ce sujet en résolu!
Bonne journée à vous