Afficher mes données en numérique

dePOI

XLDnaute Junior
Bonjour à tous,
Depuis un USF je transfère des valeurs dans une feuille Excel par le truchement du petit code suivant:


Code:
Private Sub TextBox4_AfterUpdate()
Dim x, xx$
Application.EnableEvents = False
x = Split(TextBox4.Value)
xx = x(0) & "° " & x(1) & "’ " & x(2) & "” " & UCase(x(3))
TextBox4 = xx
TextBox5 = Convertir(TextBox4.Text)

End Sub
Code:

Le problème est que la cellule recevant les valeurs de la TextBox5 les affiche en alphanumérique quand j'espérait du numérique.
Qui peut m'aider?
Par avance merci.
 

Dranreb

XLDnaute Barbatruc
Re : Afficher mes données en numérique

Bonjour.
Quand vous dites du numérique qu'est ce que vous entendez par là ?
Un valeur décimale exprimant des degrés ou une valeur suceptible de supporter des calculs par formules tout en étant affichés dans la cellule sous forme ddd° mm’ ss” à l'aide d'un format hhh"° "mm" "ss"” " ?

P.S. Marche pas le format hhh"° "mm" "ss"” "
Alors on va considérer que vous voulez des valeurs en degrés décimaux.
Débarrassez vous du problème une bonne fois pour toutes à l'aide d'une paire de Property Get et Put dans un module ordinaire :
VB:
Property Get DegrésTxt(Txt As String) As Double
Dim D As Long, M As Long, S As Long, Ts() As String
Ts = Split(Txt, "°"): D = Ts(0)
Ts = Split(Ts(1), "’"): M = Ts(0)
Ts = Split(Ts(1), "”"): S = Ts(0)
DegrésTxt = D + (M + S / 60) / 60
End Property
Property Let DegrésTxt(Txt As String, ByVal Deg As Double)
Dim D As Long, M As Long, S As Long
D = Int(Deg): M = Int(60 * (Deg - D))
Deg = 60 * (Deg - D): M = Int(Deg)
Deg = 60 * (Deg - M): S = Round(Deg)
Txt = D & "° " & M & "’ " & S & "” "
End Property
Vous pouvez aussi y mettre ces fonctions utilisables en formules de feuilles de calculs !
VB:
Function DegrésDeTexte(ByVal Txt As String) As Double
DegrésDeTexte = DegrésTxt(Txt)
End Function
Function TexteDeDegrés(ByVal Deg As Double) As String
DegrésTxt(TexteDeDegrés) = Deg
End Function
Je reste à votre disposition pour y intégrer un signe dépendant de la lettre éventuelle en dernière position.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Afficher mes données en numérique

Bonsour®
une donnée comportant une indication N,W,S,E (i.e UCase(x(3)))
restera toujours une donnée alphanumérique quelque soit le format d'affichage utilisé
il faut dissocier l'information "géodesique ?" de la donnée elle-même
 

Pièces jointes

  • Capture.jpg
    Capture.jpg
    24.3 KB · Affichages: 42
  • Capture.jpg
    Capture.jpg
    24.3 KB · Affichages: 54
  • Capture.jpg
    Capture.jpg
    24.3 KB · Affichages: 44

dePOI

XLDnaute Junior
Re : Afficher mes données en numérique

Merci pour ces réponses,
Une fois de plus il se démontre que pour pallier aux problèmes d'interprétation un exemple de mon programme reste la meilleure explication.
Nota: Par numérique il fallait comprendre un chiffre avec un certain nombre de décimales qui seront réutilisés par la suite.
Nota: Dans le fichier en pièce jointe voir le module 2 Convertir et le code VBA qui l'utilise.
Merci pour votre intérêt.
 

Pièces jointes

  • OACI essai.xlsm
    351.8 KB · Affichages: 32
  • OACI essai.xlsm
    351.8 KB · Affichages: 39
  • OACI essai.xlsm
    351.8 KB · Affichages: 34

Dranreb

XLDnaute Barbatruc
Re : Afficher mes données en numérique

Utilisez ce code à la place qui sera, je pense, plus pratique à utiliser.
Les trois fonctions en tête peuvent s'utiliser aussi bien dans des formules que dans du code.
La 1ère renvoie un double résultant de l'analyse d'un String, les deux suivantes font l'inverse.
VB:
Option Explicit

Function DegrésDe(ByVal Txt As String) As Double
DegrésDe = DegrésTxt(Txt)
End Function
Function Latitude(ByVal Deg As Double) As String
Latitude = "N": DegrésTxt(Latitude) = Deg
End Function
Function Longitude(ByVal Deg As Double) As String
Longitude = "E": DegrésTxt(Longitude) = Deg
End Function

Property Get DegrésTxt(Txt As String) As Double
Dim Sens As Integer, Signe As Integer, D As Long, M As Long, S As Long, Ts() As String
Lettre(Sens, Signe) = Txt
Ts = Split(Txt, "°"): D = Ts(0)
Ts = Split(Ts(1), "’"): M = Ts(0)
Ts = Split(Ts(1), "”"): S = Ts(0)
DegrésTxt = (D + (M + S / 60) / 60) * Signe
End Property
Property Let DegrésTxt(Txt As String, ByVal Deg As Double)
Dim Sens As Integer, Signe As Integer, D As Long, M As Long, S As Long
Lettre(Sens, Signe) = Txt: Signe = Sgn(Deg): Deg = Abs(Deg)
D = Int(Deg): M = Int(60 * (Deg - D))
Deg = 60 * (Deg - D): M = Int(Deg)
Deg = 60 * (Deg - M): S = Round(Deg)
Txt = D & "° " & M & "’ " & S & "” " & Lettre(Sens, Signe)
End Property

Private Property Get Lettre(Sens As Integer, Signe As Integer) As String
Lettre = Mid$("NESO", Sens - Signe, 1)
End Property
Private Property Let Lettre(Sens As Integer, Signe As Integer, ByVal Lt As String)
Sens = InStr("NESO", Right$(Lt, 1))
Signe = 1 - (Sens - 1 And 2)
Sens = Sens + Signe
End Property

P.S. Il y a sans doute lieu de remplacer "NESO" par "NOSE". Je ne savais pas que c'était vers l'Est que c'était négatif.

P.S.2 Cela dit il pourrait être plus pratique d'écrire la première comme ceci :
VB:
Function DegrésDe(ByVal Txt As String) As Variant
If Txt Like "*° *’ *” ?" Then
   DegrésDe = DegrésTxt(Txt)
ElseIf IsNumeric(Txt) Then
   DegrésDe = CDbl(Txt)
Else
   DegrésDe = Txt: End If
End Function
ou mieux comme ça, en effet :
VB:
Function DegrésDe(ByVal Txt As String) As Double
Dim S() As String, Sens As Integer, Signe As Integer
If Txt Like "*° *’ *” ?" Then
   DegrésDe = DegrésTxt(Txt)
ElseIf IsNumeric(Txt) Then
   DegrésDe = CDbl(Txt)
Else
   S = Split(Txt)
   Lettre(Sens, Signe) = S(3)
   DegrésDe = (Val(S(0)) + Val(S(1)) / 60 + Val(S(2)) / 3600) * Signe
   End If
End Function
L'essentiel c'est de mettre au point, groupées dans ce module, toutes les fonctions de conversions entres textes et valeurs en degrés dans les deux sens de manière à ne plus avoir à chercher comment faire dans l'userform.

P.S…(je ne compte plus) Au fond votre problème de départ est plus simple que ça, bien que ça n'enlève rien aux avantages qu'aurait de regrouper tous les problèmes de conversions dans ce module. Il ne faut pas envoyer TextBox5 dans la cellule mais CDbl(TextBox5) parce qu'une TexBox, comme l'indique le nom de son type, ça contient toujours du texte !
 
Dernière édition:

dePOI

XLDnaute Junior
Re : Afficher mes données en numérique

Bonjour Dranreb,

J'ai appris pas mal de choses avec vos codes qui sont à présent copiés dans ma bibliothèque.
Finalement, comme vous le dites dans la dernière phrase de votre ultime PS l'utilisation de CDbl pour transférer mes valeurs est la solution que j'attendais. J'ai essayé, çà marche! Je m'en veut de ne pas y avoir pensé tout seul.
Bref c'est parfait pour la suite de mon travail qui peut être poursuivi à présent.
Soyez remercié le plus sincèrement possible.
Problème résolu.
 

dePOI

XLDnaute Junior
Re : Afficher mes données en numérique

Re bonjour Dranreb,

Contrairement à ce que j'affirmais dans mon précédent message cela ne marche pas dans l'exception ou certaines cellules ne sont pas remplies volontairement. J'ai essayé avec des IF ELSE mais çà ne change rien au blocage du programme. Il faudrait peut être analyser le contenu de la cellule -remplie-non remplie- pour décider s'il faut utiliser CDbl ou non.
Pouvez-vous m'aider une fois de plus?
D'avance merci.
 

Dranreb

XLDnaute Barbatruc
Re : Afficher mes données en numérique

Essayez
VB:
Cells(x, y).Value = Iif(IsNumeric(TextBox5.Text), CDbl(TexBox5.Text), Empty)
Non, stop ! grossière erreur de ma part. On ne peut pas faire autrement que :
VB:
If IsNumeric(TextBox5.Text) Then Cells(x, y).Value = CDbl(TexBox5.Text) Else Cells(x, y).ClearContents
 
Dernière édition:

dePOI

XLDnaute Junior
Re : Afficher mes données en numérique

re de re bonjour,

Merci mais x et y sont des valeurs qui changent en fonction de la fiche traitée en modif ou en création. Pensez-vous que cela va fonctionner? Je pense que je vais retourner à mon point de départ ou les valeurs s'inscrivent dans les premières cellules vides de la colonne indiquée x ou y.
Pour avancer dans mon travail, pour l'instant je saisie 000 00 00 N dans toutes les cellules qui doivent rester vides, mais ce n'est pas très élégant et c'est plus long pour la saisie.
Merci quand même.
A plus tard peut-être.
 

Discussions similaires

Statistiques des forums

Discussions
312 023
Messages
2 084 715
Membres
102 637
dernier inscrit
TOTO33000