IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Déclaration d'un tableau en paramètre d'une fonction calcul de tranche


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Par défaut Déclaration d'un tableau en paramètre d'une fonction calcul de tranche
    Bonjour,

    J'aimerais créer une fonction de calcul de tranches que je présenterai ainsi :
    =TRANCHE(Montant;Tranche1;Taux1;Tranche2;Taux2...)

    et qui permettrait d'effectuer des calculs comme par exemple celui de l'impôt sur le revenu.


    Pour déclarer un tableau dans ma fonction, j'ai honteusement pompé sur :

    http://www.developpez.net/forums/d68...ble-parametre/


    Et j'ai créé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Sub PasserTableauEnParamètre()
    MT = Array(10000, 2000, 0.1, 5000, 0.05, 20000, 0.03)
    JeSuisEnManque (MT)
    End Sub
    Sub JeSuisEnManque(LeTableau)
    For i = 0 To UBound(LeTableau)
        If i = 0 Then ' 1er argument le montant de base
     
        base = LeTableau(i)
     
        Else
     
     
                If i Mod 2 = 1 Then ' cas du montant
     
     
     
                    If base < LeTableau(i) Then
     
                    composant = base - tr_moins
     
     
                    Else
                    composant = LeTableau(i) - tr_moins
     
                    End If
     
     
                tr_moins = LeTableau(i)
     
                Else ' cas du taux
     
                resultat = resultat + composant * LeTableau(i)
                End If
        End If
     
     
    Next
    Debug.Print resultat
     
     
     
    End Sub
    Dont le Debug.Print resultat doit ramener 500 car :
    (2000-0)*10%+(5000-2000)*5%+(10000-5000)*3%, ça fait 500
    Donc mon code fonctionne

    1-Est-ce que l'un d'entre vous pourrait simpliifier ce code, car j'ai l'impression de tourner un peu en rond avec mes boucles et mes If.

    2- Comment pourrais-je publier une fonction que l'utilisateur renseignerait ainsi :

    =TRANCHE(10000; 2000; 0,1; 5000; 0,05; 20000; 0,03)

    sans passer par deux sub et sans mettre mes arguments dans le code.

    3-Est-il possible de déclarer Montant comme un Double et Tranche et Taux comme deux colonnes d'un tableau ? En solidarisant la colonne Tranche avec celle du TAUX (l'une entrainant forcément une saisie dans l'autre)

    Merci beaucoup pour votre aide.

    JPG

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Ton code parait assez simple, pour tes tranches tu pourrais utiliser
    • un tableau de réels doubles à 2 dimensions,
    • un tableau de structures ou
    • une collection d'objet
    cela rendrai le code un peu plus lisible mais forcément plus court.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre confirmé
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Par défaut
    Merci pour ta réponse.

    J'opterais plutôt pour un tableau de réels doubles à 2 dimensions, mais je ne sais pas comment le déclarer en paramètres de ma fonction.

    Et je voudrais éviter de passer par la Sub PasserTableauEnParamètre().

    Il n'existe pas quelque chose du style :

    Sub TRANCHE(Montant as Double, Tranche, Taux as Array)

    Ou Array réel double à deux dimensions ?

    Merci encore.

  4. #4
    Membre confirmé
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Par défaut
    Suite,

    J'ai réussi à faire ce code qui marche bien et qui est beaucoup plus simple que le précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Function TRANCHE(Montant As Double, ParamArray LeTableau())
     
    For i = 0 To UBound(LeTableau)
     
                If i Mod 2 = 0 Then ' cas du montant
     
                    If Montant < LeTableau(i) Then
                    composant = Montant - tr_moins
                    Else
                    composant = LeTableau(i) - tr_moins
                    End If
     
     
                tr_moins = LeTableau(i)
     
                Else ' cas du taux
                taux = LeTableau(i)
                TRANCHE = TRANCHE + composant * taux
     
                End If
    Next
     
    ' en ajoutant le cas où le montant serait supérieur à ma dernière tranche (de 8000 jusqu'à l'infini dans l'exemple ci-dessous)
    If tr_moins < Montant Then
    TRANCHE = TRANCHE + (Montant - tr_moins) * taux
    End If
     
     
     
     
    End Function
    ? TRANCHE(10000, 2000, 0.2, 5000, 0.05, 8000, 0.04) devrait donner 750


    Par contre, ce que je ne trouve toujours pas clean c'est que je n'arrive pas à dimensionner mon tableau et que le jour où j'aurai 7 colonnes, je serai bien embêté.

    Et que cette deuxième dimension puisse me permettre de rapprocher
    2000 avec 0.2
    5000 avec 0.05
    8000 avec 0.04

    Merci encore.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Les tableaux sont de type variant quand on les passe en paramètre.

    Je ne l'ai jamais fait mais cela devrait être un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dim tTrancheTaux(2,1) as double 'Tableau de 3 x 2 éléments
    dim i as long:i=0
    tTrancheTaux(i, 0)=2000 ; tTrancheTaux(i 1)=0.2
     
    i=i+1
    tTrancheTaux(i, 0)=5000 ; tTrancheTaux(i 1)=0.05
     
    i=i+1
    tTrancheTaux(i, 0)=8000 ; tTrancheTaux(i 1)=0.04
     
    call TRANCHE(montant, tTrancheTaux)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function TRANCHE(Montant As Double, prmTrancheTaux() as variant)
       dim i as long:for i=lbound(prmTrancheTaux(0)) to ubound(prmTrancheTaux(0))
       '
       ' Ici ton code de calcul
       '
       next i
    End function
    Une autre solution serait de passer tes infos via une tables de paramètre qui contiendrai la liste des tranches et des taux c'est la méthode la plus simple qui permet facilement d'ajouter une tranche et un taux, d'avoir une structure claire (un champ Tranche et un champ Taux).

    Après tu n'as plus qu'à parcourir la table pour récupérer tes données. Exemple de code qui fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim db as dao.database:set db=currentdb
    dim r as dao.recordest:set r=db.openRecordset("TrancheTaux")
     
    do while not r.eof()
        debug.print r!Tranche], r![Taux]
        r.movenext
    loop
     
    r.close:set r-nothing 'Ferme et libère la mémoire utilisée par l'objet
    set db=nothing
    'Libère la mémoire utilisée par l'objet


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Membre confirmé
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Par défaut
    Bonjour,


    Voici le code que j'ai finalement pondu et qui permet (en plus) de calculer l'"AU DELA". Ce que j'avais complètement oublié dans la version précédente

    Elle se présenterait ainsi :
    ? tranche(5000,2500,0.10,AUDELA,0.20)
    et donnerait donc 750

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Function TRANCHE(Montant As Double, ParamArray LeTableau())
     
    For i = 0 To UBound(LeTableau)
     
    If LeTableau(i) = "AUDELA" Then LeTableau(i) = Montant
     
                If i Mod 2 = 0 Then ' cas du montant
     
                    If Montant < LeTableau(i) Then
                    composant = Montant - tr_moins
                    tr_moins = Montant
                    Else
                    composant = LeTableau(i) - tr_moins
                    tr_moins = LeTableau(i)
                    End If
     
     
                Else ' cas du taux
                taux = LeTableau(i)
                TRANCHE = TRANCHE + composant * taux
     
                End If
    Next
     
    If tr_moins < Montant Then
    TRANCHE = TRANCHE + (Montant - tr_moins) * taux
    End If
     
     
    End Function
    Je n'ai pas opté pour la table, même si j'en ai créé une temporaire pour m'appuyer sur un formulaire (argument de la fonction comme dans XL)

    Merci beaucoup pour votre aide.

  7. #7
    Membre confirmé
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Par défaut
    Bonjour Marot

    Citation Envoyé par marot_r Voir le message
    Une autre solution serait de passer tes infos via une tables de paramètre qui contiendrai la liste des tranches et des taux c'est la méthode la plus simple qui permet facilement d'ajouter une tranche et un taux, d'avoir une structure claire (un champ Tranche et un champ Taux).

    Après tu n'as plus qu'à parcourir la table pour récupérer tes données. Exemple de code qui fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim db as dao.database:set db=currentdb
    dim r as dao.recordest:set r=db.openRecordset("TrancheTaux")
     
    do while not r.eof()
        debug.print r!Tranche], r![Taux]
        r.movenext
    loop
     
    r.close:set r-nothing 'Ferme et libère la mémoire utilisée par l'objet
    set db=nothing
    'Libère la mémoire utilisée par l'objet


    A+
    Comment je fais après pour passer mes r!tranche et r!taux en paramètre de ma fonction. je n'arrive pas à créer un tableau, on me parle d'incompatiblité de type.

Discussions similaires

  1. Tableau en paramètre d'une fonction d'une dll C++
    Par declencher dans le forum Débuter
    Réponses: 18
    Dernier message: 05/08/2011, 23h27
  2. Réponses: 0
    Dernier message: 23/12/2009, 12h38
  3. Section d'un tableau en paramètre d'une fonction
    Par ZeLL dans le forum Fortran
    Réponses: 5
    Dernier message: 18/04/2007, 14h49
  4. Réponses: 6
    Dernier message: 24/07/2006, 15h22
  5. Réponses: 10
    Dernier message: 30/06/2006, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo