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 :

VBA - macro Somme colonne plusieurs feuilles sur feuille globale


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut VBA - macro Somme colonne plusieurs feuilles sur feuille globale
    Bonjour,

    Je bloque sur l'élaboration d'une macro VBA.

    Contexte :

    => J'ai plusieurs feuilles dans un classeur avec des entêtes sur la 1ère ligne.
    => en fonction des feuilles, les entêtes ne sont pas dans la même colonne.

    Objectifs :

    => avoir une feuille Total avec toutes les entêtes listés et faire la somme de chaque feuille dans cette feuille Total.

    En gros, une macro qui va chercher dans ma feuille Total chaque entête, fais la somme, puis colle le résultat sur la feuille Total..

    en espérant avoir été clair pour avoir une aide précieuse :-)

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim C As Range, Plage As Range, Ws As Worksheet, Col As Integer
    With Sheets("Total")
        Set Plage = .Range("A1", .Cells(1, .Columns.Count).End(xlToLeft))
    End With
    For Each C In Plage
        For Each Ws In Worksheets
            If Ws.Name <> "Total" Then
                Col = Application.Match(C.Value, Ws.[1:1], 0)
                C.Offset(1) = C.Offset(1) + Application.Sum(Ws.Columns(Col))
            End If
        Next Ws
    Next C
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    MErci Daniel,

    Pour bien comprendre :

    Ton code permet de :

    faire la somme dans la feuille total de chaque colonne(somme ligne par ligne?) de chaque feuille contenant telle entête?

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Non, j'additionne brutalement toute la colonne contenant l'entête et je mets le résultat en ligne 2 de la feuille Total. Trop simpliste ?

  5. #5
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    lol oui

    en fait chaque ligne de mon tableau correspond à une 1/2 heure dans mon fichier.

    J'ai plusieurs feuilles qui correspondent à des "sites de traitement", les entêtes correspondant aux flux traités.

    Ce que je cherche à faire :

    Dans la feuille total, faire la somme 1/2 heure par 1/2 heure de chaque flux traité par tout les sites.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Comment chaque ligne est-elle référencée ? Y a--t-il par exemple une heure en colonne A ou une date et une heure ? Si oui, les cellules sont-elles au format date ? Ces références sont-elles les mêmes sur toutes les feuilles ?

  7. #7
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    Merci pour ton aide.

    Avec un fichier ce sera peut etre plus clair....

    j'ai des sites SITEA,SITEB,SITEC,etc.... sur plusieurs feuilles et pas forcément à chaque fois dans la même colonne.

    Sur la feuille total, faire la somme ligne par ligne de toutes les feuilles pour le site SITEA, pour le site SITEB, etc....

    cette somme correspond aux "répondus" dans la feuille total.

    J'ai fait mon calcul avec les fonctions RechercheH et somme, maintenant je voudrais le faire en macro, car je dois intégrer d'autres données... :-)
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Quelles sont les colonnes à ne pas prendre en compte ? Certaines colonnes de la feuille total contiennent des formules.

  9. #9
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    la macro doit renseigner les colonnes Engagement et répondus de chaque site.

    Sur les autres colonnes je laisses les formules.

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Teste :

    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
    Sub Recap()
        Dim C As Range, Plage As Range, Ws As Worksheet, Col As Variant, I As Integer
        Dim Sh As Worksheet
        Set Sh = Sheets("total_Ass_Co")
        With Sheets("total_Ass_Co")
            Set Plage = .Range("B1", .Cells(1, .Columns.Count).End(xlToLeft))
        End With
        For Each C In Plage
            If (Left(C.Value, 4) = "SITE" And Right(C.Value, 8) = "Répondus") Or _
                (Left(C.Value, 4) = "SITE" And Right(C.Value, 10) = "Engagement") Then
                For Each Ws In Worksheets
                    If Ws.Name <> "total_Ass_Co" Then
                        Col = Application.Match(C.Value, Ws.[1:1], 0)
                        If IsNumeric(Col) Then
                            For I = 2 To 33
                                Sh.Cells(I, C.Column) = Sh.Cells(I, C.Column) + Ws.Cells(I, Col).Value
                            Next I
                        End If
                    End If
                Next Ws
            End If
        Next C
    End Sub

  11. #11
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    wow super merci :-)

    afin de ne pas être bête... peux tu m'expliquer comment fonctionne Col = Application.Match(C.Value, Ws.[1:1], 0)

    notamment Ws.[1:1]

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Dans la boucle sur les feuilles, "WS" représente tour à tour chaque feuille. "C.value" représente tour à tour chaque entête de la feuille total. [1:1] est une autre façon d'écrire "Range("1:1")", soit la ligne 1. "Application.Match" est l'équivalent de la fonction Excel EQUIV.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Col = Application.Match(C.Value, Ws.[1:1], 0)
    renvoie donc la position (colonne) sur chaque feuille, tour à tour, de l'entête lu sur la feuille total.

  13. #13
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    Merci beaucoup ça marche ,

    J'ai juste modifié pour faire la recherche que sur certaines feuilles et aussi chaque fois que je lancer la macro ça incrémenté la feuille total

    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
    Dim C As Range, Plage As Range, Ws As Worksheet, Col As Variant, I As Integer
     
        Dim Sh As Worksheet
     
        Set Sh = Sheets("CALCUL_FNBFAICO")
     
        With Sheets("CALCUL_FNBFAICO")
            Set Plage = .Range("B1", .cells(1, .Columns.Count).End(xlToLeft))
        End With
     
        For Each C In Plage
            If (Right(C.Value, 8) = "Répondus") Or _
                (Right(C.Value, 10) = "Engagement") Then
     
                Sh.Range(cells(2, C.Column), cells(33, C.Column)).ClearContents
     
                For Each Ws In Worksheets
                    If Ws.Name = "Assistance_CO_Mobile_FNB" Or Ws.Name = "Assistance_CO_Fixe_GP" Or Ws.Name = "SCMM" Or Ws.Name = "Actes_Urgence" Then
                        Col = Application.Match(C.Value, Ws.[1:1], 0)
                        If IsNumeric(Col) Then
                            For I = 2 To 33
                                Sh.cells(I, C.Column) = Sh.cells(I, C.Column) + Ws.cells(I, Col).Value
                            Next I
                        End If
                    End If
                Next Ws
            End If
        Next C

  14. #14
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    et aussi chaque fois que je lancer la macro ça incrémenté la feuille total
    Oui, pour pallier cet inconvénient, j'ai modifié mon code. Remets ta sélection sur les 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
    Option Base 1
    Sub Recap()
        Dim C As Range, Plage As Range, Ws As Worksheet, Col As Variant, I As Integer, Tot(33) As Double
        Dim Sh As Worksheet
        Set Sh = Sheets("total_Ass_Co")
        With Sheets("total_Ass_Co")
            Set Plage = .Range("B1", .Cells(1, .Columns.Count).End(xlToLeft))
        End With
        For Each C In Plage
            If (Left(C.Value, 4) = "SITE" And Right(C.Value, 8) = "Répondus") Or _
                (Left(C.Value, 4) = "SITE" And Right(C.Value, 10) = "Engagement") Then
                For Each Ws In Worksheets
                    If Ws.Name <> "total_Ass_Co" Then
                        Col = Application.Match(C.Value, Ws.[1:1], 0)
                        If IsNumeric(Col) Then
                            For I = 2 To 33
                                Tot(I) = Tot(I) + Ws.Cells(I, Col).Value
                            Next I
                        End If
                    End If
                Next Ws
                For I = 2 To 33
                    Sh.Cells(I, C.Column) = Tot(I)
                Next I
            End If
        Next C
    End Sub

  15. #15
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    Ok merci,

    Je pensais que Sh.Range(cells(2, C.Column), cells(33, C.Column)).ClearContents

    Peux tu m 'expliquer la démarche avec ton code?

  16. #16
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    C'est inutile, sauf erreur. Les cellules sont systématiquement remplies par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                For I = 2 To 33
                    Sh.Cells(I, C.Column) = Tot(I)
                Next I

  17. #17
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    Ok mais comment interpréter ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Tot(33) As Double
     
     For I = 2 To 33
                                Tot(I) = Tot(I) + Ws.Cells(I, Col).Value

  18. #18
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    définit une variable tableau de 34 positions numériques (les 2 premières (Tot(0) et Tot(1) ne servent pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For I = 2 To 33
                                Tot(I) = Tot(I) + Ws.Cells(I, Col).Value
                            Next I
    sert à additionner les cellules des lignes 2 à 33 de la colonne Col de la feuille Ws.

    Lorsque toutes les feuilles sélectionnées ont été parcourues, la feuille total est remplie par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                For I = 2 To 33
                    Sh.Cells(I, C.Column) = Tot(I)
                Next I

  19. #19
    Membre averti
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Superviseur de Hotline
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Par défaut
    je viens te tester ça ne fonctionne pas.

  20. #20
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Clair, je suis super avancé. A quoi vois-tu que ça ne fonctionne pas ? Où ?

Discussions similaires

  1. [XL-2007] Macro VBA pour imprimer plusieurs onglets sur une feuille recto verso
    Par oekoniko dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/03/2014, 15h24
  2. Réponses: 9
    Dernier message: 04/02/2013, 13h45
  3. [VBA-E] formule sur feuille ou par macro
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 14/02/2007, 17h13
  4. Réponses: 7
    Dernier message: 15/12/2006, 16h14
  5. Réponses: 9
    Dernier message: 30/08/2006, 23h13

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