Précédent   Forum des professionnels en informatique > 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
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/03/2007, 09h38   #1
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
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 :
1
2
3
4
5
6
7
8
 
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   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 00
Vieux 25/03/2007, 17h44   #2
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Qu'est ce que tu penses de cette proposition

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
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 00
Vieux 25/03/2007, 18h35   #3
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
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 00
Vieux 14/06/2007, 14h10   #4
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
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 ?
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 19h38   #5
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
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 :
1
2
3
4
5
6
7
8
 
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 :
1
2
3
4
5
6
 
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 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h34.


 
 
 
 
Partenaires

Hébergement Web