Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Contribuez

Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com

Réponse
 
Outils de la discussion
Vieux 18/03/2007, 09h38   #1 (permalink)
Membre Expert
 
Date d'inscription: avril 2006
Messages: 1 000
Par défaut [Fait]Arrondir un nombre à sa valeur supérieure ou inférieure

Bonjour,

Contrairement à la fonction Round qui arrondi un nombre à sa valeur la plus proche en fonction des décimales choisies, je vous propose la fonction RoundUP qui arrondi un nombre à sa valeur supérieure en fonction des décimales choisies et, pour ne pas me faire couper l'herbe sous le pied , la fonction inverse RoundDown !

Voici le code et des exemples pour désherber tout ça :
Code :
 
Public Function RoundUp(vValeur As Variant, Optional byNbDec As Byte) As Variant
   RoundUp = -Int(-vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
End Function
 
Public Function RoundDown(vValeur As Variant, Optional byNbDec As Byte) As Variant
   RoundDown = Int(vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
End Function
 
Exemples :
Code :
   MsgBox "Round: " & Round(5.2)                 ' 5
   MsgBox "RoundUp: " & RoundUp(5.2)          ' 6
   MsgBox "RoundDown: " & RoundDown(5.2)  ' 5

   MsgBox "Round: " & Round(0.5)         ' 0 BUG ????????????????
   MsgBox "RoundUp: " & RoundUp(0.5)          ' 1
   MsgBox "RoundDown: " & RoundDown(0.5)  ' 0

   MsgBox "Round: " & Round(-0.5)       ' 0 BUG ????????????????
   MsgBox "RoundUp: " & RoundUp(-0.5)      ' 0
   MsgBox "RoundDown: " & RoundDown(-0.5)  ' -1

   MsgBox "Round: " & Round(2.51, 1)         'renvoie 2,5
   MsgBox "RoundUp: " & RoundUp(2.51, 1)     'renvoie 2,6
   MsgBox "RoundDown: " & RoundDown(2.51, 1) 'renvoie 2,5

   MsgBox "Round: " & Round(-2.56, 1)         'renvoie -2,6
   MsgBox "RoundUp: " & RoundUp(-2.56, 1)     'renvoie -2,5
   MsgBox "RoundDown: " & RoundDown(-2.56, 1) 'renvoie -2,6
Amicalement,

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/03/2007, 17h44   #2 (permalink)
Rédacteur

 
Avatar de Tofalu
 
Date d'inscription: octobre 2004
Localisation: Mâcon
Messages: 5 851
Par défaut

Qu'est ce que tu penses de cette proposition

Code :
Enum myRoundEnum
    myRoundup = -1
    myRoundDown = 1
End Enum
 
Public Function myRound(vValeur As Variant, Optional byNbDec As Byte, Optional eSens As myRoundEnum = myRoundup) As Variant
   myRound = eSens * Int(eSens * vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
End Function
 
Sub test()
MsgBox myRound(4.333, 1, myRoundup)
MsgBox myRound(4.333, 1, myRoundDown)
End Sub
 
On évite ainsi la multiplication des fonctions
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/03/2007, 18h35   #3 (permalink)
Membre Expert
 
Date d'inscription: avril 2006
Messages: 1 000
Par défaut

Bonjour Tofalu,

Excellent, de plus la formule 2 en 1 est vendeuse !

Amicalement,

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/06/2007, 14h10   #4 (permalink)
Membre habitué
 
Date d'inscription: juin 2005
Messages: 151
Par défaut

ce genre de fonction s'ajoute dans la partie "Modules" n'est ce pas ?

peut on ensuite utiliser la fonction dans une requete SQL ?
peut on ensuite utiliser la fonction dans une requete SQL appellé via ODBC ?

Dernière modification par tatayoyo ; 14/06/2007 à 14h24
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/06/2007, 19h38   #5 (permalink)
Membre Expert
 
Date d'inscription: avril 2006
Messages: 1 000
Par défaut

bonjour,

En principe oui mais le paramètre optional ne l'est plus et l'enum n'est pas reconnu (mettre la valeur correspondante). Il faut mettre les fonctions publiques dans un module standard.

Le plus simple peut être est d'écrire seulement la ligne de code de la fonction dans votre requête SQL.

J'en profite pour mettre le code des fonctions qui permettent aussi d'arrondir à la dizaine (-1), centaine (-2), etc... supérieur ou inférieure.
Je limite la puissance 10 à 5 pour éviter un overflow.

Code :
 
Public Function RoundUp(ByVal vValeur As Variant, Optional ByVal iNbDecimal As Integer) As Variant
   If Abs(iNbDecimal) < 5 Then RoundUp = -Int(-vValeur * 10 ^ iNbDecimal) / 10 ^ iNbDecimal
End Function
 
Public Function RoundDown(ByVal vValeur As Variant, Optional ByVal iNbDecimal As Integer) As Variant
   If Abs(iNbDecimal) < 5 Then RoundDown = Int(vValeur * 10 ^ iNbDecimal) / 10 ^ iNbDecimal
End Function
 
 
Exemples complémentaires :
Code :
 
Debug.Print RoundUp(1104, -2)    '=> 1200
Debug.Print RoundDown(116.5, -1) '=> 110
 
Debug.Print RoundUp(-1, -1)      '=> 0
Debug.Print RoundDown(-1, -2)    '=> -100
 
cordialement,

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Contribuez

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide