Arrondis aux multiple

bdufr Messages postés 3 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 15 juin 2006 - 14 juin 2006 à 15:30
bdufr Messages postés 3 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 15 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:

6 réponses

Alboure Messages postés 42 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 21 juin 2006
14 juin 2006 à 15:47
Bonjour, tu peux utiliser l'enregistreur de macros.

Si tu ne sais pas comment il faut faire, voici une explication:

-Outils>Macros>Nouvelle macro

Puis tu met tes fonctions sur ta feuille excel et tu arretes l'enregistreur.

Tu vas ensuite dans VBA et tu auras ta fonction traduite en vba.
0
bdufr Messages postés 3 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 15 juin 2006
14 juin 2006 à 17:47
Merci pour ta réponse mais cela ne fait que placer la formule dans la cellule
ci dessous résultat dans VBA

activeCell.FormulaR1C1 = "=mround(4594.22,10)"

ce n'est malheureusement pas ce que je souhaite, je souhaite effectuer le calcul ds vb our placer uniquement le résultat dans la cellule

je vais tester cela

Function Mround(number As Double, multiple As Integer)
Mround = Round(number / multiple) * multiple
End Function

reste à trouver la bonne formule pour calculer le plafond ...
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
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
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
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

Molenn qui va pouvoir enfin aller manger ^^
0
bdufr Messages postés 3 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 15 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

Bravo et encore merci
0
Rejoignez-nous