Problème gestion INPUTBOX
Bonjour.
Je parviens très difficilement à écrire correctement un InputBox pour lequel j'aimerais gérer la croix, le bouton annuler et l'absence de saisie de la part de l'utilisateur.
J'ai pas mal écumé la toile et je ne parviens pas à trouver la solution.
J'ai bien compris qu'il y avait la méthode et la fonction InputBox et j'ai tenté d'utiliser les 2, sans plus de succès.
La variable qui récupère la saisie de l'utilisateur est typée integer.
Je demande à l'utilisateur de saisir dans l'InputBox, un chiffre correspondant à l'une des sheets du classeur.
j'ai lu que si rien n'était saisi ou que l'opérateur cliquait sur la croix ou le bouton annuler, InputBox (méthode ou fonction ?) retournait "".
J'ai donc testé si mavariable = "" alors InputBox à nouveau, mais j'ai des incompatibilités de type.
J'ai bien tenté Is Nothing, Is Null, Is Empty, en vain.
Du coup, il faut commencer à potasser les erreurs et... ça fait 3 heures de passées pour un InputBox qui ne fonctionne toujours pas.
Quant à la macro, elle fait une boucle pour compter le nombre de sheets du classeur.
Puis l'inputBox affiche le nom "extérieur" de la sheet ainsi que son numéro d'item correspondant et demande à l'utilisateur d'entrer le numéro de la sheet qu'il souhaite sélectionner.
Voici un extrait de mon code (soyez indulgent, SVP):
' boucle pour remplir le tableau de toutes les feuilles présentes dans le classeur
MsgBox prompt:="Veuillez parcourir les différentes feuilles du fichier ""Export_SAP"" pour déterminer celle qui va servir à la mise à jour des carnets." & Chr(10) & Chr(10) & _
"Une boîte de dialogue vous demandera, ensuite, de sélectionner cette feuille en entrant son numéro." & Chr(10) & Chr(10) & _
"À l'issue de votre choix, la feuille sera traitée par la macro afin de ne conserver que les informations utiles à la mise à jour des carnets.", Buttons:=vbInformation
For z = 1 To nbSheetExportSAP 'nbSheetExportSAP = nb total de sheets dans le classeur
TabNameSheets(z) = ExportSAP.Worksheets.Item(z).Name 'TabNameSheets = tableau qui stocke le nom des sheets
listeSheets = "Feuille numéro " & z & " = " & TabNameSheets(z) & Chr(10) & listeSheets
Next
Do
ChoixSheet = Application.InputBox(prompt:="Entrez le numéro de la feuille qui servira à importer les données SAP dans les carnets" & Chr(10) & Chr(10) & listeSheets, Title:="Entrer le numéro de la feuille", Type:=1) 'je ne peux même pas afficher mon InputBox à cause d'une erreur d'incompatibilité
'If ChoixSheet = False Then
'MsgBox "erreur !"
'End If
Loop While IsEmpty(ChoixSheet) Or ChoixSheet = 0 Or ChoixSheet > nbSheetExportSAPLa variante de code ci-dessous fonctionne mieux avec avec la fonction InputBox, mais plante dès que l'opérateur clique sur la croix ou annuler ou OK sans entrer un chiffre. Par contre, la gestion des erreurs si le numéro de sheets = 0 ou est supérieur au nombre total de sheets contenues dans le classeur, fonctionne.
' boucle pour remplir le tableau de toutes les feuilles présentes dans le classeur
MsgBox prompt:="Veuillez parcourir les différentes feuilles du fichier ""Export_SAP"" pour déterminer celle qui va servir à la mise à jour des carnets." & Chr(10) & Chr(10) & _
"Une boîte de dialogue vous demandera, ensuite, de sélectionner cette feuille en entrant son numéro." & Chr(10) & Chr(10) & _
"À l'issue de votre choix, la feuille sera traitée par la macro afin de ne conserver que les informations utiles à la mise à jour des carnets.", Buttons:=vbInformation
For z = 1 To nbSheetExportSAP 'nbSheetExportSAP = nb total de sheets dans le classeur
TabNameSheets(z) = ExportSAP.Worksheets.Item(z).Name
listeSheets = "Feuille numéro " & z & " = " & TabNameSheets(z) & Chr(10) & listeSheets
Next
Do
ChoixSheet = InputBox(prompt:="Entrez le numéro de la feuille qui servira à importer les données SAP dans les carnets" & Chr(10) & Chr(10) & listeSheets, Title:="Entrer le numéro de la feuille")
If ChoixSheet = False Then
MsgBox "erreur !"
End If
Loop While IsEmpty(ChoixSheet) Or ChoixSheet = 0 Or ChoixSheet > nbSheetExportSAPJe m'excuse de ne vous donner qu'un bout de code, mais j'espère qu'il sera suffisant pour vos permettre de mettre le doigt sur ce qui cloche.
Quand je vois comment je bataille pour un InputBox, je n'ose même pas imaginer les UserForms !
Merci d'avance pour vos contributions.
Bonne matinée à tous.
pourquoi ne pas utiliser une zone de liste déroulante dans une userform avec contrôle de saisie
voir fichier joint
Bonjour Guillaud.
Merci pour ta réponse.
Je vais regarder ce que tu m'as envoyé, mais j'avoue être réticent à l'utilisation des UserForms.
Je trouve ça trop compliqué pour l'instant.
je passe déjà des heures pour un InputBox alors pour des Userforms, je n'ose même pas imaginer.
J'en ai déjà créé quelques uns et, s'ils fonctionnent, il y a toujours un truc qui "foire".
J'avais envie de rester assez basique car mes connaissances sont pour l'heure assez basiques.
Merci encore pour ton aide.
pour t'aider le plus simple c'est de joindre ton fichier avec qq explications
je te propose cette procedure
Public Sub test()
Dim rep As String
Dim sortie As Boolean
sortie = False
While Not sortie
rep = InputBox("donner un nom de feuille", "Nom de feuille")
If IsNumeric(rep) Then
sortie = True
End If
Wend
End Sub
Bonjour Guillaud.
Merci pour ton bout de code qui est une très bonne situation de contournement à mon problème.
Je l'ai intégré dans ma macro et ça tourne parfaitement.
Par contre, je vais tenter de l'adapter avec la méthode InputBox plutôt que la fonction car la solution que tu me proposes ne me permet pas de gérer l'annulation et je reste en boucle fermée sans pouvoir en sortir.
En tout cas, ça me fait avancer.
Merci.
Bonne matinée.
voici une nouvelle idée trouver sur internet à adpter
Private Sub CommandButton1_Click()
reponse = InputBox("tapez votre texte", "Essai bouton Annuler", " ")
If reponse = "" Then ' commentaire :chaine vide
MsgBox "vous avez appuyé annuler"
ElseIf reponse = " " Then ' commentaire : chaine contenant un espace
MsgBox "vous avez appuyé sur OK sans information"
reponse = ""
Else
MsgBox "vous avez écrit " & Trim(reponse)
End If
End Sub
Bonjour Guillaud.
Ça c'est rigolo car c'est exactement ce que j'ai trouvé sur internet ce matin !
Je l'ai intégré dans la matinée et ça marche super bien.
J'allais poster ma réponse pour faire avancer les choses et aider peut-être des futurs utilisateurs intéressés.
Voici comment j'ai tourné mon code:
' boucle pour contraindre l'utilisateur à entrer un n° de sheet valide
' On teste si le usr a appuyé sur annuler ou sur la croix. Par contre appuyer sur annuler ou sur la croix
' est différent de cliquer sur OK sans avoir entré de valeur.
' Lorsque l'on appuie sur annuler ou sur la croix la variable InputBox prend la valeur "FAUX" (false)
' Si le usr clique sur OK sans avoir entré de valeur, la variable InputBox prend la valeur "" (vide)
' On peut donc discriminer les "endroits" où clique le USR
SortieWhile = False
While SortieWhile = False
ChoixSheet = Application.InputBox(prompt:="Entrez le numéro de la feuille qui servira à importer les données PLT dans les carnets" & Chr(10) & Chr(10) & listeSheets, Title:="Entrer le numéro de la feuille", Type:=1 + 2) 'ATTENTION, ici il s'agit de la MÉTHODE InputBox
If IsNumeric(ChoixSheet) = True Then 'si la variable STRING ChoixSheet peut être évaluée comme un nombre (ça signifie que le user a bien entré une valeur) alors
SortieWhile = True 'SortieWhile = true et on peut sortir de la boucle
End If
If ChoixSheet = "Faux" Then 'si la variable STRING ChoixSheet est "FAUX" détecte si le bouton annuler ou la croix ont été cliquées. Permet de différencier un clic sur croix ou annuler d'un clic sur ok sans avoir entré de valeur
ExportSAP.Close savechanges = False
Exit Sub
End If
WendLes petites difficultés que j'ai rencontrées:
- Pourquoi le type = 1 + 2 ? (On a le droit de spécifier 2 types différents avec le signe + ? donc ici, nombre + chaîne (ce qui semble logique)
- Je ne savais pas qu'on pouvait écrire un if sans end if (visiblement si l'instruction then est directement placée sur la même ligne)
- Il faut tester si la variable InputBox est "faux" et non "False" (je l'ai su en vérifiant la variable avec l'espion: pas facile ces subtilités !)
En tout cas, merci pour ce petit up, Guillaud !
Bonne journée !