VBA / InputBox

baissaoui Messages postés 497 Date d'inscription jeudi 2 septembre 2021 Statut Webmaster Dernière intervention 22 mars 2024 - 11 juil. 2022 à 12:47

Introduction

Cette fiche pratique fait suite à la discussion initiée par papou9 sur le forum Programmation/VB/VBA ; à savoir : « Interrompre une macro pour entrer une donnée ».

Nous avons plusieurs boîtes nous permettant de dialoguer avec l'utilisateur. MsgBox, InputBox, UserForm, etc. Pour répondre à une question utile au code, réponse qui ne serait pas oui, non, ou autre, l'InputBox est la boîte adéquate. En effet, comme le souligne la définition du site Msdn (Microsoft) : Affiche un message dans une boîte de dialogue, attend que l'utilisateur tape du texte ou clique sur un bouton, puis retourne le contenu de la zone de texte sous la forme d'une chaîne.

Nous allons, dans cette fiche pratique, dans un premier temps, décrire les différents paramètres applicables à la fonction Inputbox. Nous allons voir ensuite quelques exemples d'utilisation et enfin nous évoquerons sa soeur jumelle d'Excel , la méthode InputBox (méthode et plus fonction ;-)) : Application.InputBox.

Vidéo

"FAQ : VBA / InputBox"

InputBox - Les paramètres

Voyons tout d'abord la syntaxe de cette fonction Visual Basic :

InputBox ( prompt [, title ] [, default ] [, xpos ] [, ypos ] [, helpfile ] [, context ] )

Les paramètres indiqués entre crochets ([ ]) sont optionnels. Il n'y a donc qu'un unique paramètre obligatoire : le paramètre Prompt.

Prompt (Message)

Il s'agit du message que vous adressez à l'utilisateur afin de lui formuler votre demande. Ce paramètre est requis (obligatoire) et doit être de type String (chaîne de caractères).

Nota : De manière générale, il convient de poser une question (ou d'adresser un message à l'utilisateur) nécessitant de sa part la saisie d'une réponse autre que oui ou non. Dans le cas contraire, il conviendra d'utiliser une MsgBox.

Exemple :

Dim Nom As String
Nom = InputBox("Saisie de votre NOM : ")

Title (Titre)

Il s'agit ici du premier paramètre optionnel. Comme son nom l'indique, il s'agit d'ajouter un titre à la boîte de dialogue. Ce titre sera une chaîne de caractères (type : String) et sera inséré dans la barre de titre de notre boîte de dialogue.

Exemple :

Dim Nom As String
Nom = InputBox("Saisie de votre NOM : ", "NOM")

Nota : Ce paramètre étant optionnel, s'il est omis, par défaut s'affichera dans la barre de titre le nom de l'application utilisée. (cf image dans le paragraphe Prompt ci-dessus).

default (Valeur par défaut)

La boîte de dialogue InputBox est composée de 4 parties : la fenêtre, la barre de titre, un TextBox et des boutons. Ici, default va afficher, dès son lancement, une valeur par défaut dans le TextBox.

Exemple :

Dim Nom As String
Nom = InputBox("Saisie de votre NOM : ", "NOM", "DUPOND")

xpos & ypos

Ces deux paramètres, optionnels, nous donnent la possibilité de placer notre InputBox ou nous le souhaitons. Il s'agit du positionnement horizontal (xpos) et vertical (ypos) et plus précisément la distance, en pixels, séparant le bord gauche (ou haut) de l'InputBox du bord gauche (ou haut) de l'écran ; de l'écran, pas de l'application.

Exemple :

Dim Nom As String
Nom = InputBox("Saisie de votre NOM : ", "NOM", "DUPOND", 100, 100)

helpfile (fichier d'aide) & context (aide contextuelle)

Ces deux paramètres optionnels sont indissociables. Si vous en référencez un, il vous faudra référencer l'autre sous peine d'obtenir une erreur d'exécution 5 : Argument ou appel de procédure incorrect.

Helpfile : sert à identifier le fichier d'aide. Il s'agit donc soit de son nom (exemple : "DEMO.HLP") soit de son chemin d'accès (exemple : "c:Help.chm").
context : Il s'agit du numéro de l'aide contextuelle, attribuée, par l'auteur de l'aide, à la rubrique d'aide appropriée.

Sous Microsoft Office Excel 2007 par exemple, si ces deux paramètres sont correctement référencés, un bouton supplémentaire « Aide » sera ajouté à votre boîte de dialogue. Ce bouton correspond à un appui sur la touche F1 depuis votre application.

Exemple :

Dim Nom As String
Nom = InputBox("Saisie de votre NOM : ", "NOM", , , , "c:Help.chm", 0)

Ou :

Dim Nom As String
Nom = InputBox("Saisie de votre NOM : ", "NOM", "DURAND", 200, 200, "DEMO.HLP", 10)

Paramètres dans des variables

Comme toutes les fonctions VB, les paramètres peuvent être stockés dans des variables. Attention toutefois à en définir le bon type.

Voici un exemple qui passe tous les paramètres par des variables intermédiaires :

Dim Nombre As Integer 
Dim Message As String, Titre As String, ParDefaut As String, PosX As Integer, PosY As Integer, Aide As String, NumAide As Long
Message = "Entrez un nombre entier : "
Titre = "Saisie numérique"
ParDefaut = "13"
PosX = 250
PosY = 360
Aide = "c:Help.chm"
NumAide = 3152
Nombre = InputBox(Message, Titre, ParDefaut, PosX, PosY, Aide, NumAide)

Nota : Ici nous avons saisi, par défaut, une valeur de type String : ParDefaut = "13". Or, notre variable chargée de stocker le résultat de l'InputBox est Integer. Nous nous attendrions donc à avoir un retour d'erreur Mauvais type. Et bien non, dans ce cas, VB sait reconnaitre que la valeur saisie est de numérique. Pour s'en convaincre, il suffit d'ajouter, en fin du code précédent :

MsgBox Nombre * 2

InputBox - les boutons

Vous avez trois boutons différents possibles sur l'InputBox :

Le bouton OK

Lorsque l'utilisateur appuie sur ce bouton (ou tape la touche Entrée), la fonction InputBox retourne tout ce que contient le TextBox. Si rien n'a été saisi, elle retourne la chaîne : "".

Le bouton ANNULER

Lorsque l'utilisateur appuie sur ce bouton, la fonction InputBox retourne la chaîne de longueur nulle : "".

Le bouton Aide

Ouvre l'aide de l'application, ou l'aide correspondante au fichier et context de l'aide, définis dans les paramètres. Le clic sur le bouton aide vous amène à :

Les erreurs fréquentes

Sachez qu'avec cette fonction, il vous faudra traiter tout ce que l'utilisateur peut faire comme boulette. De l'erreur de saisie à l'erreur d'incompréhension en passant par l'erreur volontaire... Il vous faudra, à coup sûr, un gestionnaire d'erreur adapté et intégré à votre code.

Mauvais type saisi

Erreur d'exécution '13' Incompatibilité de type
Ce message d'erreur est dû au fait que vous demandez à l'utilisateur un certain type de donnée (que vous déclarez dans vos variables) et qu'il en saisi un différent. Par exemple, vous demandez la saisie d'un nombre entier et lui saisit un nombre décimal.

Exemple :

Dim Nombre As Integer ' Ici on sait que l'on demande un Integer
Nombre = InputBox("Entrez un nombre entier : ", "Saisie numérique")

Si l'utilisateur tape : 13.5 et appuie sur le bouton OK, un message d'erreur apparaitra.
Même chose, même sanction, si l'utilisateur saisi une lettre ou même ne saisi rien et/ou appuie sur le bouton ANNULER.

Comment contourner ?
A l'aide d'un traitement d'erreur, tout simplement.

Exemple :

Dim Nombre As Integer
'En cas d'erreur, on va à l'étiquette MauvaisType
On Error GoTo MauvaisType 
Nombre = InputBox("Entrez un nombre entier : ", "Saisie numérique")

'Ici le traitement souhaité, par exemple
Select Case Nombre
    Case Is >= 18: MsgBox "Mention très bien"
    Case Is >= 16: MsgBox "Mention bien"
    Case Is >= 14: MsgBox "Mention passable"
    Case Is >= 10: MsgBox "Pas de mention"
    Case Is >= 8: MsgBox "Mention pas bien"
    Case Is >= 6: MsgBox "Mention pas bien du tout"
    Case Else: MsgBox "Mention très nul"
End Select
Exit Sub 'Sortie à ne pas oublier pour ne pas traiter MauvaisType

MauvaisType:
MsgBox "Vous n'avez pas saisi un nombre entier", vbCritical

Nombre de caractères

On le voit à sa taille, l'InputBox n'est pas faite pour saisir de longues données. En fait, la saisie y est limité à 255 caractères. Qui plus est, la fonction InputBox n'en renvoie que 254. Attention donc à ne pas demander de trop « longues » données par cet intermédiaire.

Variable obligatoire

La fonction InputBox a besoin d'une variable pour y être stockée. Contrairement à la MsgBox qui peut s'en passer, sans variable vous aurez le message d'erreur :
Erreur de compilation
Attendu : =

Exemple à ne pas faire :

InputBox("Entrez un nombre entier : ", "Saisie numérique")

Bouton ANNULER

On l'a vu précédemment, on ne peut pas annuler si le code demande un nombre. En effet, la fonction retournant un String ("" est une chaîne de caractères...) lors d'un clic sur ce bouton, nous obtiendrons l'erreur 13 incompatibilité de type.
Pour une variable déclarée As String, c'est différent. Si l'utilisateur annule, la variable contiendra bien une donnée : "". Or, cette donnée peut être primordiale pour le bon déroulement du reste de votre code.

Comment empêcher cela ?

En bouclant tant que la longueur de la chaîne renvoyée par la fonction est égale à zéro...
Comme ceci :

Exemple :

Dim Nom As String
Nom = InputBox("Entrer votre NOM :", "Saisie NOM")
Do While Len(Nom) = 0
    MsgBox "Cette donnée est obligatoire"
    Nom = InputBox("Entrer votre NOM :", "Saisie NOM")
Loop
MsgBox "Votre NOM est :" & Nom

Oui, ok me direz-vous. Mais cela engendre un problème supplémentaire. Si l'utilisateur, suite à un mauvais sort qu'on lui aurait lancé, ne voit que le bouton ANNULER, ma macro va tourner en boucle éternellement ?
Pour pallier à cela, nous allons y insérer un compteur et une porte de sortie.

Exemple :

Dim Nom As String, Cpt As Integer
Cpt = 1
Nom = InputBox("Entrer votre NOM :", "Saisie NOM")
Do While Len(Nom) = 0
    Cpt = Cpt + 1
    If Cpt = 4 Then GoTo TropBetePourContinuer
    MsgBox "Cette donnée est obligatoire. Plus que " & 4 - Cpt & " essais."
    Nom = InputBox("Entrer votre NOM :", "Saisie NOM")
Loop
MsgBox "Votre NOM est :" & Nom
Exit Sub
TropBetePourContinuer:
MsgBox "Veuillez arrêter l'informatique."

Cas particulier - La méthode Application.InputBox

Les paramètres sont identiques à ceux de la fonction, avec l'ajout d'un dernier paramètre, le type. La syntaxe de cette méthode est donc :
InputBox ( prompt [, title ] [, default ] [, xpos ] [, ypos ] [, helpfile ] [, context ], Type)

Nous allons donc voir comment compléter ce paramètre nouveau.

Les différents types

Valeur Signification
0 Formule
1 Nombre
2 Texte (Chaîne)
4 Valeur logique (True ou False)
8 Référence de cellule, sous la forme d'un objet Range
16 Valeur d'erreur telle que #n/a
64 Matrice de valeurs
 

Exemples

Saisie numérique :
Reprenons ici notre code qui plantait, transposé avec la méthode InputBox de type := 1

Dim Nombre As Integer
Nombre = Application.InputBox("Entrez un nombre entier : ", "Saisie numérique", Type:=1)

Si vous saisissez des lettres en lieu et place d'un nombre, un message d'erreur vous est adressé, puis, vous retournez sous l'InputBox...
Message d'erreur :

Référence de cellule
Cette option nous permet la sélection de cellules grâce à la souris.

Exemple 1 :

Dim Plage As Range
      Set Plage = Application.InputBox("Sélectionnez une plage", "Sélection de cellules", Type:=8)
      MsgBox ("La plage que vous avez sélectionné est : " & Plage.Address)

Exemple 2 :
Même chose avec restitution dans une variable tableau :

Dim MonTab()As String
Dim Plage As Range
Dim i As Integer

Set Plage = Application.InputBox("Sélectionnez une plage", "Sélection de cellules", Type:=8)
MonTab = Split(Plage.Address, ",")
For i = 0 To UBound(MonTab)
    MsgBox MonTab(i)
Next i

Exemple 3 :
SOURCE.

Cet exemple utilise une méthode InputBox pour permettre à l'utilisateur de sélectionner une plage à transmettre à la fonction « MaFonction » définie par l'utilisateur, qui multiplie trois valeurs d'une plage et renvoie le résultat.
Sub Cbm_Value_Select()
   Dim rng As Range
   
   Set rng = Application.InputBox("Range:", Type:=8)
   If rng.Cells.Count <> 3 Then
     MsgBox "Length, width and height are needed -" & _
         vbLf & "please select three cells!"
      Exit Sub
   End If
   
   'Appel MyFunction
   ActiveCell.Value = MyFunction(rng)
End Sub


Function MyFunction(rng As Range) As Double
   MyFunction = rng(1) * rng(2) * rng(3)
End Function

Une fonction qui vérifie la saisie

Cette fonction utilise l'InputBox et permet de ne valider la saisie que lorsque celle-ci est contenue dans une plage de cellule d'une feuille de votre classeur.
Attention la plage :

  • ne doit comporter qu'une ligne ou une colonne. A éviter : Range("A1:B12")...
  • ne doit pas comporter de cellule vide ==> message d'abandon

Fonction utilisant l'inputbox :

  • clic sur OK sans saisie ==> relance l'inputbox
  • clic sur annuler ==> retourne le message d'annulation
  • mauvaise saisie ==> relance l'inputbox

PARAMETRES :

  • Wsh (Worksheet): Feuille ou sont situées les données permettant la vérification de la saisie
  • rngValues (String) : l'adresse du Range ou sont situées les données (soit sur 1 ligne, soit sur 1 colonne)
  • ForceMajuscules (Boolean) : si True transforme les saisies en Majuscules
  • strMessage (String / Optional) : le message d'abandon par l'utilisateur

ATTENTION : utilise la fonction Funct_Dimension

Private Function Funct_MyInputBox(Wsh As Worksheet, rngValues As String, Optional ForceMajuscules As Boolean, Optional strMessage As String) As String
'Fonction utilisant l'inputbox.
    'clic sur OK sans saisie ==> relance l'inputbox
    'clic sur annuler ==> retourne le message d'annulation
    'mauvaise saisie ==> relance l'inputbox
'PARAMETRES :
    'Wsh (Worksheet): Feuille ou sont situées les données permettant la vérification de la saisie
    'rngValues (String) : l'adresse du Range ou sont situées les données (soit sur 1 ligne, soit sur 1 colonne)
    'ForceMajuscules (Boolean) : si True transforme les saisies en Majuscules
    'strMessage (String / Optional) : le message d'abandon par l'utilisateur
'ATTENTION : utilise la fonction Funct_Dimension

Dim bon As Boolean, entree As String, MyArray As Variant, i As Long, Dimens As Byte, Valeur As String

    MyArray = Wsh.Range(rngValues).Value
    If UBound(MyArray, 1) > 1 And UBound(MyArray, 2) > 1 Then
        MsgBox "Plage non valide (toléré : 1 ligne ou 1 colonne)"
        Funct_MyInputBox = strMessage: Exit Function
    End If
    Dimens = Funct_Dimension(MyArray)
    Do While Not bon
        entree = InputBox("Enter your Country code", "Country code")
        If StrPtr(entree) = 0 Then Funct_MyInputBox = strMessage: Exit Function
        If entree <> "" Then
            entree = IIf(ForceMajuscules, UCase(entree), entree)
            If Dimens = 1 Then
                For i = LBound(MyArray, Dimens) To UBound(MyArray, Dimens)
                    Valeur = IIf(ForceMajuscules, UCase(MyArray(i, 1)), MyArray(i, 1))
                    If Valeur = "" Then Funct_MyInputBox = strMessage: Exit Function
                    If Valeur = entree Then
                        bon = True: Exit For
                    End If
                Next i
            Else
                For i = LBound(MyArray, Dimens) To UBound(MyArray, Dimens)
                    Valeur = IIf(ForceMajuscules, UCase(MyArray(1, i)), MyArray(1, i))
                    If Valeur = "" Then Funct_MyInputBox = strMessage: Exit Function
                    If Valeur = entree Then
                        bon = True: Exit For
                    End If
                Next i
            End If
        End If
    Loop
    Funct_MyInputBox = IIf(ForceMajuscules, UCase(entree), entree)
End Function

Private Function Funct_Dimension(Arr As Variant) As Byte
'retourne la dimension la plus grande de l'Array Arr
'si pas de "plus grande" dimension retourne 1 par défaut
    Select Case True
        Case UBound(Arr, 1) > UBound(Arr, 2)
            Funct_Dimension = 1
        Case UBound(Arr, 2) > UBound(Arr, 1)
            Funct_Dimension = 2
        Case Else
            Funct_Dimension = 1
    End Select
End Function

Exemple de code appelant cette fonction :

Sub AppelInputBox()
Dim Feuille As Worksheet, MyString As String

    Const strRANGE As String = "B1:F1"                          'A ADAPTER
    Const MSG_ANNULE As String = "Annulation utilisateur..."    'A ADAPTER
    Set Feuille = Worksheets("Feuil1")                          'A ADAPTER
    
    MyString = Funct_MyInputBox(Feuille, strRANGE, True, MSG_ANNULE)
    If MyString = MSG_ANNULE Then
        MsgBox MSG_ANNULE: Exit Sub
    Else
        MsgBox MyString
    End If
End Sub

Conclusion

N'oubliez pas d'adapter les traitements d'erreurs possibles vus lors de la fonction InputBox, à la méthode... L'utilisateur est capable de tout, même du pire !