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 :

Problème de mise en place de la fonction Sumifs


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Problème de mise en place de la fonction Sumifs
    Bonjour,

    Je souhaite réaliser un tableau à partir de dates et de valeurs respectant des conditions sur les mois et les années.
    Dans une première feuille (Feuille 1) j'ai:
    -Colonne 1 : des dates, jour par jour, sur plusieurs mois et années.
    - Colonne 2 : des valeurs, associées à chaque date

    Dans une Feuille 2, je souhaite regrouper par mois les valeurs:
    -Colonne 1 : les mois pour chaque années (Sept. 2012 / Oct 2012/ Nov 2012 / Dec 2012 / Janv 2013 etc...)
    -Colonne 2: la somme des valeurs journalières pour chaque mois

    Pour celà j'ai utilisé la fonction SumIfs avec une condition sur le mois et une sur l'année que je souhaite appliquer à la Colonne 2 de la Feuille 2. Mon code en français donnerais
    Pour une ligne Y en Feuille 2, "Si le mois ET l'année de la ligne X de la colonne 1 en Feuille 1 est égale à mois et année de la ligne Y en Feuille 2, alors additionne la valeur en Colonne 2 Feuille 1 en inscrivant la valeur en Ligne Y Colonne 2 Feuille 2.
    J'espère avoir été clair sur ce coup là

    Le code utilisé est :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Dim premdate As Date
    Dim derndate As Date
    Dim ligne_valeur As Long
    ligne_valeur = 24
    Dim Plage_mois_valeur As Range
    Dim dernligne As Long
    Dim Plage_date_valeur As Range
    Dim Plage_valeur As Range
    Dim datevar As Date 'Variable de la boucle for
     
    Dim Mois_Calcul_valeur As Long
    Dim Annee_Calcul_valeur As Long
     
    Dim mois_valeur As Long
    Dim annee_valeur As Long
     
    ''''''''''''''''''''Définition de la plage pour contabiliser les valeurs''''''
    premdate = Sheets("Data 1").Cells(2, 1).Value
    Sheets("Bilan").Activate
    derndate = Date                     'Ici par défaut, le dernier mois considéré est le mois actuel, à partir de la date d'aujourd'hui
     
    ''''''''''''''''''''' Mise en place de la plage des mois'''''''''''''''''''''
    Do While premdate < derndate
     
    Cells(rang_valeur, 1).Value = premdate
    Cells(rang_valeur, 1).NumberFormat = "mm/yyyy"
    rang_valeur= rang_valeur+ 1
    premdate = premdate + DateAdd("m", 1, 0)
    Loop
     
    With Worksheets("Bilan")
        Set Plage_mois_valeur = .Range(.Cells(24, 1), .Cells(.Rows.Count, 1).End(xlUp))
    End With
     
    premdate = Sheets("Data 1").Cells(2, 1).Value  'On remet la date à la valeur initiale après avoir comptabilisé les mois
     
    ''''''''''''''''''''Définition de la plage des jours_DJU et des DJU_18 calculés'''''''''''''
     
    Sheets("Calcul de Valeur").Activate
    Range("A2").End(xlDown).Select
    dernligne = ActiveCell.Row
     
     
    With Worksheets("Calcul de Valeur")
        Set Plage_date_valeur = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        Set Plage_valeur = .Range(.Cells(2, 2), .Cells(dernligne, 2))
    End With
     
    '''''''''''''''''''''''''''''''''' Boucle de calcul pour les valeurs par mois''''''''''''
     
    For datevar = premdate To derndate
     
    Mois_Calcul_valeur = Month(datevar) 'Correspondant aux dates des cellules pour le calcul journalier
    Annee_Calcul_valeur = Year(datevar)
     
        For Each Cel In Plage_mois_valeur
     
    mois_valeur = Month(Cel)  'Correspondat aux dates des mois à comptabiliser
    annee_valeur = Year(Cel)
     
    Cel.Offset(0, 1).Value = WorksheetFunction.SumIfs(Plage_valeur, Plage_date_valeur, mois_valeur  = Mois_Calcul_valeur, Plage_date_valeur, annee_valeur  = Annee_Calcul_valeur)
        Next
     
    Next datevar
    J'ai essayé de changer la structure dans le SumIfs mais sans succès car la valeur renvoyée est toujours 0.

    Des idées pour m'aider sur ce sujet là?

    Merci beaucoup!

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour LorenzoN,

    Voici un bout de code qui pourrait convenir à ton besoin (à adapter : changer le nom des feuilles ) !
    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
    Option Explicit
     
    Sub loren()
    Dim rng_1 As Range
    Dim rng_2 As Range
    Dim sum_mnth As Double
    Dim cur_mnth As Integer
    Dim cur_yr As Integer
    Dim i As Integer, j As Integer
     
    With Worksheets("Loren2")
        Set rng_2 = .Range("A1")
        For i = 0 To .Columns(1).Find("*", , , , , xlPrevious).Row - 1
            cur_mnth = Month(rng_2.Offset(i, 0))
            cur_yr = Year(rng_2.Offset(i, 0))
     
            With Worksheets("Loren1")
                Set rng_1 = .Range("A1")
                sum_mnth = 0
     
                For j = 0 To .Columns(1).Find("*", , , , , xlPrevious).Row - 1
                    If Month(rng_1.Offset(j, 0)) = cur_mnth And Year(rng_1.Offset(j, 0)) = cur_yr Then
                        sum_mnth = sum_mnth + rng_1.Offset(j, 1)
                    End If
                Next j
            End With
     
            rng_2.Offset(i, 1) = sum_mnth
        Next i
    End With
    End Sub
    N'hésite pas à revenir vers moi pour tout complément !

    Cordialement,
    Kimy

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour ta réponse.

    ça marche parfaitement bien et ça résout mon problème.

    J'avoue que, j'avais même pas envisagé d'écrire les choses de cette manière en mettant les boucles dans le With.
    Maintenant je vais essayer de bien comprendre le fonctionnement et l'appliquer aux cas futurs!

    Et une question encore.
    Pourquoi utiliser un FIND dans le for?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Columns(1).Find("*", , , , , xlPrevious).Row - 1
    Une raison particulière?
    J'aurais mis quelques chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Rows.Count, 1).End(xlUp).Row
    Ou c'est la même chose?

    En tout cas, vraiment merci beaucoup!!

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    LorenzoN,

    C'est la même chose !
    La différence entre Columns(1).Find("*", , , , , xlPrevious).Row - 1 et .Cells(.Rows.Count, 1).End(xlUp).Row se situe principalement au niveau des versions d'Excel.
    Je pense que celle que tu proposes est "plus rapide" (de l'ordre de quelques millièmes de seconde) mais peut être problématique quand tu utilises des version d'Excel plus anciennes qui ne connaissent pas les arguments que tu utilises.

    En bref, j'ai pris l'habitude d'utiliser la formule que tu pointes et je me protège des anciennes versions par la même occasion.

    Cependant, je devrais peut-être me mettre à la page et utiliser pour de bon les fonctions proposées !

    Bref, ravis d'avoir aidé !
    si utile et en bas de post !

    Cordialement,
    Kimy

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

Discussions similaires

  1. Problème de mise en place channel bonding
    Par juanito7 dans le forum Réseau
    Réponses: 9
    Dernier message: 11/06/2007, 14h04
  2. [PHP-JS] Mise en place d'une fonction recherche
    Par barbapapa2 dans le forum Langage
    Réponses: 6
    Dernier message: 02/12/2006, 19h03
  3. Problème de mise en place de datasource pour Hibernate
    Par K-Kaï dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 27/07/2006, 10h41
  4. Problème de mise en place de la log4j
    Par pitit777 dans le forum Logging
    Réponses: 2
    Dernier message: 28/03/2006, 15h17
  5. Réponses: 4
    Dernier message: 07/01/2006, 22h56

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