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

Macros et VBA Excel Discussion :

Somme conditionnelle avec division


Sujet :

Macros et VBA Excel

  1. #1
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut Somme conditionnelle avec division
    Bonjour,
    J'ai 1 liste de Rdv avec nom du/des intervenant(s), durée du Rdv, sa nature et le nb d'intervenants.
    Ex. : Léa&Léon, 01:00; Réunion; 2
    1 Rdv avec 2 intervenants sera affiché 2 fois dans la liste (l'export est fait par intervenant et je ne peux pas le changer).
    J'ai besoin d'avoir le total d'heures pour chaque action dans l'Ets (ex. Nb d'h. de Réunion...) : quand il y a 2 intervenants je vais trouver 2 fois la ligne donc je dois diviser la durée par 2 pour avoir le bon résultat.
    J'ai nommé les plages pour simplifier : Qui, Duree, Quoi, NbInterv
    La formule "SOMMEPROD((Quoi="Réunion")*Duree/NbInterv)" fait le travail.
    Mais il peut y avoir des lignes avec un Nb d'intervenants=0 (plages inoccupées). Elles sont ignorées du fait que ça ne peut pas être 1 Réunion mais SommeProd ne les ignore pas et j'obtiens "#Div/0".
    J'ai essayé aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    =SOMMEPROD((Quoi="Réunion")*SIERREUR(Duree/NbInterv;0))
    =SOMMEPROD((Quoi="Réunion")*Duree/MAX(1;NbInterv))
    ...ça ne met plus #div/0 mais ça ne donne pas le bon résultat.
    ...j'ai besoin d'aide, si possible en évitant les formules matricielles qui sont difficiles à maintenir et que j'ai du mal à comprendre.
    Merci
    PS j'ai mis un fichier d'exemple
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bib34690 Voir le message
    Bonjour,

    En remplaçant 0 par 1 le nombre d'intervenants pour les cas "Libre", cela fausse-t-il vos calculs ?

  3. #3
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Oui, je ne peux pas modifier le tableau. je pourrais juste mettre une option pour que ça laisse la case vide au lieu de 0 mais mettre 1 est impossible et fausserait d'autres calculs.

  4. #4
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    S'il existait 1 fonction pour remplacer les 0 par des 1 sur la matrice sans toucher au tableau ce serait bon mais j'ai pas trouvé.
    Ex. : Sommeprod(SOMMEPROD((Quoi="Réunion")*Duree/ReplaceMat(NbInterv;0;1))...mais ReplaceMat n'existe pas

  5. #5
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Il n'y a qu'un seul critère à tester. Je n'ai pas forcément besoin de Sommeprod mais à priori Somme.Si ou somme.si.ens n'acceptent pas de calcul (division) comme paramètre.

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((Quoi="Réunion")*(NbInterv>0)*Duree/MAX(1;NbInterv))

  7. #7
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((Quoi="Réunion")*(NbInterv>0)*Duree/MAX(1;NbInterv))
    Merci pour l'idée mais Je l'ai essayé, ça ne marche pas.
    Comme dit dans mon message initial, une Réunion n'a jamais 0 intervenant donc les plages à 0 sont déjà exclues par le 1er critère, ce second n'ajoute rien.
    Max(1;NbInterv) renvoi toujours la plus grande valeur de la matrice. Il n'applique pas le max ligne par ligne.
    Je pense que c'est le même problème avec les Fonctions SI ou SIERREUR qui ne retournent pas des matrices mais 1 valeur unique qui va s'appliquer à toutes les lignes.

  8. #8
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    J'ai réussi à avoir 1 solution avec 1 formule matricielle que je publie pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {=SOMME(SI(Quoi="Réunion";Duree/NbInterv))}
    ou 
    {=SOMMEPROD((Quoi="Réunion")*Duree/SI(NbInterv>0;NbInterv;1))}
    ..si qqun à 1 solution non matricielle je suis preneur.

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par bib34690 Voir le message
    Max(1;NbInterv) renvoi toujours la plus grande valeur de la matrice. Il n'applique pas le max ligne par ligne.
    As-tu essayer de remplacer les noms par de simple références de cellules en adressage relatif ?

  10. #10
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Citation Envoyé par Menhir Voir le message
    As-tu essayer de remplacer les noms par de simple références de cellules en adressage relatif ?
    Oui, idem

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2013
    Messages : 151
    Par défaut
    Bonjour,

    Pourquoi ne pas mettre une valeur très petite dans "NbreInterv", donc pas de division par zéro... et le résultat attendu est bon?

  12. #12
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Citation Envoyé par electrons Voir le message
    Bonjour,

    Pourquoi ne pas mettre une valeur très petite dans "NbreInterv", donc pas de division par zéro... et le résultat attendu est bon?
    Je ne peux pas modifier le tableau

  13. #13
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    Le post ne pourrait pas s'appeler plutôt "somme sans doublons" ??

    Utilisation d'une variable tableau; en colonne 1 (qui) remettre les valeurs/noms dans l'ordre alphabétique
    Utilisation des critères "qui", "quoi", voir "durée" pour repérer les doublons (n'incluant pas les vides en qui).
    Reste à faire la somme …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  14. #14
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Citation Envoyé par RyuAutodidacte Voir le message
    Bonjour,

    Le post ne pourrait pas s'appeler plutôt "somme sans doublons" ??

    Utilisation d'une variable tableau; en colonne 1 (qui) remettre les valeurs/noms dans l'ordre alphabétique
    Utilisation des critères "qui", "quoi", voir "durée" pour repérer les doublons (n'incluant pas les vides en qui).
    Reste à faire la somme …
    La difficulté et la nature de mon interrogation ne porte pas sur le fait qu'il n'y ait pas de doublon mais bien sur la division dans le SommeProd.
    Après tout est question de point de vue...

  15. #15
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,

    En effet, je n'ai fait que répondre de façon à coder en vba puisque l'on est sur le forum macro vba
    Sachant que (sans toucher au tableau) si on enlève les doublons, plus de problème de divisions.
    La méthode diffère, mais permet d'arriver au résultat.

    Concernant SOMMEPROD, essai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((Quoi="Réunion")*SIERREUR((Duree)/(NbInterv);1))
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  16. #16
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    merci pour ton aide, c'est à peu près la formule que j'indiquais dans mon 1er post : ca ne marche pas.
    SIERREUR n'est pas réévalué à chaque ligne.
    Bon, je vais me contenter de la formule matricielle.

  17. #17
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,

    En effet je m'en suis rendu compte après que ça ne marché pas, mea culpa; chose bizarre, la formule avait donné le bon résultat mis en ligne 2 et qd j'ai déplacé la formule avec les bons paramètres bien sur,
    le résultat avait changé et ce plusieurs fois selon la ligne; ce qui ne devrait pas.
    donc en effet il ne te reste plus que la formule matricielle, ou voir créer une fonction VBA utilisable dans une cellule …

    bon courage
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  18. #18
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    une autre approche

    une fonction que l'on pourrait mettre par exemple soit dans le classeur voulu, soit dans le classeur personnel afin d'y avoir accès sur tous les classeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function CalcHeures(Plage As Range, ColH As Byte) As Double 'Plage => Sélectionner ou indiquer la plage - ColH pour indiquer l'enplacement de la colonne des heures, peut être supprimer
    ' Exemple :  =CalcHeures(B2:D8;2)
    Dim Heure As New Collection, VA, V, i&, Calc As Double
        VA = Plage.Value
        On Error Resume Next
        For i = 1 To UBound(VA)
            If VA(i, 1) = "Réunion" And VA(i, 2) > 0 And VA(i, 3) > 0 Then Heure.Add VA(i, ColH), CStr(VA(i, 1) & "|" & VA(i, 2) & "|" & VA(i, 3))
        Next
        On Error GoTo 0
        For Each V In Heure:   Calc = Calc + V:   Next
        CalcHeures = Calc
    End Function
    Dans une cellule :
    En supprimant ColH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function CalcHeures(Plage As Range) As Double 'Plage => Sélectionner ou indiquer la plage
    ' Exemple :  =CalcHeures(B2:D8)
    Dim Heure As New Collection, VA, V, i&, Calc As Double
        VA = Plage.Value
        On Error Resume Next
        For i = 1 To UBound(VA)
            If VA(i, 1) = "Réunion" And VA(i, 2) > 0 And VA(i, 3) > 0 Then Heure.Add VA(i, 2), CStr(VA(i, 1) & "|" & VA(i, 2) & "|" & VA(i, 3))
        Next
        On Error GoTo 0
        For Each V In Heure:   Calc = Calc + V:   Next
        CalcHeures = Calc
    End Function
    Edit : bien sur il faudra mettre la cellule au format heure; le code est fait selon la/les formules présentée(s) dans le post
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  19. #19
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Je vois que tu ne lâches pas le morceau... c'est sympa.
    c'est effectivement une solution, ça fait beaucoup de code mais on maitrise tout.
    Merci pour cette solution.

  20. #20
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,

    Cela correspond à la solution que j'ai proposé en post #13 (qui elle est beaucoup plus complète et précise au niveau du code et du résultat), mais je me suis simplement arrêté à ce qui a été voulu par rapport à la formule.
    Et 12 lignes (11 en enlevant le commentaire) c'est vraiment très très raisonnable en nombre de lignes (le 1er code prenant juste en compte l'emplacement de la colonne des heures avec ColH,au cas où si celle-ci venait à changé de place)
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Somme conditionnelle avec nombre de colonnes non constant
    Par labuche1138 dans le forum SAS Base
    Réponses: 2
    Dernier message: 24/07/2012, 16h20
  2. [XL-2007] Somme conditionnelle avec filtre automatique
    Par Patrock dans le forum Excel
    Réponses: 2
    Dernier message: 24/02/2012, 02h40
  3. [XL-2003] Somme conditionnelle avec condition sur une partie de cellule + RechercheV
    Par Benoit Schwob dans le forum Excel
    Réponses: 13
    Dernier message: 28/04/2011, 23h26
  4. Somme conditionnelle avec un gauche
    Par madevilts dans le forum Excel
    Réponses: 4
    Dernier message: 01/10/2010, 21h41
  5. [XL-2003] Somme conditionnelle avec cellule à evaluer sur la meme ligne
    Par alban.pinel dans le forum Excel
    Réponses: 3
    Dernier message: 22/04/2009, 17h51

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