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 en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut somme en VBA
    Bonjour,
    je dois faire des sous totaux dans un tableau. Ma colonne A de libellés n'est pas construite avec des cellules contigues (question de présentation).
    Voici le code que j'ai fais, seulement, il ne marche pas, le resultat affiché n'est pas correct.

    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
     
    Dim LigneTotal, colTotal As Variant
    LigneTotal = Range("A65536").End(xlUp).Address
    LigneTotal = Range(LigneTotal).Row
    For col = 2 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
    If Cells(4, col) = "2006" Or Cells(4, col) = "2007" Then 'le sous totaux ne se font que sur les colonnes "2006" et "2007"For Rw = 5 To LigneTotal - 1
    If Cells(Rw, 1) Like "Total*" Then 'pour repérer la ligne où il faut mettre le résultat du ss totalFor LigneNonVide = 5 To LigneTotal - 1
    If Not IsEmpty(Cells(LigneNonVide, 1)) Then
    Cells(Rw, col) = Cells(Rw, col) + Cells(LigneNonVide, col).Value
    End If
    Next LigneNonVide
    End If
    Next Rw
    End If
    Next col
    Je ne comprends pas pourquoi le code me donne des résultats faux, si qqun peut m'aider...

    Merci d'avance,

    Livet

  2. #2
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut

    pour plus de lisibilité, j'ai repris exactement ton code en y ajoutant des lignes vides et des indentations (et je t'invite à utiliser ce type de présentation du code pour qu'on te lise mieux) :
    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
     
    Dim LigneTotal, colTotal As Variant
     
    LigneTotal = Range("A65536").End(xlUp).Address
    LigneTotal = Range(LigneTotal).Row
     
    For col = 2 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
       If Cells(4, col) = "2006" Or Cells(4, col) = "2007" Then 'le sous totaux ne se font que sur les colonnes "2006" et "2007"For Rw = 5 To LigneTotal - 1
          If Cells(Rw, 1) Like "Total*" Then 'pour repérer la ligne où il faut mettre le résultat du ss totalFor LigneNonVide = 5 To LigneTotal - 1
             If Not IsEmpty(Cells(LigneNonVide, 1)) Then
                Cells(Rw, col) = Cells(Rw, col) + Cells(LigneNonVide, col).Value
             End If
             Next LigneNonVide
          End If
          Next Rw
       End If
    Next col
    => à quelles instructions for se rapportent les instructions Next LigneNonVide et Next Rw ?
    @+

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 95
    Par défaut
    ha ouai lol, c'est beaucoup plus frappant les next qu'il ne devrai pas y avoir après que tu t'en sois occupé.
    Merci parce que je n'avait pas franchement envie de déchiffrer le code.

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    Mince, le message a été envoyé avant que je ne le termine...

    Voici le code présenté comme il faut:

    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
     Dim LigneTotal, colTotal As Variant
    LigneTotal = Range("A65536").End(xlUp).Address
    LigneTotal = Range(LigneTotal).Row
    For col = 2 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
        If Cells(4, col) = "2006" Or Cells(4, col) = "2007" Then
            For Rw = 5 To LigneTotal - 1
                If Cells(Rw, 1) Like "Total*" Then
                    For LigneNonVide = 5 To LigneTotal - 1
                        If Not IsEmpty(Cells(LigneNonVide, 1)) Then
                        Cells(Rw, col) = Cells(Rw, col) + Cells(LigneNonVide, col).Value
                        End If
                    Next LigneNonVide
                End If
            Next Rw
        End If
    Next col
    et voici le code avec la déclaration d'une plage de cellules:

    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
     For col = 2 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
        If Cells(4, col) = "2006" Or Cells(4, col) = "2007" Then
            For Rw = 5 To LigneTotal - 1
                If Cells(Rw, 1) Like "Total*" Then
                    For LigneNonVide = 5 To LigneTotal - 1
                        Do While Range("A" & LigneNonVide) <> ""
                        Set PlageNonVide = Range(" & col & " & " & LigneNonVide & ")
                        Loop
                    ssTot = Application.ActiveSheetFunction.Sum(PlageNonVide)
                    Cells(Rw, col).Value = ssTot
                    Next LigneNonVide
                End If
            Next Rw
        End If
    Next col
    Aucun des deux ne marche, et la solution dépasse peut être mes compétences actuelles

    J'espère que les codes sont clairs, et que vous pourriez m'éclairer.

    Merci d'avance,

    Livet

  5. #5
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut
    Bonjour,
    J'ai fait tourner ton code, il ne plante pas.
    Maintenant si tu considère qu'il ne remplit pas la fonction voulue, c'est un problème de conception de ton algo
    A+

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    oui, effectivement, il ne plante pas (sauf pour le deuxième chez moi), mais il marche pas pour autant. Dans le premier code, la somme affichée n'est pas correcte, et je comprends pas quels chiffres il (le programme) prend pour faire la somme...

    Merci bcp pour cette précision!!
    Et dans l'idée, c'est donc possible d'additionner toutes les cellules contenues dans une même plage de données? (la valeur des cellules, leur contenu)

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par dam2p Voir le message
    Bonjour,
    J'ai fait tourner ton code, il ne plante pas.
    Je te crois puisque je n'ai pas testé et c'est très étonnant.
    Essaie ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Plage
    Col = 1
    Set Plage = Worksheets("Feuil1").Range(Cells(1, Col), _
                   Cells(10, Col))
    sstot = Application.WorksheetFunction.Sum(Plage)
    Cells(25, 1) = sstot
    Et ce n'est pas ActiveSheetFunction mais WorksheetFunction

    Edit
    Où Range(Cells(1, Col), Cells(10, Col)) désigne la plage entre la ligne 1 et 10 dont tu veux le sous-total

  8. #8
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    Juste pour info, pourquoi faut-il rappeler le nom de la feuille dans laquelle on travaille?

  9. #9
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut
    Si j'ai bien compris ton algo, le but est de créer des sous-totaux...
    Voilà une proposition sur la base de ce qui a été dit plus haut:
    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
    Option Explicit
    Sub Toto()
    '
    Dim LigneTotal, LignePrevSsTot , Rw, LigneNonVide As Long 'les num de ligne von jusqu'à 65636, il faut un long
    Dim colTotal, Col As Integer 'les n° de colonne vont jusqu'à 256, un integer suffit
    Dim PlageNonVide As Range
    Dim ssTot As Long 'sous-total
    '
        LigneTotal = Range("A65536").End(xlUp).Row
        colTotal = Range("A4").End(xlToRight).Column
     
        For Col = 2 To colTotal
            If Cells(4, Col) = "2006" Or Cells(4, Col) = "2007" Then
                LignePrevSsTot = 4
                For Rw = LignePrevSsTot + 1 To LigneTotal - 1
                    If Cells(Rw, 1) Like "Total*" Then
                        Set PlageNonVide = Range(Cells(LignePrevSsTot + 1, Col), Cells(Rw - 1, Col))
                        ssTot = Application.WorksheetFunction.Sum(PlageNonVide)
                        Cells(Rw, Col).Select 'debug
                        Cells(Rw, Col).Value = ssTot
                        LignePrevSsTot = Rw
                    End If
                Next Rw
            End If
        Next Col
    End Sub
    1. j'ai trouvé que ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell) avait un comportement bizarre, alore je l'ai remplacé par un bon vieux End(xlToRight) qui fonctionne.
    2. cet algo fonctionne même si tu as plusieurs sous-totaux (par ex : "Total Truc" en A8, "Total machin" en A11, "Total chose" en A14, etc.) => il mettra un sous-total pour chaque plage considérée.
    3. la fonction sum me retourne une valeur entière alors que dans mon test, je devrais avoir des chiffres après a virgule,mais je suppose que c'est simple à régler,
    4. pour obtenir des sous-totaux pour toutes les années (2004, 2005, etc...), supprime la condition sur 2006 et 2007.
    5. si tu considère que les colonnes 2006 et 2007, sont en C et D (3 et 4) ton algo revient à un bon vieux "insérer sous-totaux" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub InsérerSousTotaux()
    '
        Range("A4").Subtotal GroupBy:=1, Function:=xlSum, _
                                     TotalList:=Array(3, 4), _
                                     Replace:=True, _
                                     PageBreaks:=False, _
                                     SummaryBelowData:=True
    End Sub
    ici, je n'ai pas traité la question du Array pour le cas où le nb de colonnes serait variable...

    @1

  10. #10
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    Merci pour ta réponse dam2p, je vais l'essayer de suite

  11. #11
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    ça marche nickel! merci bcp!!
    Allé, je me lance dans le code pour la ligne Total (total des sous totaux).

    Bonne journée,

    Livet

  12. #12
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut
    Pourquoi tu te casses les pieds à recoder la fonction Subtotal ?

  13. #13
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    oui, pourquoi donc, surtt que j'y arrives pas...
    Est ce que c'est possible d'utiliser comme "Array" la plage définie par les sous-totaux (ceux codés précédement)?

    Lacfatigue commence à se faire sentir, j'ai du mal à me comprendre moi même...
    En fait, j''essaye maintenant de faire une ligne (en LigneTotal, et en col) avec le total des différents sous-totaux.

  14. #14
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 33
    Par défaut
    Ayé, j'y suis arrivée, il fallait juste insérer une ptite ligne en plus dans le code.


    Merci pour tt,

    Livet

  15. #15
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Par défaut
    Content pour toi
    ajoute le tag à la discussion : c'est un bouton juste en dessous
    A+
    Dam2p

Discussions similaires

  1. Somme Produit VBA
    Par askan dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/02/2010, 15h56
  2. [XL-2007] Calcul Somme en VBA
    Par IronBibs dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/11/2009, 16h30
  3. [XL-2007] Calcul d'une Somme en VBA
    Par IronBibs dans le forum Excel
    Réponses: 2
    Dernier message: 03/11/2009, 16h21
  4. Nombre arguments formule SOMME en VBA
    Par Mickael Scofild dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/09/2009, 19h00
  5. Somme colonne VBA sans boucle
    Par sissi00000 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/07/2008, 11h44

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