Variable single dans inputbox et virgule du pavé numérique

Bonjour,

Je tourne en rond... Je vais essayer d'être claire.

Ma macro fait apparaître une inputbox dans laquelle l'utilisateur doit rentrer une masse (avec une virgule).
Je souhaite rendre obligatoire le remplissage de ce champ et que, donc, il soit impossible de cliquer sur le bouton "annuler".
Je souhaite interdire qu'on rentre une masse genre "23.7g". Il faut impérativement que ce soit une valeur numérique.

Voici ce que j'ai comme base :

Sub TestMasse_()

Dim Masse As Single

On Error Resume Next
Do While Masse < 10
Masse = InputBox("Ici la Masse :")
Loop
msgbox "masse = " & Masse

End Sub


Avec ce code, je ne peux pas utiliser la virgule du pavé numérique.
Si je ne déclare pas ma variable en Single, je peux utiliser cette virgule mais à ce moment-là, je peux aussi rentrer n'importe quoi. J'ai donc essayé avec application.inputbox :

Masse = Application.InputBox("Ici la Masse :", , , , , , , 1)


Mais dans ce cas, si je ne rentre rien et appuie sur "ok", j'ai une erreur "la formule que vous avez tapé contient une erreur [...]" qui n'est pas bien belle et risque d'en perturber certains (après tout, ce n'est pas une formule qu'on doit inscrire...)

Donc, ma question : comment, si c'est possible, utiliser une inputbox simple, entrer une valeur numérique et avec la virgule du pavé numérique.
Je précise que j'en suis arrivée là après des heures de recherches (j'ai essayé des tas de variantes sans plus de succès) et que si la réponse m'est passée sous le nez, je ne suis pas encore assez fortiche pour le voir.

Merci à tous ceux qui auront la patience de me lire et de me répondre.
A bientôt
Mado.

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Bonjour,

    Tu pourrais utiliser les expressions régulières (les regex) pour vérifier que la valeur entrée est bien un nombre
    Par exemple, la regex suivante fonctionne uniquement avec des valeurs du style :

    4646
    456,878
    .5646
    0,4564
    887.56545

    Regex:

    ^(([0-9]+(\.|,)([0-9]+\b)?|\.[0-9]))|^([0-9]*)$


    Voici des explications et des exemples pour la mise en pratique des regex dans Excel
    https://www.commentcamarche.net/faq/41005-vba-initiation-aux-expressions-rationnelles

    Ou encore :
    https://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops

    1. Modérateur
      Comme tu peux le voir j'ai laissé la possibilité d'utiliser la Virgule (,) ou le POINT décimal (.)
      Si tu ne veux que la virgule, il suffit de retirer le "\.|" qui se trouve au "presque" début de la regex.

      ^(([0-9]+(,)([0-9]+\b)?|\.[0-9]))|^([0-9]*)$
  2. Bonjour et merci de l'intérêt porté à ma question.

    Mais... Ouh là ! Ca va faire mal. J'avoue, je n'ai pas encore tout lu mais j'ai quand même été jusqu'à :

    "Dans votre éditeur VBA, dans le menu outils, allez dans références. Parcourez les différentes références et cochez : "Microsoft vbscript regular expression 5.5" "

    Ca, c'est fait.

    Je n'ai pas l'habitude que tout me tombe tout cuit dans le bec mais pour une fois, si je pouvais avoir un tuyau... J'en fait quoi du Regex
    ^(([0-9]+(\.|,)([0-9]+\b)?|\.[0-9]))|^([0-9]*)$ ?

    En tout cas, merci beaucoup pour votre sollicitude. A vous lire (mais demain, maintenant).
    1. Modérateur
      Voici un exemple :
      Sub exemple()
        Dim unevaleur As String
              unevaleur = "13565,45"
      
        If test_si_nombre(unevaleur) Then
          MsgBox "C'est un nombre"
        Else
          MsgBox "Ce n'est pas un nombre"
        End If
       
      End Sub
      


      Et la fonction qui va avec (celle qui contient la regex)
      
      Private Function test_si_nombre(ByVal valeuratester) As Boolean
      'Dans votre éditeur VBA, dans le menu outils, allez dans références. et cochez : '
       '                  "Microsoft vbscript regular expression 5.5""
      
       Dim reg As Object
       Set reg = CreateObject("vbscript.regexp")
      
       'La regex :
       reg.Pattern = "^(([0-9]+(,)([0-9]+\b)?|\.[0-9]))|^([0-9]*)$"
      
       'Renvoie True ou False en fonction du test
       test_si_nombre = reg.test(valeuratester)
      
      End Function
      

      1. Modérateur
        Bonjour refcemad,
        Salutations à Jordane45,

        Une autre possibilité avec une fonction de test et un peu de récursivité :

        Sub TestMasse_()
        Dim Masse As Single
           Do While Masse < 10
              Masse = F_Masse()
           Loop
           MsgBox "masse = " & Masse
        End Sub
        
        Function F_Masse() As Single
        Dim masseTest
           'remplace le . par ,
           masseTest = Replace(InputBox("Ici la Masse :"), ".", ",")
           If Not IsNumeric(masseTest) Then masseTest = F_Masse()
           F_Masse = masseTest
        End Function


        EDIT : oups!!!

        Avant, j'arrivais jamais à finir mes phrases... mais maintenant je