SubTotal en vba.

Résolu
BIOoOAG123 - 30 avril 2013 à 15:49
 BIOoOAG123 - 2 mai 2013 à 11:01
Bonjour à tous, je suis confronté à un petit problème avec WorksheetFunction.Subtotal,

Je ne comprend pas pourquoi il me trouve des résultat différents à chaque fois...

Ps : le but est de recalculer la somme des colonnes du tableau (qui est variable) et ne prenant pas en compte les cellules masquées.


J'ai donc mit naturellement : Somme = WorksheetFunction.Subtotal(109, Sheets(4).Range(Cells(3, i), Cells(NbLigne, i)))

Mais à chaque fois il trouve des résultat différents (pas forcément de beaucoup, mais ça peut être 2 000 euro etc. Alors que je n'ai rien changé aux chiffres du tableau!

Voici le ptit bou de mon code qui calcule la somme et la met en forme

    '**************************************
    '********* Somme des colonnes *********
    '**************************************
      
    
     NbLigneMAJ = Worksheets(4).Cells(1000, 2).End(xlUp).Row
     
'* suppression de la somme déjà existante *
     For i = 3 To NbLigneBDDAn Step 1
        If Sheets(4).Cells(i, 2).Value = "Somme" Then
        Rows(i).Delete
        Exit For
        End If
    Next
     
     '********** Mise en forme *********
     With Worksheets(4).Cells(NbLigneMAJ + 1, 2)
     .Value = "Somme"
     .Font.Bold = True
     .Borders.Value = 1
     .Font.Size = 12
     End With
    
    NbLigne = Worksheets(4).Cells(1000, 2).End(xlUp).Row
    '******** Calcul de la somme *******
     For i = 3 To NbColonne Step 1
     Somme = WorksheetFunction.Subtotal(109, Sheets(4).Range(Cells(3, i), Cells(NbLigne, i)))
         '******* Mise en forme ********
         With Worksheets(4).Cells(NbLigneMAJ + 1, i)
         .Value = Somme
         .Font.Bold = True
         .Font.Size = 12
         .Borders.Value = 1
         .NumberFormat = "### ### ##0 €"
         End With
         
    
     '* Supprimer les Sommes qui n'ont pas lieu d'être *
         With Sheets(4)
         .Range("G" & NbLigneMAJ + 1).Value = ""
         .Range("L" & NbLigneMAJ + 1 & ":R" & NbLigneMAJ + 1).Value = ""
         .Range("T" & NbLigneMAJ + 1).Value = ""
         End With
     Next


Si vous avez une idée?

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mai 2013 à 10:05
Il te suffit de nommer tout simplement la ligne (donc la plage) concernée, puis de t'y référer par son nom !
Tu ne risqueras alors jamais, ainsi, de la "rater", quels que puissent être les "bouleversements".
En ce qui concerne les lignes masquées à ne pas compter ===>>
Il suffit de passer à WorkSheetFunction.subtotal la seule plage des lignes visibles, genre
WorksheetFunction.Subtotal(109, Range(.......).SpecialCells(xlCellTypeVisible))
A toi de jouer un peu avec, maintenant (facile)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 avril 2013 à 17:37
Bonjour,
déjà ; dès ta toute première boucle, je te fais foàrcément des croche-pieds dans la numérotation des lignes !
Quand on détruit des lignes dans une boucle, il faut y aller de bas en haut et non de haut en bas ! (step -1).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 avril 2013 à 17:48
Et puis : pourquoi une boucle ?
Si tu as déjà fait ce sous-total, il se trouve forcément à la dernière ligne remplie
Tu ferais mieux d'exposer techniquement et complètement les tenants et aboutissants et de montrer également où tu as déclaré et initialisé :
NbLigneBDDAn et NbColonne


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Alors pour donner plus d'explication, j'ai 2 feuilles qui vont rentrer en compte :
[*] Une feuille contenant les données
[*] Une autre qui va me chercher les infos sur la première (avec des filtres, date etc.) pour me les afficher sur la deuxième. Donc la taille du tableau est tout le temps différente.

Sur la deuxième un total est calculé à chaque nouveau filtre(les données précédentes sont préalablement supprimées évidemment).
Mais lorsque l'utilisateur (c'est ici que le problème se pose) fait un tri automatique de la colonne, déjà ma somme(qui se situait en bas du tableau se retrouve dans les données à la lettre "S" (normal me direz-vous), mais après le plus important c'est que lorsque l'utilisateur masque des lignes, il ne souhaite avoir que la somme des lignes non masquées!

Voili voilou, j'espere que c'est assez bien expliqué pour que vous compreniez mon problème. :)

Si vous voulez le code je peux le mettre, mais c'est un petit pavé! :s

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mai 2013 à 09:50
Difficile de comprendre sans faille.
Dois-je simplement en conclure que l'utilisateur peut bouleverser l'ordre de la feuille à traiter et que c'est là la cause du problème ?
Cette question : uniquement pour pouvoir solutionner avec assurance la première partie.
Dès ta réponse, nous verrons, dans la foulée, comment solutionner la seconde.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Oui avec les tris automatiques il peut changer l'ordre des résultat de la feuille 2 et donc me mettre le bazard! :( Donc solution, trouver la ligne "Somme" déjà existante qui est dans le tableau, la supprimer et la recréer en bas du tableau. mais la vient s'imbriquer si j'ose dire le deuxième problème des lignes masquées!
0
Merci pour le .SpecialCells(xlCellTypeVisible) ça m'a aidé, et après j'avais un problème avec une variable tout simplement!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mai 2013 à 10:41
Correction en ce qui concerne la première partie. Je viens de tester et constate que Excel conserve bêtement l'adresse seule de la plage nommée.
Tu n'échappe donc pas à la boucle que tu avais conçue (mais du bas vers le haut, comme je te l'ai dit).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Euuuh tu veux dire du haut vers le bas? donc step -1? Car là j'ai que bas vers haut, step 1.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mai 2013 à 10:57
Non ! du BAS vers le Haut ! de la dernière ligne à la première, donc (et donc Step -1)

For i = NbLigneBDDAn To 3 Step -1
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Oui pardon je sais pas pourquoi j'ai inversé dans ma tête, promis je n'ai pas bu!
0
Rejoignez-nous