XL 2010 Conserver le ou les "0" (inutiles) après la virgule

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Je me heurte à ce problème en apparence tout bête.
Je rentre une valeur dans, par exemple, la cellule A1 : 12,50 qui, fatalement, est transformée en 12,5.
Par macro événementielle, je voudrais récupérer (sous forme de texte évidemment), par exemple dans la cellule C1, la valeur que j'ai rentrée, autrement dit 12,50.
Vous comprendrez que je ne désire pas passer par un format personnalisé. Je veux, par la suite, récupérer les chiffres après la virgule, ici 50 : 50 <> 5 !

Merci d'avance pour toute aide.
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

C'est étonnant toute cette polémique pour un truc aussi simple.
On a quand même le droit de décider quelque chose, même si ça ne concorde pas forcément avec la doxa mathématique.
Je veux rentrer des degrés et minutes d'un coup, d'un seul dans une unique cellule, plutôt que de devoir introduire les degrés dans une cellule et les minutes dans une autre. Pour ce faire, je décide, arbitrairement, de le faire au moyen d'un nombre décimal. À gauche de la virgule ce sont des degrés, à droite de la virgule ce sont des minutes. Et c'est tout ! Autrement dit : 25,36 <=> 25° 36'
Je suis désolé, mais dans ma tête, quand je pense à 2', ce n'est pas 02 qui me vient à l'esprit mais 2. C'est peut-être con, mais c'est comme ça. Et quand je pense à 50', ce n'est pas 5 qui me bouscule les neurones mais 50. De temps en temps, il faut savoir aussi voir simplement.
Bon, une fois l'arbitraire entériné, je contrôle la saisie afin d'éliminer, autant faire se peut, d'éventuelles bourdes :
12,23976 --> 12° 23'
12,76 --> 12° 59'
12 --> 12°
12,0 ou 12,00 --> 12°
12,50 --> 12° 50'
12,5 --> 12° 5'
12,05 --> 12° 5'

J'ai un peu complété la fonction :
VB:
Function ControlMinutes$(angle$)
'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
'Ex : angle = 25,75 --> 12,59
'     angle = 15,15892 --> 15,15
'     angle = 15,20 --> 15,20
'     angle = 15,2 --> 15,2
'     angle = 15,02 --> 15,2
'Magic_Doctor

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

    pos = InStr(angle, ",")              'position de la virgule dans la chaîne
    If pos = 0 Then GoTo fin             'il n'y a que des degrés, on court-circuite les minutes
    largo = Len(angle)                   'longueur de la chaîne "angle"
    deg = Left(angle, pos - 1)           'degrés (à gauche de la virgule)
    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)
    ControlMinutes = IIf(pos = 0, angle & "°", deg & "°" & " " & min & "'")

End Function

¡Felices fiestas a todos!
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

[aparté - à lire pour fuir...]

Les téléfims de Noel à profusion sur la TV ;)
même si ça ne concorde pas forcément avec la doxa mathématique.
Sans la doxa mathématique, nous ne serions pas en train de lire ce post sur nos ordinateurs... ;)
Car un monde binaire sans doxa, ca marche pas du tout.
Déjà que même avec, survienne bugs et plantages, alors sans, les pyramides d'Egypte seraient à terre depuis longtemps et caetra et caetera.
[/aparté]
 

Magic_Doctor

XLDnaute Barbatruc
Staple1600,

Regardez "La Reina del Sur", c'est pas mal, on oublie complètement les mathématiques ! Ça fait du bien de temps en temps... D'autant plus qu'elle est charmante !

Ce qu'il y a de bien en mathématiques, c'est que l'on peut toujours supposer en expliquant au préalable la supposition.
Supposons que 12,55 <=> 12° 55' ...
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

Un autre essai:
VB:
Function DegMin(x)
Dim s, d, m
   s = Split(x & ",,", ",")
   If Len(s(1)) > 2 Then s(1) = Left(s(1), 2)
   If s(1) > "59" Then s(1) = "59"
   If Left(s(1), 1) = "0" Then s(1) = Mid(s(1), 2)
   If s(0) = "" Then d = 0 Else d = s(0)
   If s(1) = "" Or s(1) = "0" Then m = "" Else m = s(1) & "'"
   DegMin = Trim(d & "° " & m)
End Function
 

Magic_Doctor

XLDnaute Barbatruc
Bonsoir mapomme,

Enfin quelqu'un qui me comprend !
Fort déprimé, j'hésitais entre m'étouffer avec une truffe au chocolat ou bien une datte... Gros dilemme !

Voilà une belle fonction que vous avez concoctée. Je viens de l'essayer et elle marche très bien. Plus concise que la mienne, mais moins facile à comprendre.
Je n'ai, en effet, pas encore tout compris, mais, concernant les variables (j'aime bien leur mettre leur attribut), je pense que :
- s est Variant
- d Integer
- m Variant ?

J'y ai fait une petite modification, car je dois aussi récupérer la valeur traitée par la fonction sous forme décimale :
VB:
Function DegMin2(angle, chx As Byte)
'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
'- chx : si = 1 --> renvoie une valeur strictement décimale. Ex : on rentre 15,15892 --> 15,15
'        si = 2 --> renvoie une valeur sous la forme sexagésimale. Ex : on rentre 15,15892 --> 15° 15'
'Ex : angle = 25,75 --> 12,59 | 12° 59'
'     angle = 15,15892 --> 15,15 | 15° 15'
'     angle = 15,20 --> 15,20 | 15° 20'
'     angle = 15,2 --> 15,2 | 15° 2'
'     angle = 15,02 --> 15,2 | 15° 2'
'mapomme

Dim s, d%, m

   s = Split(angle & ",,", ",")
   If Len(s(1)) > 2 Then s(1) = Left(s(1), 2)
   If s(1) > "59" Then s(1) = "59"
   If Left(s(1), 1) = "0" Then s(1) = Mid(s(1), 2)
   If s(0) = "" Then d = 0 Else d = s(0)
   If s(1) = "" Or s(1) = "0" Then m = "" Else m = IIf(chx = 1, s(1), s(1) & "'")
  
   DegMin2 = Trim(d & IIf(chx = 1, "," & m, "° " & m))
  
End Function
Quoi qu'il en soit, ADOPTÉE !

Bonne fin de soirée.
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
C'est étonnant toute cette polémique pour un truc aussi simple.
Je veux rentrer des degrés et minutes d'un coup, d'un seul dans une unique cellule, plutôt que de devoir introduire les degrés dans une cellule et les minutes dans une autre. Pour ce faire, je décide, arbitrairement, de le faire au moyen d'un nombre décimal. À gauche de la virgule ce sont des degrés, à droite de la virgule ce sont des minutes. Et c'est tout ! Autrement dit : 25,36 <=> 25° 36'
la solution a été donnée en #4 !!
après cette mise en œuvre, avec un proc événementielle on non, on fait ce que l'on veut...

hors cette solution, ( #4)
"By Design" Excel sait reconnaitre, selon le séparateur utilisé, le type de saisie (texte ou nombre)
pour les nombres selon les options, il reconnait
- le séparateur décimal
- le séparateur horaire
- le séparateur date
cette reconnaissance est automatique et à l'insu de l'utilisateur
le contenu réel de la cellule quelque soit son type et indépendamment de la valeur affichée est encodé en interne selon la méthode des concepteurs (?) pour être utilisable par le processeur...
Bien que informaticien la méthode m'importe peu pourvu que EXCEL y retrouve ses petits.

Hors formatage TEXTE préalable,
la solution numérique décimale pour équivalence directe en degrés et minutes sexagésimaux est inappropriée et source d'erreurs..
l'équivalence en degrés décimaux serait acceptable (voir éventuellement en grades 100 grades=90°)
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87