Forcer la saisie numérique d'un InputBox
Bonjour à tous!
J'ai un fichier créant des directives de changement dont les nouvelles directives sont créer au fur et à mesure par l'entreprise d'un UserForm pour sélectionner les catégorie (Architecture, Mécanique, Structure, Civil et Interne). Mon code fonctionne bien et il fait ce que je veux toute fois je cherche à l'amener plus loin afin que l'erreur ne soit plus possible!
Ce que je voudrais c'est quand les catégories sont sélectionner dans le UserForm et qu'on clique sur le CommandButton "Valider" il y a alors le InputBox qui ouvre pour saisir un nombre entre 1 à 150. Toute fois on peut aussi écrire n'importe quoi et c'est ça que je voudrais évité en priorité soit aucune saisie de lettre ni de chiffre dépassant 150 ou 0 et que si c'est le cas revenir au InputBox tout simplement et non pas fermé tout.
En second, j'aimerais que quand le InputBox est vide et qu'on clique sur "ok" quand même qu'il saute toute simplement à la deuxième catégorie qui a été sélectionné ou si juste une a été sélectionné alors revenir au UserForm.
Je vous met bien entendu le fichier joint puisque c'est toujours plus évident à comprendre avec celà!
Merci pour votre aide habituel c'est toujours très apprécié! :)
re,
un début ?
If ToggleButton3.Value = True Then
b = True 'flag high
Do 'infinite loop
dcs = Application.InputBox("Veuillez saisir le numéro de la nouvelle directive en structure entre 1 et 150." & vbLf & " 0 = arreter", "Directive structure", Type:=1) 'numero est obligatoire
If dcs = 0 Then Exit Sub 'arreter est avec 0
If --dcs = Int(dcs) And WorksheetFunction.Median(1, 150, dcs) = dcs Then b = False 'chiffre est integer et entre 1-150 pour sortir the loop
Loop While bBonjour!
Merci pour ton aide!
J'ai tenté le code toute fois il ne fonctionne pas adéquatement. J'ai tenté de mon côté autre chose aussi :
'''Directive architecutre'''
If ToggleButton1.Value = True Then
DCA = Format(Application.inputbox("Saisissez le numéro de la nouvelle directive en architecture. Ce nombre doit être compris entre 1 et 150.", "Directive architecture"), "00")
If DCA <> "" Then
For Each sh2 In Worksheets
If sh2.Name = "DC-A" & DCA Then
Sheets("DC-A" & DCA).Activate
If MsgBox("La directive de changement " & "DC-A" & DCA & " existe déjà. Voulez-vous la supprimer et la remplacer?", vbCritical + vbYesNo) = vbNo Then
Exit Sub
Else
Application.DisplayAlerts = False
Sheets("DC-A" & DCA).Delete
Application.DisplayAlerts = True
Exit For
End If
End If
Next sh2
Sh.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "DC-A" & DCA
Sheets("REGISTRE | DC").Unprotect
Sheets("REGISTRE | DC").ListObjects("TB_architecture").Range.AutoFilter Field:=2, _
Criteria1:="<>"
Sheets("REGISTRE | DC").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
Else
Exit Sub: End If
End IfSe qui fonctionne bien maintenant c'est qu'il passe à la prochaine InputBox quand je clique sur ESC si la catégorie est sélectionné.
Mon problème cette fois réside dans le fait que si le InputBox est vide il créer quand même la nouvelle feuille au lieu de simplement passé à la prochaine InputBox. Il faut aussi que j'arrive à ce que la saisie d'un 0, d'un chiffre supérieur à 150 ou la saisie de lettres soit impossible ou du moins si ça arrive que la InputBox en question soit simplement réinitialisé. Donc en gros la seule fois où j'aimerais qu'elle passe à l'autre InputBox en annulant l'action c'est quand la InputBox est vide ou que je quitte avec ESC.
bonjour,
Cette histoire d'InputBox ne me dit rien qui vaille...
J'ai résolu le truc à ma façon...
Commentaire sur demande...
A+
Bon, j'ai remarqué quelque chose et une différence que j'ai de la misère à comprendre pourquoi avec l'un sa fonctionne et l'autre non... C'est dans la formule Application.inputbox versu InputBox. Quand je fais Application.inputbox je peux contrôler la saisie pour que ce soit uniquement des chiffres, mais le reste du code ne fonctionne pas je ne suis pas en mesure de lui dire si la inputbox est vide ou non.
Toutefois quand je fais seulement inputbox ça fonctionne très bien, mais je ne suis plus en mesure d'imposer la saisir de nombre.
Est-il alors possible avec ce code (voir plus bas) d'obliger quand même la saisie numérique entre 1 et 150 selon vous comme on peut faire avec Application.inputbox Type:=1?
If ToggleButton1.Value = True Then
DCA = Format(inputbox("Saisissez le numéro de la nouvelle directive en architecture. Ce nombre doit être compris entre 1 et 150.", "Directive architecture"), "00")
If DCA <> "" Then
For Each sh2 In Worksheets
If sh2.Name = "DC-A" & DCA Then
Sheets("DC-A" & DCA).Activate
If MsgBox("La directive de changement " & "DC-A" & DCA & " existe déjà. Voulez-vous la supprimer et la remplacer?", vbCritical + vbYesNo) = vbNo Then
Exit Sub
Else
Application.DisplayAlerts = False
Sheets("DC-A" & DCA).Delete
Application.DisplayAlerts = True
Exit For
End If
End If
Next sh2
Sh.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "DC-A" & DCA
Sheets("REGISTRE | DC").Unprotect
Sheets("REGISTRE | DC").ListObjects("TB_architecture").Range.AutoFilter Field:=2, _
Criteria1:="<>"
Sheets("REGISTRE | DC").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
End If
End IfJe vois pas pourquoi tu t'obstines avec ces InputBox alors que ma soluce est simple comme bonjour...
Tu as juste à supprimer ton UserForm puis à ouvrir mon classeur, Ensuite dans la fenêtre VBProject tu fais glisser mon Userform dans ton projet et t'as plus de problème... Tu peux même virer ta gestion d 'erreur !
Bonne journée...
A+
Bonjour galopin01, je comprends ton point toute fois ce n'est pas ce que je recherche exactement.
Il n'y a pas moyen alors à la ligne par exemple :
If DCA <> "" Then
For Each sh2 In Worksheets
If sh2.Name = "DC-A" & DCA Then
Sheets("DC-A" & DCA).Activate
If MsgBox("La directive de changement " & "DC-A" & DCA & " existe déjà. Voulez-vous la supprimer et la remplacer?", vbCritical + vbYesNo) = vbNo Then
Exit Sub
Else
Application.DisplayAlerts = False
Sheets("DC-A" & DCA).Delete
Application.DisplayAlerts = True
Exit For
End If
End If
Next sh2
Sh.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "DC-A" & DCA
Sheets("REGISTRE | DC").Unprotect
Sheets("REGISTRE | DC").ListObjects("TB_architecture").Range.AutoFilter Field:=2, _
Criteria1:="<>"
Sheets("REGISTRE | DC").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
End IfDe mettre au lieu de If DCA <> "" Then de mettre un code qui va lancer une erreur si le chiffre n'est pas compris entre 1 et 150 et revenir tous simplement au InputBox?
Rebonjour à tous!
Je viens de penser que je pourrais peut-être rechercher la valeur saisi dans l'inputbox et que si elle correspond à la plage de cellule dans mon tableau alors elle créer la nouvelle feuille!
Mon tableau reste toujours les mêmes donné dans la première colonne soit : A14 = "DC-A01"; A15 = "DC-02"; etc... Dans mon inputbox c'est seulement les chiffres qu'on inscrit et je veux conserver ça ainsi. Donc si je suis en mesure que ma première ligne de code :
If DCA <> "" ThenPuisse être changé pour quelque chose qui fera la recherche dans les cellules A14 à A163 selon la valeur saisir dans la inputbox qui sera un nombre entre 1 à 150.
Pensez-vous qu'il y a une ligne de code qui pourrait me permettre de rechercher la valeur des chiffres 1 à 150 dans les cellules spécifique A14 à A163?
Salut,
Je ne sais pas si j'ai tout bien compris, mais bon. Avec une boucle comme le préconisait BsAlv
''''Directive architecutre'''
If ToggleButton1.Value = True Then
Do
DCA = Application.InputBox(Prompt:="Saisissez le numéro de la nouvelle directive en architecture entre 1 et 150.", Title:="Directive architecture", Type:=1)
If DCA > 150 Then MsgBox "Entrez un nombre inférieur à 150"
Loop While DCA > 150
Select Case DCA
Case 0
' // MsgBox "Action annlée par l'utilisateur"
Case 1 To 150
For Each sh2 In Worksheets
If sh2.Name = "DC-A" & DCA Then
Sheets("DC-A" & DCA).Activate
If MsgBox("La directive de changement " & "DC-A" & DCA & " existe déjà. Voulez-vous la supprimer et la remplacer?", vbCritical + vbYesNo) = vbNo Then
Exit Sub
Else
Application.DisplayAlerts = False
Sheets("DC-A" & DCA).Delete
Application.DisplayAlerts = True
Exit For
End If
End If
Next sh2
Sh.Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "DC-A" & DCA
Sheets("REGISTRE | DC").Unprotect
Sheets("REGISTRE | DC").ListObjects("TB_architecture").Range.AutoFilter Field:=2, _
Criteria1:="<>"
Sheets("REGISTRE | DC").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
Case Else
End Select
End IfMerci Jean-Paul, c'est exactement ça qu'il me manquait la Loop, j'avais beaucoup de difficulté à la faire!
Un gros merci à tous pour votre aide! :)
Rebonjour Jean-Paul,
Seule petite chose que je remarque, c'est que je ne peux plus quitter l'inputbox en cliquant sur le "X", ESC ou annuler, mais je dois faire absolument le "0". J'ai tenté de modifier le code sans succès...
Le Loop fonction très bien toute fois! Je te reviens je vais tenter à nouveau des trucs!
Salut,
Je ne suis pas devant le PC, mais normalement avec ESC tu as DCA qui est égal à zéro. Je regarderais cela une fois de retour chez moi.
Salut,
Bon voilà petite vérification sur mon PC avec cette Sub.
Sub TestInputBox()
Dim DCA As Integer
Do
DCA = Application.InputBox(Prompt:="Saisissez le numéro de la nouvelle directive en architecture entre 1 et 150.", title:="Directive architecture", Type:=1)
If DCA > 150 Then MsgBox "Entrez un nombre inférieur à 150"
Loop While DCA > 150
If DCA = 0 Then
MsgBox "ESC ou annuler a été frappé"
Else
MsgBox "DCA:= " & DCA
End If
End SubPremier test sur un nombre supérieur à 150.
La boucle fonctionne bien. Si je clique sur annuler ou ESC je sors bien de la boucle et j'ai le message ci-dessous donc OK aussi
Si j'entre un chiffre inférieur à 150 c'est bon aussi.
Donc pour moi tout est OK je ne vois pas pourquoi cela ne fonctionne pas chez toi.
Bonjour Jean-Paul,
Ton code est parfait, c'est moi qui l'a mal transcrit j'avais omis de mettre "Application." à la fonction InputBox! Maintenant que je l'ai mis ton fonctionne à la perfection!
Je te remercie encore pour ton aide c'est très apprécié!