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

Fermé
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 - 4 déc. 2015 à 00:38
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 4 déc. 2015 à 12:59
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

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
4 déc. 2015 à 00:54
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




0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
4 déc. 2015 à 00:55
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]*)$
0
refcemad Messages postés 39 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 10 mai 2018 1
4 déc. 2015 à 01:36
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).
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
4 déc. 2015 à 09:28
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

0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
Modifié par pijaku le 4/12/2015 à 13:01
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
0