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.SI.ENS avec plusieurs critères en MACRO [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut Somme.SI.ENS avec plusieurs critères en MACRO
    Bonjour,

    Je suis nouveau sur VBA, je veux créer un script vba qui va me permettre de faire la somme de quelques cellules sur une feuille et les afficher sur une autre feuille selon quelques critères, et selon le choix de l'utilisateur.

    Vous allez trouver mon fichier en ci-joint.

    Exemple : Quand l'utilisateur fait le choix de "Blle SOM 20ML" dans la liste déroulante sur la feuil TEST, le programme fait la recherche des références qui se trouvent sur la colonne C dans "Nomen" dans la feuil "Détails" et que leurs mois d'exécution est de JANVIER (Feuil Détails Colonne J) et faire la somme de la colonne H (Détails) et présenter les résultats sur la feuil TEST dans les cellules C5:N5 dans la cellule qui représente Janvier.

    J'en est essayer de le faire avec une fonction Excel et apriori ça marche pour le mois de Janvier, mais je pense que cela sera plus fonctionnel avec un Macro VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {=SOMME(SOMME.SI(Détails!B:B;Nomen!C4:C35;Détails!H:H);SOMME.SI(Nomen!C2:H2;Test!B2;Détails!H:H);SOMME.SI(Détails!J:J;Test!C3;Détails!H:H))}
    Merci pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Regarde du côté de SOMME.SI.ENS qui te permet de mettre plusieurs conditions.
    Attention au 1er paramètre qui est la plage à sommer contrairement su SOMME.SI qui utilise le dernier.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut
    Merci Parmi pour ta réponse.
    Mais j'aimerai bien un exemple pour appliquer cette fonction en VBA.

    Merci

  4. #4
    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
    le plus simple est une transposition direct (après anglicisation) avec Evaluate ou WorksheetFunction.
    https://msdn.microsoft.com/library/0...ice.15%29.aspx
    https://msdn.microsoft.com/library/f...ice.15%29.aspx

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut
    Merci Menhir.

    Moi j'avais fais un essai avec la fonction Somme.Si.Ens sur excel et j'avais pris comme exemple le mois de Janvier et je l'ai trouvé fonctionnel, donc me reste maintenant que d'utiliser l'un des deux transpositions que tu viens de me montrer sur ce code Excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {=SOMME(SOMME.SI.ENS(Détails!H:H;Détails!B:B;Nomen!C4:C35;Détails!J:J;C3))}

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut
    Bonjour,

    J'ai toujours un problème avec la fonction SumIfs, apparemment j'ai trouvé la bonne syntaxe de la fonction, mais le résultat renvoyé est 0.
    Voici mon code :
    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
    45
    46
    47
    48
    49
    50
    Dim Plagerefsom20 As Variant
    Dim Plagerefeur20 As Variant
    Dim Plagerefeur30 As Variant
    Dim Plagemois As Variant
    Dim Plageref As Variant
    Dim PlageSomme As Variant
     
    Dim Somme As Long
    Dim RSum As Variant
    Dim RArg1 As Variant
    Dim Arg1 As Variant
    Dim RArg2 As Variant
    Dim Arg2 As Variant
     
    Dim i As Byte
    Dim j As Byte
    Dim k As Byte
    Dim l As Byte
     
    For i = 4 To 50
    For j = 3 To 6
    For k = 4 To 11
    For l = 2 To 200
     
    Set Plagerefsom20 = Worksheets("Nomen").Cells(3, i)
    Set Plagerefeur20 = Worksheets("Nomen").Cells(12, j)
    Set Plagerefeur30 = Worksheets("Nomen").Cells(7, k)
    Set Plagemois = Worksheets("DETAILS").Cells(10, l)
    Set Plageref = Worksheets("DETAILS").Cells(2, l)
    Set PlageSomme = Worksheets("DETAILS").Cells(8, l)
     
    Set RSum = PlageSomme
    Set RArg1 = Plageref
    Set Arg1 = Plagerefsom20
    Set RArg2 = Plagemois
    Set Arg2 = Worksheets("Test").Range("C2")
     
       If Worksheets("Test").Range("B2").Text = Worksheets("Nomen").Range("C2").Text Then
     
    Somme = Application.WorksheetFunction.SumIfs(RSum, RArg1, Arg1, RArg2, Arg2)
     
    Worksheets("Test").Range("C23").Value = Somme
     
    End If
    Exit Sub
    Next
    Next
    Next
    Next
    End Sub
    Je vous remercie pour votre aide.

  7. #7
    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
    Etant donné que le premier argument de SumIfs est la plage de cellules à sommer, il est étonnant que la variable supposée contenir cette plage ne contienne qu'une seule cellule...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set PlageSomme = Worksheets("DETAILS").Cells(8, l)
    Set RSum = PlageSomme
    Somme = Application.WorksheetFunction.SumIfs(RSum, RArg1, Arg1, RArg2, Arg2)

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut
    Apriori je l'ai mis à l'envers.

    Normalement la syntaxe de Cells est la suivante : Cells (Ligne, Colonne)
    La plage à sommer sur mon fichier est la colonne H (Colonne numéro 8), et de la ligne 2 à 174 (Variable l)

    Donc j'avais modifié le code et sa marche toujours pas :

    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
    For i = 4 To 50 'Ligne
    For j = 3 To 6 'Ligne
    For k = 4 To 11 'Ligne
    For l = 2 To 174 'Ligne
     
    Set Plagerefsom20 = Worksheets("Nomen").Cells(i, 3)
    Set Plagerefeur20 = Worksheets("Nomen").Cells(j, 12)
    Set Plagerefeur30 = Worksheets("Nomen").Cells(k, 7)
    Set Plagemois = Worksheets("DETAILS").Cells(l, 10)
    Set Plageref = Worksheets("DETAILS").Cells(l, 2)
    Set PlageSomme = Worksheets("DETAILS").Cells(l, 8)
     
    Set RSum = PlageSomme
    Set RArg1 = Plageref
    Set Arg1 = Plagerefsom20
    Set RArg2 = Plagemois
    Set Arg2 = Worksheets("Test").Range("C2")
     
       If Worksheets("Test").Range("B2").Text = Worksheets("Nomen").Range("C2").Text Then
     
    Somme = Application.WorksheetFunction.SumIfs(RSum, RArg1, Arg1, RArg2, Arg2)
     
    Worksheets("Test").Range("C23").Value = Somme
    EndIf

  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 Ihaben Voir le message
    Donc j'avais modifié le code et sa marche toujours pas :
    Ce qui est normal puisque la zone à sommer est toujours limitée à une seule cellule.

    Et comme, en plus, à chaque tour, tu écrases le résultat du tour précédent en C23, tu ne pourras voir au final qu'un seul (le dernier) des 238 048 calculs de somme qui ont été faits.

    Sans compter que je ne comprends vraiment pas pourquoi tu passes par deux variables pour chaque paramètre.
    En plus, le type Variant, ce n'est vraiment pas une bonne idée pour transmettre des paramètres.

    Et, à mon avis (donc sans certitudes), il semble étrange que tu ais besoin à la fois de quatre boucles For et d'une SumIfs (mais, n'ayant pas vraiment compris ce que tu veux faire, je peux me tromper sur ce dernier point).

    Bref, je pense que c'est toute ta macro dans sa structure qui est à revoir.

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut
    Bonjour, Menhir,

    Ce que je veux faire est le suivant :

    • Appuyer sur le bouton "STOCKS" pour lancer le UserForm (Feuil Test)
    • Faire un choix parmi la liste déroulante. Par Exemple "Blle SOM 20ML" (Critère 1 entouré en Vert)
    • Ce choix représente une liste de référence qui se trouve sur la feuil "Nomen"
    • La plage C3:N3 représente les mois d'exécution (Feuil Test) (Critère 2 entouré en rouge)
    • Chercher les références selon les deux critères sur la feuil DETAILS (Critère 1 dans la colonne B et Critère 2 dans la colonne J)et faire la somme de la colonne H selon les deux critères
    • Afficher le résultat sur la feuil "Test" Plage C5:N5 selon les mois (Entouré en Rouge)


    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
    Dim Plagerefsom20 As Variant
    Dim Plagerefeur20 As Variant
    Dim Plagerefeur30 As Variant
    Dim Plagemois As Variant
    Dim Plageref As Variant
    Dim PlageSomme As Variant
    Dim Arg1 As Variant
    Dim Arg2 As Variant
     
    Plagerefsom20 = Worksheets("Nomen").Range("C4:C50")
    Plagerefeur20 = Worksheets("Nomen").Range("L3:L6")
    Plagerefeur30 = Worksheets("Nomen").Range("G4:G11")
    Plagemois = Worksheets("DETAILS").Range("J2:J174")
    Plageref = Worksheets("DETAILS").Range("B2:B174")
    PlageSomme = Worksheets("DETAILS").Range("H2:H174")
    Arg1 = Worksheets("Nomen").Range("C4:C50")
    Arg2 = Worksheets("Test").Range("C2")
     
       If Worksheets("Test").Range("B2").Text = Worksheets("Nomen").Range("C2").Text Then
     
    Worksheets("Test").Range("C23").Value = Application.WorksheetFunction.SumIfs(Range("H2:H174"), Range("B2:B174"), Arg1, Range("J2:J174"), Arg2)
     
    End If
    Ce code est un Test que j'ai fais que pour le mois de JANVIER, et le résultat sera affiché sur la cellule C23 dans la feuil "Test"

    J'espère que je me suis bien expliqué.

    Nom : Capture.JPG
Affichages : 5518
Taille : 124,7 Ko

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Sans être certain, je pense que tu doives spécifier le nom de la feuille des Range dans ta formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Test").Range("C23").Value = Application.WorksheetFunction.SumIfs(Sheets("DETAILS").Range("H2:H174"), Sheets("DETAILS").Range("B2:B174"), Arg1, Sheets("DETAILS").Range("J2:J174"), Arg2)

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut
    Déjà désolé pour le réponse retardé et merci pour ta réponse parmi.

    J'ai essayé ce que tu ma proposé, mais ça marche toujours pas, j'ai toujours un retour de 0.

    Même si j'ai essayé d'optimiser mon tableau excel pour faciliter la recherche mais toujours pas.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Arg1 et Arg2 ne devraient pas être des plages mais des valeurs, à ce que je sache...
    Commence par créer ta formule manuellement et, si ça fonctionne bien, transfères-la en VBA si besoin est...

  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur Supply Chain
    Inscrit en
    Février 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Février 2018
    Messages : 49
    Par défaut
    Problème résolu les amis, je vous remercie beaucoup pour vos aides.
    J'avais refais la structure de mon fichier Excel, et ça marcher.
    Je vais mettre le code VBA en dessous, si au cas ou il y a quelqu'un qui en aura besoin de la formule SumIfs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Worksheets("Test").Range("B2").Text = Worksheets("Nomen").Range("A6").Text Then
     
    Worksheets("Test").Range("C5").Value = Application.WorksheetFunction.SumIfs(Worksheets("DETAILS").Range("J2:J174"), Worksheets("DETAILS").Range("C2:C174"), Worksheets("Nomen").Range("A6"), Worksheets("DETAILS").Range("L2:L174"), Worksheets("Test").Range("C3"))

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

Discussions similaires

  1. [XL-2010] vba excel: fonction VLOOKUP avec plusieurs résultats
    Par LANGAZOU dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/05/2017, 21h46
  2. EXCEL : fonction SOMME.SI avec 2 critères
    Par repié dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/03/2016, 17h10
  3. [XL-2003] VBA comparaison de lignes avec plusieurs critères
    Par klissou69 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/07/2013, 10h49
  4. VBA-E Comment réaliser une recherche avec plusieurs critères ?
    Par Larsen21 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/12/2006, 13h43

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