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 b

Bonjour!

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 If

Se 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 If

Je 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 If

De 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 <> "" Then

Puisse ê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 If

Merci 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 Sub

Premier test sur un nombre supérieur à 150.

image

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

image

Si j'entre un chiffre inférieur à 150 c'est bon aussi.

image

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é!

Rechercher des sujets similaires à "forcer saisie numerique inputbox"