Comment utiliser InputBox en VBA dans Excel
InputBox affiche une petite fenêtre qui pose une question à l’utilisateur et renvoie ce qu’il a tapé, pour qu’une macro VBA s’en serve ensuite. Elle suffit à demander un montant, une date ou un nom sans créer de formulaire, en une seule ligne de code.
Excel en propose pourtant deux versions, qui se ressemblent à l’écran mais ne réagissent pas de la même façon. La fonction InputBox du langage VBA renvoie toujours du texte, alors que la méthode Application.InputBox d’Excel sait exiger un nombre ou une plage de cellules. Les sections qui suivent montrent les deux sur un classeur de notes de frais, jusqu’à une macro complète qui enregistre une dépense.
InputBox VBA
Le classeur de l’article, pour refaire chaque étape sur les mêmes données.
Afficher une InputBox pour demander une valeur
La fonction InputBox prend trois arguments utiles, la question, le titre de la fenêtre et la valeur proposée, puis renvoie la réponse sous forme de texte. La macro s’arrête sur cette ligne tant que l’utilisateur n’a cliqué ni sur OK ni sur Annuler, et reprend ensuite avec sa réponse.
Dim saisie As Stringsaisie = InputBox("Montant de la dépense, en euros ?", "Nouvelle dépense", "0")

Proposer une valeur par défaut
Le troisième argument remplit d’avance le champ de saisie, et la valeur arrive sélectionnée, si bien qu’il suffit de taper pour la remplacer. Valider sans y toucher la renvoie telle quelle, ce qui fait gagner une saisie quand la réponse est presque toujours la même, comme la date du jour.

Aller à la ligne dans le message
Le message d’une InputBox tient sur une ligne tant qu’on ne lui demande rien d’autre. La constante vbCrLf, placée entre deux morceaux de texte, le coupe en deux lignes, et la même écriture vaut pour le message d’une MsgBox.
saisie = InputBox("Montant de la dépense, en euros ?" & vbCrLf & _"Laisse vide pour arrêter.", "Nouvelle dépense")
Récupérer la valeur d’une InputBox dans une variable
InputBox renvoie toujours du texte, même quand l’utilisateur tape un nombre, et ce texte doit être converti avant de servir à un calcul ou à une date. La conversion se fait après un contrôle, parce qu’une réponse inattendue arrêterait la macro sur une erreur.
Convertir la réponse en nombre avec CDbl
IsNumeric dit d’abord si le texte se lit comme un nombre, puis CDbl le convertit en tenant compte de la virgule décimale française. La fonction Val, que beaucoup d’exemples emploient, ne connaît que le point, et elle transforme « 12,5 » en 12 sans le moindre avertissement.
If Not IsNumeric(saisie) Then Exit Submontant = CDbl(saisie) ' 12,5 donne 12,5, là où Val donnerait 12
Vérifier une date avec IsDate
Pour une date, IsDate joue le même rôle que IsNumeric, et CDate fait ensuite la conversion. IsDate refuse une date qui n’existe pas, comme le 31 février, ce qui évite d’écrire dans la feuille une valeur qu’Excel ne saurait pas trier ni additionner.
Gérer le bouton Annuler d’une InputBox
InputBox renvoie une chaîne vide aussi bien quand l’utilisateur clique sur Annuler que lorsqu’il valide un champ vide, si bien qu’un simple test sur "" ne sait pas les distinguer. La fonction StrPtr, elle, renvoie 0 pour la réponse d’un Annuler et un autre nombre pour une chaîne vide validée.
saisie = InputBox("Montant de la dépense, en euros ?", "Nouvelle dépense")If StrPtr(saisie) = 0 Then Exit Sub ' AnnulerIf saisie = "" Then MsgBox "Aucun montant saisi." ' OK sur un champ vide
Quitter la macro dès l’Annuler est la réponse la plus sûre, puisque l’utilisateur vient justement de dire qu’il ne voulait pas continuer. Un Exit Sub placé juste après la boîte évite ainsi d’enchaîner les questions suivantes sur une réponse vide.
Contrôler la saisie avec Application.InputBox
Application.InputBox est la version d’Excel, et son argument Type fixe ce que la boîte accepte. Elle refuse tout seule une réponse du mauvais type, ce qui épargne à la macro les contrôles de la fonction InputBox.
| Type | Ce que la boîte accepte, d’après l’aide de Microsoft |
|---|---|
| 0 | Une formule |
| 1 | Un nombre |
| 2 | Du texte |
| 4 | Une valeur logique, Vrai ou Faux |
| 8 | Une référence de cellule, renvoyée comme une plage |
| 16 | Une valeur d’erreur, comme #N/A |
| 64 | Un tableau de valeurs |
Exiger un nombre avec Type:=1
Avec Type:=1, la boîte renvoie directement un nombre, et une réponse comme « douze » ou « 12 jours » fait afficher « Le nombre n’est pas valide. » sans refermer la boîte. L’utilisateur corrige alors sa saisie, et la macro ne reçoit jamais de texte.

Dim montant As Variantmontant = Application.InputBox("Montant de la dépense, en euros ?", "Nouvelle dépense", Type:=1)

La boîte accepte en effet une formule, puisqu’Application.InputBox évalue ce qu’on y tape comme une cellule le ferait. C’est aussi pourquoi un mot qui ressemble à un nom, comme « abc », fait afficher le message d’erreur de formule d’Excel au lieu de celui du nombre.
Faire sélectionner une plage avec Type:=8
Type:=8 laisse l’utilisateur cliquer sur des cellules pendant que la boîte est ouverte, et renvoie une plage, qu’on range avec Set. Annuler renvoie alors Faux, que Set ne sait pas ranger dans une variable Range, d’où l’erreur 424, « Objet requis », qu’un On Error Resume Next intercepte.
Dim plage As RangeOn Error Resume NextSet plage = Application.InputBox("Sélectionne la plage des montants", "Plage des montants", Type:=8)On Error GoTo 0If plage Is Nothing Then Exit Sub ' Annuler

Tester Annuler, qui renvoie Faux
Quel que soit le type demandé, Annuler renvoie la valeur logique Faux, et c’est là que la plupart des exemples se trompent. Rangé dans une variable String, ce Faux devient le texte « Faux », que la macro enregistrerait comme une vraie réponse.
Le test If montant = False tombe dans un autre piège, car VBA tient 0 pour égal à Faux, si bien qu’un montant nul passerait pour un Annuler. Le test sûr porte sur le type de la réponse, avec TypeName(montant) = "Boolean", qui ne vaut Vrai que pour un Annuler.
Poser une question Oui ou Non avec MsgBox
InputBox n’a pas de boutons Oui et Non, et une question fermée passe plutôt par MsgBox avec la constante vbYesNo. La fonction renvoie alors vbYes ou vbNo selon le bouton cliqué, et la touche Entrée choisit Oui, le premier bouton.
If MsgBox("Enregistrer cette dépense ?", vbYesNo + vbQuestion, "Confirmation") = vbNo Then Exit Sub

Enregistrer une dépense avec InputBox, exemple complet
La macro qui suit réunit tous ces gestes dans un vrai usage. Elle demande la date d’une dépense, puis son montant, fait confirmer la saisie et l’écrit sous la dernière ligne de la feuille Dépenses du fichier d’exemple.
Sub Ajouter_depense()Dim saisie As StringDim montant As VariantDim feuille As WorksheetDim ligne As LongSet feuille = ThisWorkbook.Worksheets("Dépenses")' La date, proposée à aujourd'huisaisie = InputBox("Date de la dépense ?", "Nouvelle dépense", Format(Date, "dd/mm/yyyy"))If StrPtr(saisie) = 0 Then Exit SubIf Not IsDate(saisie) ThenMsgBox saisie & " n'est pas une date.", vbExclamation, "Nouvelle dépense"Exit SubEnd If' Le montant, qu'Excel refuse tant que ce n'est pas un nombremontant = Application.InputBox("Montant de la dépense, en euros ?", "Nouvelle dépense", Type:=1)If TypeName(montant) = "Boolean" Then Exit Sub' La confirmation avant d'écrireIf MsgBox("Enregistrer " & Format(montant, "0.00") & " € le " & saisie & " ?", _vbYesNo + vbQuestion, "Confirmation") = vbNo Then Exit Subligne = feuille.Cells(feuille.Rows.Count, "A").End(xlUp).Row + 1feuille.Cells(ligne, "A").Value = CDate(saisie)feuille.Cells(ligne, "B").Value = montantEnd Sub
- 01Ouvre le classeur d’exemple, puis l’éditeur VBA avec Alt+F11.
- 02Choisis Module dans le menu Insertion, puis colle la macro dans la fenêtre qui s’ouvre.
- 03Enregistre le classeur au format Classeur Excel (prenant en charge les macros).
- 04Reviens dans Excel, appuie sur Alt+F8, choisis Ajouter_depense et clique sur Exécuter.
La date arrive proposée au jour même, le montant ne passe que s’il est un nombre, et Annuler ou Non à n’importe quelle étape ne laisse aucune trace dans la feuille. Un montant de 0 est bien enregistré, parce que la macro teste le type de la réponse et non sa valeur.

Une date impossible est refusée avant même la question du montant, par un message qui la cite, et la macro s’arrête sans rien écrire.

Le détail de l’installation, et de la marque qui bloque les macros d’un fichier téléchargé, se trouve dans l’article Comment installer une macro dans Excel.
La ligne suivante se trouve par End(xlUp) depuis le bas de la colonne A, c’est pourquoi rien d’autre ne doit s’écrire sous le tableau dans cette colonne. Une note ou un total placé plus bas serait pris pour la dernière dépense, et la macro écrirait sous lui.
Remplacer InputBox par un formulaire quand elle ne suffit plus
InputBox ne pose qu’une question à la fois, ne masque pas ce que l’on tape et ne propose aucune liste de choix. Dès qu’il faut plusieurs champs, un mot de passe ou un choix dans une liste, un formulaire VBA, le UserForm, prend le relais avec ses zones de texte et ses listes déroulantes.
Pour débuter, le cas pratique sur les variables et les messages fait écrire une première macro avec InputBox et MsgBox, corrigé compris. Les articles sur les conditions If en VBA et sur les boucles For montrent ensuite comment réagir à la réponse ou répéter la question.
Questions fréquentes
InputBox est une fonction du langage VBA, qui renvoie toujours du texte et une chaîne vide sur Annuler. Application.InputBox est une méthode d’Excel, qui contrôle le type de la réponse avec son argument Type, accepte une sélection de cellules et renvoie Faux sur Annuler.
InputBox ne sait afficher qu’un champ de saisie, et une liste de choix demande un formulaire VBA avec une liste déroulante, le contrôle ComboBox. Quand le choix se fait dans la feuille, une liste déroulante dans la cellule, créée par la validation des données, évite même d’écrire une macro.
Non, InputBox affiche toujours ce que l’on tape en clair. Un mot de passe se saisit dans la zone de texte d’un formulaire VBA, dont la propriété PasswordChar remplace chaque caractère par un astérisque ou tout autre symbole choisi.
Une macro est une suite d’instructions qui automatise une tâche dans Excel, et VBA est le langage dans lequel on l’écrit. L’enregistreur de macros écrit ce code à ta place, et InputBox fait partie de ce qu’on ajoute à la main pour dialoguer avec l’utilisateur, comme l’explique notre guide des macros Excel et du VBA.