Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

vivelesfrites

XLDnaute Nouveau
Bonjour à tous,

j'ai pris l'habitude de saisir mes décimaux <1 directement en tapant 'virgule' et les décimales. Par exemple ,3 donnera 0,3.

Le problème est que cette méthode fausse la mise en forme en % des valeurs. Par exemple dans une case formatée en % :
- saisir 0,3 donnera bien 0,3%
- saisir ,3 donnera 30%...


Je travaille sur une document devant être partagé, et comprenant beaucoup de pourcentages <1.
Je voudrais empêcher de pouvoir saisir des nombre en commençant par la virgule.

Je suppose qu'il faudra passer par du VBA, mais mes essais avec Worksheet_Change ne sont pas concluants...

Quelqu'un a eu déjà le cas, ou a une piste?

merci !
 

pierrejean

XLDnaute Barbatruc
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

Bonjour vivelesfrites

A tester (pour les cellules de A1 à C3 , a adapter)

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim flag As Boolean
If flag Then Exit Sub
If Target.Count <> 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
flag = True
If Not Intersect(Target, Range("A1:C3")) Is Nothing Then
  If Asc(Left(Target.Value, 1)) = 44 Then Target.Value = "0,"
End If
flag = False
End Sub
 

vivelesfrites

XLDnaute Nouveau
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

bonjour pierrejean,

J'avais pensé également à intercepter une saisie qui commence par une virgule, mais Excel semble mettre comme valeur de Target la valeur déjà transformée après la validation par Entrée.

En d'autres termes, si je modifie ainsi le code :

If Not Intersect(Target, Range("A1:C3")) Is Nothing Then

If Asc(Left(Target.Value, 1)) = 44 Then
Target.Value = "0,"
MsgBox "coucou"


End If
End If

le programme n'affichera jamais coucou.


Peut être est il possible d'intercepter la saise avant sa validation? J'ai regardé du côté des application.onkey, sans succès...

pour info, comment insérer un code dans un post? merci
 

vivelesfrites

XLDnaute Nouveau
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

j'ai l'impression que la condition "Asc(Left(Target.Value, 1)) = 44 " n'est jamais vraie, car quand je tape ',3' et que je valide, Target prend directement la valeur 0,3 et donc le code ne sera pas utilisé.

le problème c'est que taper 0,3 permet une bonne mise en forme des pourcentages (0,3 donne 0,3%), mais que taper ,3 donne 30%, sans qu'il soit apparemment possible en VBA de faire croire à Excel qu'il y a un zéro devant...

J'espère être à peu près clair!

à ta disposition pour plus de précisions

merci pour le temps consacré à mon problème
 

Pierrot93

XLDnaute Barbatruc
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

Bonjour,

regarde peut être ceci, fonction du format de la cellule, à adapter le cas échéant :
Code:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Static b As Boolean
With Target
    If .Count > 1 Or b Then Exit Sub
    If .NumberFormat = "0.00%" Then b = True: .Value = .Value / 100: b = False
End With
End Sub

bonne journée
@+
 

vivelesfrites

XLDnaute Nouveau
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

merci pierrot pour ce code.

Quand je mets une cellule en format %, et que je tape ",3" , la cellule se remplit avec "30%", alors que je voudrais avoir "0,3%".

peut être faut il chercher du côté de l'interception de la saisie avant de la valider, et donc avant qu'excel ne la multiplie par 100, mais je suis pas sûr...
 

Pierrot93

XLDnaute Barbatruc
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

Re,

chez moi, sous 2003, si saisie .3, le code renvoie 0.30%... format de la cellule ".NumberFormat = "0.00%""... perso pas d'autre idée, pour intercepter la saisie, voir peut être du coté des API windows....
 

laetitia90

XLDnaute Barbatruc
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

bonjour vivelesfrites , l'ami Pierrot:)

normalement onkey devrait fonctionner???

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Not Intersect(Target, [a1:c1]) Is Nothing And Target.Count = 1 Then
 Application.OnKey ",", ""
 Else
 Application.OnKey ","
 End If
End Sub

autrement on pourrait essayer seulement

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [a1:c1]) Is Nothing And Target.Count = 1 Then _
 If Target Like ",*" Then Target.Value = 0 & Target.Value: Target.NumberFormat = "0.00%"
End Sub


ps oublie donner bonjour a l'ami PierreJean:)
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

Bonjour à tous.


Un essai dans le classeur joint avec ce code :

Module1 :​

VB:
Public xtndLst As Boolean

ThisWorkbook :​

VB:
Private Sub Workbook_Activate()
  xtndLst = Application.ExtendList
End Sub

Private Sub Workbook_Deactivate()
  Application.ExtendList = xtndLst
End Sub

Feuil1 :​

VB:
Private Sub Worksheet_SelectionChange(ByVal Cible As Range)
Dim Plg As Range, x As Boolean
  Set Plg = Intersect(Cible, Columns(2).Resize(40).Offset(1))
  If Not Plg Is Nothing Then
    Application.ExtendList = False
  Else
    Application.ExtendList = xtndLst
  End If
End Sub

Private Sub Worksheet_Change(ByVal Cible As Range)
Dim Plg As Range, Cel As Range
  Set Plg = Intersect(Cible, Columns(2).Resize(40).Offset(1))
  If Not Plg Is Nothing Then
    Application.EnableEvents = False
    For Each Cel In Plg.Cells
      With Cel
        If IsEmpty(.Value) Then
          .NumberFormat = "General"
        Else
          On Error Resume Next
          .Value = .Value / 100
          On Error GoTo 0
          .NumberFormat = "0.00%"
        End If
      End With
    Next
    Application.EnableEvents = True
  End If
End Sub
La plage de saisie Feuil1!B2:B41 est initialement au format Standard. Ne pas la mettre au format "0.00%".
Les nombres saisis dans cette plage sont mis au format "0.00%".
,3 et 0,3 sont interprétés tous deux comme 0,30%.

À tester !​


ROGER2327
#6710


Mardi 17 Tatane 140 (Sainte Flamberge, voyante - fête Suprême Quarte)
12 Thermidor An CCXXI, 5,2570h - salicot
2013-W31-2T12:37:01Z
 

Pièces jointes

  • XLD_208818_Contrôle de saisie.xlsm
    21.8 KB · Affichages: 46
Dernière édition:

vivelesfrites

XLDnaute Nouveau
Re : Comment empêcher la saisie d'un nombre décimal en commençant par la virgule

bonjour le forum, désolé pour le manque de réactivité.

Merci à Laetitia, mais malheureusement ces 2 propositions ne fonctionnent pas (par contre je n'ai pas trouvé pourquoi).
merci à JHA mais la validation de donnée empêche de sairie un nombre en commençant par une virgule, et renvoie le message d'erreur associé.
Merci à Roger, le code fonctionne! Par contre, quand je corrige une saisie non décimale, le code divise par 100 (je tape 30 affiche 30% ok, je retape 30 dans la même case, et c'est 0.30% qui s'affiche). Je vais voir pour mettre une condition sur le format de la cellule.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 089
Messages
2 085 206
Membres
102 819
dernier inscrit
Michew13