[Résolu][Calc]Remboursement indemnité kilométrique

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

[Résolu][Calc]Remboursement indemnité kilométrique

Message par martinbrait »

Bonjour,

Je transmets à toutes fins utiles une fonction calculant
remboursements de frais professionnels de déplacements.

Notez que dans cette fonction, bien que les valeurs soit typées double, il faut
explicitement les retyper à toutes les étapes de leurs manipulations
, afin de ne
pas subir de mauvaises surprises dans les calculs.

Code : Tout sélectionner

REM  *****  BASIC  *****

'=============================================
'Auteur : martinbrait
'Prix de base général, dit "Frais kilométrique"
'Cas d'utilisation : Calculer le remboursement administratif
'En sortie de la fonction, nous avons une somme en euros.
'suite au déplacement d'un fonctionnaire
'Indemnité restituée à un fonctionnaire suite à un déplacement professionnel
'en paramètre de la fonction, il faut entrer :
'1) les kilomètres effectués par le fonctionnaire
'2) si nécessaire la précision de la 1ère classe (par défaut, le programme considère la deuxième classe, prévue par la loi)

' ----------------- VERSION LIBRE OFFICE -----------------
'))))))))))))))))))))))))))))))))))))))))))))))))


    Sub Voyage1()
    'Je voyage en deuxième classe, sur 162 kilomètres
    InfoUser = MsgBox("Mon remboursement est de " & FraisKilometrique(162, 2) & " euros !")
    End Sub

    Sub Voyage2()
    'voyage de 151.5 kilomètres en première classe
    InfoUser = MsgBox("Mon remboursement est de " & FraisKilometrique(151.5, 1) & " euros !")
    End Sub


Public Function FraisKilometrique(KilEffect As Double, Optional Classe As Integer) As Double
Dim d As Double
Dim p As Double
Dim A1 As String, A2 As String, b1 As String, B2 As String
'Le prix de base seconde classe, pour les trzajets dans certains trains autres que TGV,
'est calculé selon la formule : P = a + bd

'P étant le prix, remboursé par l'administration
'a étant une constante
'b étant le prix kilométrique
'd étant la distance tarifaire
d = KilEffect

A1 = "1,1672;0,3755;3,1059;4,3337;6,1296;12,1307;11,6366;20,4771;27,6674;48,3062" 'ConstACl1
A2 = "0,7781;0,2503;2,0706;2,8891;4,0864;8,0871;7,7577;13,6514;18,4449;32,2041" 'ConstACl2
b1 = "0,2916;0,3248;0,2396;0,2234;0,2138;0,179;0,1814;0,1545;0,1382;0,1133" 'PrixK1
B2 = "0,1944;0,2165;0,1597;0,1489;0,1425;0,1193;0,1209;0,103;0,0921;0,0755" 'PrixK2

If IsMissing(Classe) Then
Classe = 2
End If

If Classe <> 1 And Classe <> 2 Then
WarningUser = MsgBox("Il y a un problème dans le deuxième paramètre, choisir 1 ou 2", vbExclamation, "ATTENTION AUX PARAMETRES !")
FraisKilometrique = 0
Exit Function
End If

'scenario de remboursement au kilomètre max parcouru :

'distance tarifaire
Select Case d

        Case 1 To 16

            If Classe = 1 Then
            a = Split(A1, ";")(0)
            b = Split(b1, ";")(0)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(0)
            b = Split(B2, ";")(0)
            End If

        Case 17 To 32

            If Classe = 1 Then
            a = Split(A1, ";")(1)
            b = Split(b1, ";")(1)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(1)
            b = Split(B2, ";")(1)
            End If

        Case 33 To 64

            If Classe = 1 Then
            a = Split(A1, ";")(2)
            b = Split(b1, ";")(2)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(2)
            b = Split(B2, ";")(2)
            End If

        Case 65 To 109

            If Classe = 1 Then

            a = Split(A1, ";")(3)
            b = Split(b1, ";")(3)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(3)
             b = Split(B2, ";")(3)

            End If

        Case 110 To 149

            If Classe = 1 Then

            a = Split(A1, ";")(4)
            b = Split(b1, ";")(4)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(4)
            b = Split(B2, ";")(4)

            End If

        Case 150 To 199

            If Classe = 1 Then

            a = Split(A1, ";")(5)
            b = Split(b1, ";")(5)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(5)
            b = Split(B2, ";")(5)

            End If

        Case 200 To 300


            If Classe = 1 Then

            a = Split(A1, ";")(6)
            b = Split(b1, ";")(6)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(6)
            b = Split(B2, ";")(6)
            End If

        Case 301 To 499

            If Classe = 1 Then

            a = Split(A1, ";")(7)
            b = Split(b1, ";")(7)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(7)
            b = Split(B2, ";")(7)

            End If

        Case 500 To 799

            If Classe = 1 Then

            a = Split(A1, ";")(8)
            b = Split(b1, ";")(8)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(8)
            b = Split(B2, ";")(8)
            End If

        Case 800 To 9999

            If Classe = 1 Then

            a = Split(A1, ";")(9)
            b = Split(b1, ";")(9)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(9)
            b = Split(B2, ";")(9)

            End If


End Select
p = CDbl(a) + (CDbl(b)*CDbl(d))
FraisKilometrique = Round(CDbl(p), 3)

'en sortie, j'arrondi, à trois chiffres après la virgule,
'afin de recalculer sans erreur d'approximation par la suite



End Function

Bon amusement !
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Résolu][Calc]Remboursement indemnité kilométrique

Message par Dude »

Salut,

Je ne vois pas l'intérêt de ta macro.
En France, le remboursement se base sur un barème de l'Administration fiscale révisée chaque année.
Un document incluant directement des formules de calcul me semble plus judicieux.
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: [Résolu][Calc]Remboursement indemnité kilométrique

Message par martinbrait »

Bien vu,

Disons que la version avec constantes à l'extérieur de la fonction pourraient-elles être un compromis ?
Comment vois-tu la chose ?

Code : Tout sélectionner

REM  *****  BASIC  *****

'=============================================
'Auteur : martinbrait
'Prix de base général, dit "Frais kilométrique"
'Cas d'utilisation : Calculer le remboursement administratif
'En sortie de la fonction, nous avons une somme en euros.
'suite au déplacement d'un fonctionnaire
'Indemnité restituée à un fonctionnaire suite à un déplacement professionnel
'en paramètre de la fonction, il faut entrer :
'1) les kilomètres effectués par le fonctionnaire
'2) si nécessaire la précision de la 1ère classe (par défaut, le programme considère la deuxième classe, prévue par la loi)

' ----------------- VERSION LIBRE OFFICE -----------------
'))))))))))))))))))))))))))))))))))))))))))))))))


    Sub Voyage1()
    'Je voyage en deuxième classe, sur 162 kilomètres
    InfoUser = MsgBox("Mon remboursement est de " & FraisKilometrique(162, 2) & " euros !")
    End Sub

    Sub Voyage2()
    'voyage de 151.5 kilomètres en première classe
    InfoUser = MsgBox("Mon remboursement est de " & FraisKilometrique(151.5, 1) & " euros !")
    End Sub


Private A1 As String, A2 As String, b1 As String, B2 As String

Function BaremeFiscal()
A1 = "1,1672;0,3755;3,1059;4,3337;6,1296;12,1307;11,6366;20,4771;27,6674;48,3062" 'ConstACl1
A2 = "0,7781;0,2503;2,0706;2,8891;4,0864;8,0871;7,7577;13,6514;18,4449;32,2041" 'ConstACl2
b1 = "0,2916;0,3248;0,2396;0,2234;0,2138;0,179;0,1814;0,1545;0,1382;0,1133" 'PrixK1
B2 = "0,1944;0,2165;0,1597;0,1489;0,1425;0,1193;0,1209;0,103;0,0921;0,0755" 'PrixK2
End Function

Public Function FraisKilometrique(KilEffect As Double, Optional Classe As Integer) As Double
Dim d As Double
Dim p As Double

'Le prix de base seconde classe, pour les trzajets dans certains trains autres que TGV,
'est calculé selon la formule : P = a + bd

'P étant le prix, remboursé par l'administration
'a étant une constante
'b étant le prix kilométrique
'd étant la distance tarifaire
d = KilEffect

'Je monte en mémoire le barème fiscal
Call BaremeFiscal

If IsMissing(Classe) Then
Classe = 2
End If

If Classe <> 1 And Classe <> 2 Then
WarningUser = MsgBox("Il y a un problème dans le deuxième paramètre, choisir 1 ou 2", vbExclamation, "ATTENTION AUX PARAMETRES !")
FraisKilometrique = 0
Exit Function
End If

'scenario de remboursement au kilomètre max parcouru :

'distance tarifaire
Select Case d

        Case 1 To 16

            If Classe = 1 Then
            a = Split(A1, ";")(0)
            b = Split(b1, ";")(0)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(0)
            b = Split(B2, ";")(0)
            End If

        Case 17 To 32

            If Classe = 1 Then
            a = Split(A1, ";")(1)
            b = Split(b1, ";")(1)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(1)
            b = Split(B2, ";")(1)
            End If

        Case 33 To 64

            If Classe = 1 Then
            a = Split(A1, ";")(2)
            b = Split(b1, ";")(2)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(2)
            b = Split(B2, ";")(2)
            End If

        Case 65 To 109

            If Classe = 1 Then

            a = Split(A1, ";")(3)
            b = Split(b1, ";")(3)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(3)
             b = Split(B2, ";")(3)

            End If

        Case 110 To 149

            If Classe = 1 Then

            a = Split(A1, ";")(4)
            b = Split(b1, ";")(4)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(4)
            b = Split(B2, ";")(4)

            End If

        Case 150 To 199

            If Classe = 1 Then

            a = Split(A1, ";")(5)
            b = Split(b1, ";")(5)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(5)
            b = Split(B2, ";")(5)

            End If

        Case 200 To 300


            If Classe = 1 Then

            a = Split(A1, ";")(6)
            b = Split(b1, ";")(6)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(6)
            b = Split(B2, ";")(6)
            End If

        Case 301 To 499

            If Classe = 1 Then

            a = Split(A1, ";")(7)
            b = Split(b1, ";")(7)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(7)
            b = Split(B2, ";")(7)

            End If

        Case 500 To 799

            If Classe = 1 Then

            a = Split(A1, ";")(8)
            b = Split(b1, ";")(8)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(8)
            b = Split(B2, ";")(8)
            End If

        Case 800 To 9999

            If Classe = 1 Then

            a = Split(A1, ";")(9)
            b = Split(b1, ";")(9)
            ElseIf Classe = 2 Then
            a = Split(A2, ";")(9)
            b = Split(B2, ";")(9)

            End If


End Select
p = CDbl(a) + (CDbl(b)*CDbl(d))
FraisKilometrique = Round(CDbl(p), 3)

'en sortie, j'arrondi, à trois chiffres après la virgule,
'afin de recalculer sans erreur d'approximation par la suite


End Function


LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !