XL 2010 Forcer un TextBox à afficher une valeur entrée

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'ai un UserForm avec un TextBox.
Je rentre dans ce Textbox, par exemple, 2,20 et je valide. Je voudrais que soit affiché dans ce TextBox 1,20 et non pas 1,2.
Comment s'y prendre ?
 

job75

XLDnaute Barbatruc
Bonsoir Magic-Doctor, JM, Nicolas Jacquin,

Je suppose qu'on valide la TextBox par la touche <Entrée> alors utilisez cette macro :
VB:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode <> 13 Or Not IsNumeric(TextBox1) Then Exit Sub
Dim n%
n = InStr(TextBox1, Application.DecimalSeparator)
If n Then
    TextBox1 = Left(TextBox1, n - 1) - 1 & Mid(TextBox1, n)
Else
    TextBox1 = TextBox1 - 1
End If
End Sub
Si la valeur entrée est numérique, la macro retranche 1 à la partie entière : 2,20 => 1,20.

A+
 

patricktoulon

XLDnaute Barbatruc
bonjour
j'avoue ne pas toujours comprendre ce que fait @Magic_Doctor avec ces textboxs

et si c'est 1,xx qui est tapé on fait quoi on le remplace par 0,xx?
si c'est pas le cas il faudra inclure cette condition
le nombre de décimales sera respecté même les zeros(2/3/et plus)décimales
VB:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode <> 13 Or Not IsNumeric(TextBox1) Then Exit Sub
Dim n%
n = InStr(TextBox1, Application.DecimalSeparator)
If n Then
   If Int(TextBox1) > 1 Then TextBox1 = Format(TextBox1 - (Int(TextBox1) - 1), "#0.""" & Split(TextBox1, ",")(1) & """")
 Else
   If Int(TextBox1) > 1 TextBox1 = TextBox1 - 1
End If
End Sub
 

Magic_Doctor

XLDnaute Barbatruc
Amigos, buenos días,

Merci pour vos réponses.
J'ai tout essayé et ça n'a malheureusement pas marché.

patricktoulon remarque, à raison :
j'avoue ne pas toujours comprendre ce que fait @Magic_Doctor avec ces textboxs
En conséquence, j'explique en détail avec PJ à l'appui.

J'ouvre un USF dans lequel on rentre une déclinaison magnétique, autrement dit un angle.
Dans cet USF il y a 2 TextBox :
- celui du haut affiche la dernière valeur que l'on a entrée. On ne peut pas le modifier (j'aurais pu mettre un label...) ;
- celui de bas est celui où l'on rentre un angle en degrés|minutes (pas de secondes).

Par convention, j'ai décidé de rentrer la valeur de l'angle au moyen d'une seule décimale (ce fut l'objet d'un autre fil...). Je m'explique :
- je veux rentrer, par exemple, 12° 25', j'écris tout simplement : 12,25. Ça va plus vite et l'on ne nécessite que d'une seule cellule (ici TextBox).
- pour 25' --> 0,25.
- pour 45° 2' --> 45,2 ........
Automatiquement, la valeur entrée dans le TextBox, supposons 5,35, devient, quand on la valide (OK ou Enter), 5° 35'. C'est visuellement plus clair et plus joli.
La déclinaison magnétique peut être positive (E) ou négative (W). On choisit le préfixe de l'angle au moyen du label (E/W) immédiatement à droite du TextBox.
Une fois validé, l'USF se ferme. Quand on le rouvre, la dernière valeur entrée est affichée dans le TextBox du haut, et ainsi de suite.

TOUT MARCHE TRÈS BIEN ! Sauf (¡Caramba!) quand je veux rentrer, par exemple, 3° 20' (3,20), j'obtiens non pas 3° 20' mais 3° 2'. Je comprends pourquoi, sans pouvoir pour autant déjouer le problème.

Merci d'avance pour toute aide.
 

Pièces jointes

  • TextBox.xlsm
    31.1 KB · Affichages: 15

Magic_Doctor

XLDnaute Barbatruc
Re,

Pour en finir avec ce fil (enrichissant pour moi), j'ai allégé la fonction en utilisant la fonction Split.
Plutôt que d'écrire :
VB:
Function ControlMinutes$(angle$, Optional DegZero As Boolean = False)
'Vérifie si les chiffres après la virgule ne dépassent pas 59
'- angle : un angle désigné arbitrairement sous la forme X°,Y' avec un maximum de 2 décimales après la virgule (ex : 12,25 <=> 12° 25')
'          Dans la feuille, la cellule qui contient la valeur "angle" doit être en format TEXTE
'- DegZero : si True --> les degrés sont toujours nuls
'Ex : angle = 25,75 --> 12,59
'     angle = 15,15892 --> 15,15
'     angle = 15,20 --> 15,20
'     angle = 15,2 --> 15,2
'Magic_Doctor / laurent950

Dim largo As Byte, pos As Byte, deg$, min$

    If CStr(angle) Like "*" & "," & "*" Then
        If Len(Split(CStr(angle), ",")(1)) = 2 Then
            angle = Format(Abs(angle), "#.00") 'angle est toujours positif
        Else
            angle = Abs(angle)                 'angle est toujours positif
        End If
    End If
  
    pos = InStr(angle, ",")              'position de la virgule dans la chaîne
    If pos = 0 Then                      'il n'y a que des degrés
        If DegZero Then
            If angle > 0 Then angle = 0  'la variation annuelle de la déclinaison magnétique est seulement de quelques minutes
        End If
        GoTo fin                         'on court-circuite les minutes
    End If
    largo = Len(angle)                   'longueur de la chaîne "angle"
    deg = Left(angle, pos - 1)           'degrés (à gauche de la virgule)
    If DegZero Then
        If deg > 0 Then deg = 0          'la variation annuelle de la déclinaison magnétique est seulement de quelques minutes
    End If
    min = Right(angle, largo - pos)      'à droite de la virgule
    min = Left(min, 2)                   'minutes
    If min > 59 Then
        min = 59                         'les minutes ne peuvent excéder 59
    ElseIf min = "0" Or min = "00" Then  '1 "0" tout seul ou 2 "0" inutiles après la virgule
        angle = Left(angle, pos - 1)
        pos = 0
    ElseIf Left(min, 1) = "0" Then       'les minutes sont précédées d'un "0" (ex : 12,03)
        min = Right(min, 1)
    End If
fin:

    ControlMinutes = IIf(pos = 0, angle, deg & "," & min)  'résultat sous forme décimale (X°,Y')

End Function
Ça, c'est un peu mieux :
VB:
Function ControlMinutes$(angle$, Optional DegZero As Boolean = False)
'Vérifie et éventuellement corrige le nombre décimal entré pour "angle"
'- angle : un angle désigné, par convention, sous la forme X°,Y' avec un maximum de 2 décimales après la virgule (ex : 12,25 <=> 12° 25')
'          Dans la feuille, la cellule qui contient la valeur "angle" doit être en format TEXTE
'- DegZero : si True, stipule que les degrés doivent être nécessairement nuls (il ne peut y avoir que des minutes. Ex : 2,33 --> 0,33 <=> 0° 33')
'Ex : angle = 25,75 --> 12,59
'     angle = 15,15892 --> 15,15
'     angle = 15,20 --> 15,20
'     angle = 15,2 --> 15,2
'Magic_Doctor /laurent950

Dim pos As Byte, deg$, min$

    'Pour pouvoir entrer dans le TextBox de l'UF des valeurs comme, par exemple, 2,30 ou 45,50 (sinon considérées comme 2,3 ou 45,5)
    If angle Like "*,*" Then
        If Len(Split(angle, ",")(1)) = 2 Then   'il y a 2 chiffres après la virgule (minutes)
            angle = Format(Abs(angle), "#.00")  'angle est toujours positif (on ne peut affecter un préfixe +/- qu'avec le label des points cardinaux E/W)
        Else
            angle = Abs(angle)                  'angle est toujours positif (on ne peut affecter un préfixe +/- qu'avec le label des points cardinaux E/W)
        End If
    End If
  
    pos = InStr(angle, ",")              'position de la virgule dans la chaîne
    If pos = 0 Then                      'pas de virgule --> il n'y a que des degrés
        If DegZero Then                  'les degrés sont toujours nuls
            If angle > 0 Then angle = 0  'la variation annuelle de la déclinaison magnétique est seulement de quelques minutes
        End If
        GoTo fin                         'il n'y a que des degrés, on court-circuite l'étape des minutes
    End If
  
    deg = Split(angle, ",")(0)           'degrés (à gauche de la virgule)
  
    If DegZero Then                      'les degrés sont toujours nuls
        If deg > 0 Then deg = 0          'la variation annuelle de la déclinaison magnétique est seulement de quelques minutes
    End If
  
    min = Split(angle, ",")(1)           'minutes (à droite de la virgule)
  
    If min > 59 Then
        min = 59                         'les minutes ne peuvent excéder 59
    ElseIf min = "0" Or min = "00" Then  '1 "0" tout seul ou 2 "0" inutiles après la virgule
        angle = Left(angle, pos - 1): pos = 0
    ElseIf Left(min, 1) = "0" Then       'les minutes commencent par un "0" (ex : 12,03 --> 12,3)
        min = Right(min, 1)
    End If
fin:

    ControlMinutes = IIf(pos = 0, angle, deg & "," & min)  'résultat sous forme décimale (X° | X°,Y')

End Function
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 344
Messages
2 087 448
Membres
103 546
dernier inscrit
mohamed tano