Vba excel : fonction round pour compatibilité excel 97

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 992 fois - Téléchargée 30 fois

Contenu du snippet

Simple, très simple... mais encore nécessaire ?!

La fonction SimpleRound a été créée sur le modèle de la fonction éponyme en Delphi (SimpleRoundTo).

Source / Exemple :


Function GetRound(ByVal Expression As String, _
                  Optional DecimalDigitsNumber As Byte = 0, _
                  Optional RoundToFive As Boolean = True) As Double

'Signature 1 : fonction d'arrondi paramétrable (compatible Excel 95/97)
'Contrairement à la fonction "Round", le type d'approximation est modifiable
'et surtout constant quel que soit le nombre de décimales.

   Dim ApproximationValue As Single

   If RoundToFive = True Then
      ApproximationValue = 0.5
   Else
      ApproximationValue = 0.49
   End If

   GetRound = CDbl(Expression) * (10 ^ DecimalDigitsNumber)
   GetRound = Int(GetRound + ApproximationValue) * (10 ^ -DecimalDigitsNumber)

End Function

Function GetRound(ByVal Expression As String, _
                  Optional DecimalDigitsNumber As Integer = 0, _
                  Optional RoundToFive As Boolean = True) As Double
                  
'Signature 2 : fonction d'arrondi paramétrable (compatible Excel 95/97)
'Contrairement à la fonction "Round", le type d'approximation est modifiable
'et surtout constant quel que soit le nombre de décimales.
'De surcroît, cette version permet d'arrondir selon les unités, dizaines, centaines etc.

   Dim ApproximationValue As Single
   
   If RoundToFive = True Then
      ApproximationValue = 0.5
   Else
      ApproximationValue = 0.49
   End If
   
   GetRound = CDbl(Expression) * (10 ^ DecimalDigitsNumber)
   GetRound = Int(GetRound + ApproximationValue) * (10 ^ -DecimalDigitsNumber)
   
End Function

Function SimpleRound(ByVal AValue As Double, _
                    Optional ADigit As Integer = -2) As Double
' Contrairement à la fonction Round cette fonction n'applique pas la règle
' de l'arrondi bancaire. SimpleRound utilise l'arrondi arithmétique asymétrique.
' Cette méthode arrondit toujours vers la valeur la plus grande.

' Arguments :
' - AValue est la valeur à arrondir,
' - ADigit indique la puissance de dix à laquelle vous voulez arrondir AValue.
   
   SimpleRound = AValue * (10 ^ -ADigit)
   SimpleRound = Fix(SimpleRound + 0.5) * (10 ^ ADigit)
   
End Function

Conclusion :


Exemples d'utilisation :
- Signature 1 ou 2 de la fonction
GetRound(12.55, 1) retourne 12.6 ; GetRound(12.55, 1, False) retourne 12.5
GetRound(12.455, 2) retourne 12.46 ; GetRound(12.455, 2, False) retourne 12.45
- Signature 2 de la fonction
GetRound(12455,-1) retourne 12460 ; GetRound(12455,-1, False) retourne 12450
GetRound(12450,-2) retourne 12500 ; GetRound(12450,-2, False) retourne 12400

A voir également

Ajouter un commentaire

Commentaires

Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Règle de l'arrondi bancaire:
La fonction Round de VB6 utilise l'arrondi bancaire pour déterminer comment arrondir la valeur qui se trouve exactement au milieu des deux valeurs ayant le nombre de chiffres significatifs souhaité. La convention est d'aller au nombre pair le plus proche ainsi 1, 5 et 2,5 sont arrondis à 2 alors que 3,5 et 4,5 sont arrondis à 4.
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Merci à Igloobel pour son message. Cela fait toujours plaisir de savoir qu'une source a été utile à quelqu'un.
Messages postés
1
Date d'inscription
jeudi 15 février 2007
Statut
Membre
Dernière intervention
15 février 2007

Bonjour,
Je viens de m'inscrire, et en furetant je découvre cette petite fonction m'aurais bien servi il y a à peine 3 semaines !
surtout pour les arrondis négatif impossible avec round.

Je cherchais a arrondir un chiffre sur 5 positions exemple : de 24876 je devais optenir 20000.

Je viens de tester ton code et il marche nickel !!!

Bravo

Igloobel

PS : testé sur une version 2003
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Pour arrondir sur les unités, dizaines, centaines etc. Il faut modifier le type du paramètre " DecimalDigitsNumber " et modifier la signature de la fonction de la façon suivante :

Function GetRound(ByVal Expression As String, _
Optional DecimalDigitsNumber As Integer = 0, _
Optional RoundToFive As Boolean = True) As Double

De la sorte, vous pourrez, par exemple, vous pourrez effectuer l'appel suivant :
call getRound("124", -1)
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Dernier commentaire pour vous inviter à détailler l'information,
voici la correspondance :

GetRound(1.25,1, True)=AsymArith(1.25, 10)
GetRound(1.225,2, True)=AsymArith(1.225, 100)
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.