SubTotal en vba. [Résolu]

BIOoOAG123 - 30 avril 2013 à 15:49 - Dernière réponse :  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?
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 2 mai 2013 à 10:05
3
Merci
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.

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 30 avril 2013 à 17:37
0
Merci
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 30 avril 2013 à 17:48
0
Merci
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.
Commenter la réponse de ucfoutu
BIOoOAG123 - 2 mai 2013 à 09:41
0
Merci
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
Commenter la réponse de BIOoOAG123
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 2 mai 2013 à 09:50
0
Merci
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.
Commenter la réponse de ucfoutu
BIOoOAG123 - 2 mai 2013 à 09:59
0
Merci
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!
Commenter la réponse de BIOoOAG123
BIOoOAG123 - 2 mai 2013 à 10:39
0
Merci
Merci pour le .SpecialCells(xlCellTypeVisible) ça m'a aidé, et après j'avais un problème avec une variable tout simplement!
Commenter la réponse de BIOoOAG123
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 2 mai 2013 à 10:41
0
Merci
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.
Commenter la réponse de ucfoutu
BIOoOAG123 - 2 mai 2013 à 10:53
0
Merci
Euuuh tu veux dire du haut vers le bas? donc step -1? Car là j'ai que bas vers haut, step 1.
Commenter la réponse de BIOoOAG123
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 2 mai 2013 à 10:57
0
Merci
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.
Commenter la réponse de ucfoutu
BIOoOAG123 - 2 mai 2013 à 11:01
0
Merci
Oui pardon je sais pas pourquoi j'ai inversé dans ma tête, promis je n'ai pas bu!
Commenter la réponse de BIOoOAG123

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.