bdufr
Messages postés3Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention15 juin 2006
-
14 juin 2006 à 15:30
bdufr
Messages postés3Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention15 juin 2006
-
15 juin 2006 à 22:09
Bonjour,
J'ai besoin de reproduire enVBA les fonctions d'excel MROUND et PLAFOND
MROUND permet d'arrondir un nombre au multiple le plus proche d'une valeur
MROUND(4514;10) = 4510
MROUND(4515;10) = 4520
PLAFOND permet d'arrondir au multiple supérieur
PLAFOND(4514;10)=4520
Je recherche le code VBA pour faire la même chose si quelqu'un à déjà programmé cela je suis preneur
Merci d'avance
A voir également:
Excel arrondi au multiple supérieur
Arrondi au multiple supérieur excel - Meilleures réponses
Arrondir au multiple supérieur excel - Meilleures réponses
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 15 juin 2006 à 11:52
Je n'ai que de la bidouille à te proposer :
Pour ton MROUND, tu peux quasiment le simuler si tu n'as besoin que d'un multiple qui soit lui même un multiple de 10.
Pour arrondir au multiple le plus proche, ta formule est du type :
MROUND(4514;10) : 4514 le nb à arrondir et 10 la valeur du multiple.
Pour retrouver le résultat, il te suffit de diviser le nb par la valeur du multiple, arrondir le chiffre obtenu, puis de multiplier ce résultat par la valeur du multiple.
Illustration : 4514 / 10 451,4 4518 / 10 451,8Arrondi de 451,4 451 Arrondi de 451,8 452451 * 10 4510 452 * 10 4520
Il y a une limite dans le code VB qui fait lorsque tu as un chiffre qui se termine par 5, on ne trouve pas la même chose que la formule Excel.
En effet, en VB, les instructions Cint, Clng ou Round arrondissent les parties décimales égales à 0,5 au nombre pair le plus proche. 65 sera arrondi à 60 alors que la formule Excel arrondi à 70.
Mais bon, si ça se trouve, cette petite astuce sera suffisante pour ton cas ^^
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 15 juin 2006 à 12:18
Tiens, sinon, je viens de trouver ça :
Le code de la macro complémentaire MRound.
Bon, en fait, ça n'apporte pas grand chose. Mais peut être que quelqu'un est plus doué que moi et est capable de voir à quoi ça correspond pour savoir quels calculs sont effectués exactement ?
Function MRound(number As Variant, multiple As Variant) As Variant
MRound = Application.Run(GetMacroRegId("MROUND"), number, multiple)
End Function
Private Function GetMacroRegId(FuncText As String) As String
Debug.Print ("[GetMacroRegId] '" & FuncText & "' <")
For i = LBound(FunctionIDs) To UBound(FunctionIDs)
If (LCase(FunctionIDs(i, 0)) = LCase(FuncText)) Then
If (Not (IsError(FunctionIDs(i, 1)))) Then
GetMacroRegId = FunctionIDs(i, 1)
Debug.Print ("[GetMacroRegId] '" & FuncText & "' -> '" & GetMacroRegId & "' >")
Exit Function
End If
End If
Next i
Debug.Print ("[GetMacroRegId] Error while finding '" & FuncText & "' >")
End Function
Sinon, trouvé sur le site de MicroSoft :
ARRONDI.AU.MULTIPLE(nombre;multiple)
nombre représente la valeur à arrondir.
multiple représente le multiple auquel vous souhaitez arrondir nombre.
Note
ARRONDI.AU.MULTIPLE arrondit en s'éloignant de zéro, si le reste de la division de nombre par multiple est supérieur ou égal à la moitié de la valeur de multiple.
A mon avis, la solution tient dans la note, dès que je serai capable de traduire en français ce que ça fait, l'équivalent en VB ne sera pas loin. mais là, j'ai trop faim. Je chercherai plus tard ^^
Molenn
Vous n’avez pas trouvé la réponse que vous recherchez ?
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 15 juin 2006 à 12:57
Youpiii, j'ai trouvé !! En fait, ça ne sert à rien de s'embêter à regarder le code, je vais te détailler ce que fait exactement cette formule en langage Excel ^^ :
Tu as donc un Nombre et Un Multiple.
Reprenons ton exemple :
4515 et 10
Etape 1 :
Tu divises ton nombre par le multiple et tu ne gardes que la partie entière
Ent(4510;10) > 451
Etape 2 :
Etape 2 :
Tu calcules le reste de ta division
MOD(4510;10) > 5 (effectivement, 4515 - (451*10) = 5)
Etape 3 :
Tu calcules la moitié de ton multiple
10/2 > 5
Etape 4 :
Tu compares le chiffre obtenu aux étapes 2 et 3.
- Si Etape 2 < Etape 3 : L'arrondi est égal au chiffre Etape 1 * Multiple
- Si Etape 2 >= Etape 3 : Arrondi est égal au (Chiffre Etape 1 + 1) * Mutilple.
Alors, en VB, ça donne :
4 variables
Nombre, Multiple, Reste, Entier
je te laisse les déclaration et l'allimentation des variables ^^
Entier = Int(Nombre/Multiple)
Reste = Nombre Mod Multiple
If Reste >= (Multiple/2) then
Entier = Entier + 1
end if
msgbox "Arrondi : " & (Entier * Multipe)
A toi bien sûr de faire une fonction ou d'adapter à tes besoins :p
bdufr
Messages postés3Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention15 juin 2006 15 juin 2006 à 22:09
Merci molenn pour ta perspicacité je viens de tester cela fonctionne en accord avec la fonction d'excel.
Pour ceux que ça interesse voici l'adaptation sous forme de fonction
Function Mround(Nombre, multiple)
Entier = Int(Nombre / multiple)
Reste = Nombre Mod multiple
If Reste >= (multiple / 2) Then
Entier = Entier + 1
End If
Mround = Entier * multiple
End Function
et dessous l'adaptation à la fonction Plafond on arrondis au multiple supérieur si le reste de la division est > 0
Function Plafond(Nombre, multiple)
Entier = Int(Nombre / multiple)
Reste = Nombre Mod multiple
If Reste > 0 Then
Entier = Entier + 1
End If
Plafond = Entier * multiple
End Function