XL 2010 Convertir une variable dans une fonction

Magic_Doctor

XLDnaute Barbatruc
Je viens d'essayer, ça marche aussi ; néanmoins les secondes sont entières.
 

Dranreb

XLDnaute Barbatruc
Alors :
VB:
Function DD_DMS(ByVal Cordd As Double, ByVal DMS As Byte) As Double
'Convertit des coordonnées en degrés décimaux (DD) en coordonnées en degrés sexagésimaux (DMS)
'- cordd = coordonnée en degrés décimaux
'- dms = 1 ---> renvoie les degrés
'- dms = 2 ---> renvoie les minutes
'- dms = 3 ---> renvoie les secondes
   Dim Deg As Long, Min As Long
   Cordd = Abs(Cordd) * 3600
   Select Case DMS
      Case 1: DD_DMS = Int(Cordd / 3600)
      Case 2: DD_DMS = Int(Cordd / 60) Mod 60
      Case 3: DD_DMS = Cordd - 60 * Int(Cordd / 60)
      End Select
   End Function
 

Magic_Doctor

XLDnaute Barbatruc
Maintenant ça marche !
Adoptée.
Merci pour cette fonction indépendante.

PS : les ByVal sont-ils obligatoires ?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour moi oui, les ByVal sont obligatoires pour une procédure qui n'a pas à effectuer de modification permanente sur les arguments concernés. De plus ils éliminent complètement le risque d'erreur Type d'argument ByRef incompatible en cas de spécification d'une variable d'un type de donnée légèrement différent.
 

Magic_Doctor

XLDnaute Barbatruc
Merci Dranreb pour ces explications.
Mais reconnaissons que les notions ByVal & ByRef finissent par être aussi absconses que Ser & Estar pour les Français.
 

Dranreb

XLDnaute Barbatruc
Elles sont limpides au contraire pour moi. Pour transmettre un argument, la procédure appelante doit le déposer dans une région de mémoire appelée la pile ou le tas, en anglais (heap).
Pour une variable, avec ByRef il y en dépose l'adresse, avec ByVal il y en dépose la valeur.
Dans ce dernier cas, pour la procédure appelée, la zone ainsi renseignée a exactement le même statut qu'une variable locale.
Pour une expression telle qu'une constante, avec ByRef, n'ayant pas le droit d'en transmettre l'adresse, ce qui l'exposerait ainsi à une possible modification par la procédure appelée, il doit de toute façon déposer une copie de sa valeur dans une zone de travail et transmettre l'adresse de cette zone. Ce qui est idiot: quitte à devoir déposer sa valeur quelque part autant la déposer directement dans la pile. Son accès sera d'ailleurs plus simple pour la procédure appelée.
Pour un objet c'est encore plus idiot de le transmettre ByRef. Mais, à moins que vous ne me le demandiez, je ne vais pas détailler ça maintenant.
Mais la plus grande valeur de l'attribut ByVal est une valeur documentaire: j'affirme ainsi que c'est seulement une donnée d'entrée, qui n'a pas vocation d'être modifiée à l'intention de la procédure appelante. Pour un objet, ce qui consiste à le modifier c'est de l'initialiser, non d'accéder à ses propriétés et méthodes. Cest derniers ne sont pas impactés par son mode de transmission.
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Merci Dranreb,

Petit à petit ça s'éclaircit.

Au fait, j'oubliais, mais la fonction ChiffresAfterVirgule pourrait aussi servir à renvoyer la mantisse d'un logarithme.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
Pour obtenir la partie fractionnaire d'un Double il suffit de lui retrancher sa partie entière.
x - Int(x)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Pour la mantisse d'un nombre en A1 :
Code:
=A1/10^ENT(LOG10(ABS(A1)))
Et pour l'exposant :
Code:
=ENT(LOG10(ABS(A1)))
 
Dernière édition:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas