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

Access Discussion :

Somme cumulée avec variables


Sujet :

Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Somme cumulée avec variables
    Bonjour tout le monde,

    Je me présente, Arvis. C'est la première que je poste ici car je suis coincé avec un calcul. Je dois réaliser la somme cumulée sur 25 ans mais il y a des variables en plus. Je n'arrive pas à trouver le code dans la requête.

    Je pars de ce tableau Excel :


    A B C
    1 =5 =B1
    2 =B1*1,1*1,2 =C1*1,3+B2
    3 =B2*1,1*1,2 =C2*1,3+B3
    4 =B3*1,1*1,2 =C3*1,3+B4
    5 =B4*1,1*1,2 =C4*1,3+B5
    … … …


    j'ai réussi à calculer la première colonne B comme ceci:


    [Valeur de départ]*([1,1]*[1,2])^([ID]-1)

    mais pas la deuxième... A mon avis, je dois faire une boucle en VBA mais je ne suis pas habitué.


    Est-ce que quelqu'un peut m'aider s'il vous plaît ?

    Merci d'avance.

    Arvis.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    14 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 14 823
    Points : 22 559
    Points
    22 559
    Par défaut
    Bonjour.

    Désolé je ne suis pas ton calcul alors je vais te faire une réponse générique pour Access.
    Contrairement à Excel, Access n'a pas la notion de ligne précédente ou suivante donc faire A2=A1+1 en Access s'avère pas mal plus compliqué.
    En Access, il faut faire la somme de tous les éléments que tu veux additionner et cela avec un critère de sélection.
    Ici un exemple de total à date :

    Date Qte Qte Total Qte
    2021-04-01 10 10
    2021-04-02 20 30
    2021-04-03 30 60

    Prenons la ligne 2021-04-03, et bien on n'a pas fait la somme du total précédent et de la quantité de la ligne (30 + 30). On fait la somme de toutes les quantités dont la date est inférieure ou égale à 2021-04-03 (10 + 20 + 30).

    Cela peut se coder comme ceci dans une requête basée sur MaTableDateQte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    To=DSum("Qte"; "MaTableDateQte"; "[DateQte]<=#" format([MaTableDateQte].[DateQte]; "aaaa-mm-jj") & "#")
    • Access va traduire DSum en français pour toi.
    • Le # est pour indiquer à Access qu'il va recevoir une date.
    • "[DateQte]<=#" format([MaTableDateQte].[DateQte]; "aaaa-mm-jj") & "#" indique à Access qu'il doit considérer tous les enregistrements (ligne) jusqu'à la date de l'enregistrement courant.
    • Le format([MaTableDateQte].[DateQte]; "aaaa-mm-jj") force Access à mettre la date dans l'ordre : année, mois, jour.
      Ce n'est pas indispensable mais j'ai appris avec l'expérience que cela évite à Access de confondre le mois et le jour pour les dates du type 01/02/2021 et donc de lire le 2 janvier au lieu du 1er février.
      Ce danger est particulièrement présent si tu travailles comme moi dans un environnement multilingue où les conventions pour les dates ne sont pas les même en Anglais (MM/JJ/AAAA) et Français (JJ/MM/AAAA).


    Attention si tu as beaucoup de données ce calcul peut prendre du temps ... dans ce cas là il faut s'orienter vers une table temporaire et du code VBA mais c'est une toute autre histoire.
    Autre gros défaut de cette solution c'est que cela te prend un critère de sélection et que parfois on n'en a pas.
    On peut parfois ajouter un champ Autonum (Numéo Auto) qui va attribuer un numéro croissant aux enregistrements mais il n'y a pas de réponse universelle à ce problème.

    Et en règle générale quand tu te dis qu'il va falloir faire une boucle, tu peux souvent résoudre le problème avec une requête ce qui est habituellement plus performant que de faire du code VBA.

    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
    Candidat au Club
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour marot_r,

    et merci beaucoup d'avoir répondu si rapidement.

    Malheureusement, j'ai déjà essayé avec Dsum mais cela ne marche pas .

    Je ne vois pas d'autre solution que faire du VBA.

    a+

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    14 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 14 823
    Points : 22 559
    Points
    22 559
    Par défaut
    Bonjour.

    Malheureusement, j'ai déjà essayé avec Dsum mais cela ne marche pas .
    ça ne marche pas comment ?
    1. Tu as un message d'erreur ? Si oui, lequel ?
    2. Tu n'as pas d'erreur mais pas le bon résultat ? Qu'attendais-tu ? Qu'as-tu eu ?
    3. Tu n'as pas de résultat du tout ?
    4. Autre chose ?


    Qu'as-tu mis dans ton DSum() ?

    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.

  5. #5
    Candidat au Club
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour marot_r,

    je n'ai jamais réussi à avoir le bon résultat (je ne sais plus te dire ce que j'avais écrit car j'ai abondonné dsum, la requête était trop lente), le soucis c'est que la formule dois reprendre le chiffre de l'autre colonne (valeur). J'ai une requête qui calcul ceci et je dois trouver la formule pour la colonne "Reajustement" :

    Nom : Capture.PNG
Affichages : 48
Taille : 9,7 Ko

    Merci pour ton aide

    a+

    Arvis.

  6. #6
    Rédacteur/Modérateur
    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    6 943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 6 943
    Points : 15 755
    Points
    15 755
    Billets dans le blog
    21
    Par défaut
    Bonsoir,

    Je pense en effet que tu dois utiliser du code VBA :

    Tu créés une fonction EvalReAjustement qui ouvre un recordset rs basé sur ta table. Utilise de préférence DAO pour ce type de fonction, et ensuite tu parcours ton recordset depuis le 1er ID, jusqu'à l'ID courant, et tu enchaines les calculs à chaque passage de boucle :

    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
    ...
    Do Until rs!ID > ID
            If v = 0 Then
                v = rs!Economie * (1.1 * 0.995) ^ (rs!ID - 1)
                EvalReAjustement = v
            Else
                v =rs!Economie * (1.1 * 0.995) ^ (rs!ID - 1)
                EvalReAjustement = (1.06 * EvalReAjustement) + v
            End If
            rs.MoveNext
            If rs.EOF Then
                Exit Do
            End If
        Loop
    ...
    Ensuite, une fois ta fonction écrite dans un module indépendant, tu l'appelles dans ta requête comme ceci :

    ReAjustement: EvalReAjustement([ID])

    le paramètre [ID] passe à la fonction la valeur de l'ID courant.

    Note que suivant le même principe, tu peux également mettre à jour une colonne supplémentaire de ta table avec une procédure.

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON


    Portez-vous bien

  7. #7
    Candidat au Club
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour User,

    un grand merci pour ta réponse et désolé de ne répondre qu'aujourd'hui.

    Par contre je ne sais pas du tout ou je dois écrire le code et je ne connais rien au recordset...

    A vrai dire c'est un peu du chinois pour moi

  8. #8
    Rédacteur/Modérateur
    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    6 943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 6 943
    Points : 15 755
    Points
    15 755
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Comme je l'ai précisé il faut l'écrire dans un module indépendant, pour ensuite l'appeler dans une requête.

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON


    Portez-vous bien

Discussions similaires

  1. [XL-2007] Somme cumulée avec réinitialisation
    Par dvdhag123 dans le forum Excel
    Réponses: 6
    Dernier message: 24/03/2016, 09h25
  2. [VxiR2] Somme cumulative avec réinitialisation
    Par munity dans le forum Deski
    Réponses: 5
    Dernier message: 08/11/2014, 21h42
  3. Somme Cumulative avec des Si Alors
    Par Ninaa07 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/12/2011, 16h59
  4. SOMME.SI avec variables comme ligne
    Par novice06000 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/12/2011, 16h10
  5. Réponses: 8
    Dernier message: 23/02/2008, 09h49

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