Somme.si en colonne en VBA

peternewman007

XLDnaute Nouveau
Bonjour,

Je cherche un moyen de faire des somme.si en vba par colonne.
Je joins un tableau exemple en annexe mais le tableau final comporte 96 personnes et 3851 de plage d'addition.

Pourriez-vous m'aider svp?

Merci d'avance,

Peter
 

Pièces jointes

  • Somme.si exemple.xlsx
    9.7 KB · Affichages: 44

Theze

XLDnaute Occasionnel
Re : Somme.si en colonne en VBA

Bonjour,

Une piste :
Code:
Sub SommeSi()

    Range("C10").Formula = "=SUMIF($A$2:$A$9,$A$2,C2:C9)"
    Range("C10").AutoFill Range("C10:J10")
    
    Range("C11").Formula = "=SUMIF($A$2:$A$9,$A$6,C2:C9)"
    Range("C11").AutoFill Range("C11:J11")
    
End Sub

Hervé.
 

peternewman007

XLDnaute Nouveau
Re : Somme.si en colonne en VBA

Bonjour,

Merci beaucoup pour ta réponse.
Mais malheureusement ce n'est pas ce que je cherche.
Je cherche un moyen de le faire en VBA (pas macro) pour éviter de ralentir mon fichier car au final, j'aurai 96 personnes avec 40 lignes/personne.

Merci d'avance,

Peter
 

gosselien

XLDnaute Barbatruc
Re : Somme.si en colonne en VBA

Bonsoir,

un essai incomplet que les "king" ici pourront améliorer, je n'arrive pas (manque d'expérience des tableaux) à faire le total par personne mais bien par jour :(
(inspiré d'un code de J. Boisgontier)

P.
je suivrai le post...
 

Pièces jointes

  • peternewman.xlsm
    30.2 KB · Affichages: 38

gosselien

XLDnaute Barbatruc
Re : Somme.si en colonne en VBA

re,

comme indiqué , je ne sais par pour le moment en faire plus par manque de maitrise des tableaux qui font ça très rapidement...
Le code est à modifier / compléter par qui est plus apte que moi, je suivrai le post...

P.
 

gosselien

XLDnaute Barbatruc
Re : Somme.si en colonne en VBA

re,

pas inspiré par JB, mais bien inspiré tout de même, j'ai surement cherché complique mais je me dis qu'une fonction personnalisée risque de ralentir si le fichier est énorme non ?
J'avais des "sommeprod" sur un fichier du boulot avec 50/60.000 lignes et ça ramait sec, d'où ma tentative de compréhension des tableau pour aller plus vite mais sans bouffer la mémoire vive ...Mais là, c'est moi qui rame :)
Je ne sais ps ce que tu en penses Dranreb ?

P.
 

Dranreb

XLDnaute Barbatruc
Re : Somme.si en colonne en VBA

La Function peut se transformer en Sub si vous préférez.
Mais ne ramera pas plus du fait que c'est une Function appelée dans une formule matricielle. Elle sera seulement exécutée chaque fois qu'un changement aura lieu dans les données.
Ça devrait être plus rapide que des SommeProd parce que la dimension d'imbrications de boucles moyenne de l'algorithme est plus proche de 1 que de 2. Ou du moins plus basse qu'avec des SommeProd.
 
Dernière édition:

gosselien

XLDnaute Barbatruc
Re : Somme.si en colonne en VBA

OK, merci pour l'explication mais je tente quand même mon histoire car j'essaye de comprendre les tableaux, comment les remplir, et ensuite époser les différents totaux/dénombrement, etc.. en bas d'un résumé, d'où la tartine que j'ai tenté de pondre :)

Cdlt
 

peternewman007

XLDnaute Nouveau
Re : Somme.si en colonne en VBA

Un grand merci Dranreb, c'est exactement ce que je cherche..
Comment puis-je l'adapter à un fichier où les les sommes commencent à la colonne 8(H) et de la ligne 12 à la 3852 (pour l'instant, car ajout/retrait de personnes possibles)?

J'ai modifié le module 1 comme ceci :
Option Explicit
Function TotauxPers(ByVal Src As Range) ' pas inspiré du tout par un code de J. BOISGONTIER !!!
Dim Ts(), Pers As SsGroup, Acti As SsGroup, TotActi(8 To 41) As Double, Ls&, Détail, C&
ReDim Ts(1 To Application.Caller.Rows.Count, 1 To 41)
For Each Pers In GroupOrg(Src, 1, 2)
Ls = Ls + 6: Ts(Ls, 1) = Pers.Id: Ts(Ls, 2) = "Total"
For Each Acti In Pers.Contenu
For C = 8 To 41: TotActi(C) = 0: Next C
For Each Détail In Acti.Contenu
For C = 8 To 41: TotActi(C) = TotActi(C) + Détail(C): Next C, Détail
For C = 8 To 41: Ts(Ls, C) = Ts(Ls, C) + TotActi(C): Next C, Acti, Pers
TotauxPers = Ts
End Function

Mais je me doute qu'il y a d'autres choses à modifier également.
Le nom des feuilles est-il important?

Merci ,

Peter
 

Dranreb

XLDnaute Barbatruc
Re : Somme.si en colonne en VBA

C'est une Function pour l'instant. C'est vous qui spécifiez la plage source.
Je viens de voir qu'il y a un niveau inutile si les totaux par activités ne présentent aucun intérêt :
VB:
Function TotauxPers(ByVal Src As Range)
Dim Ts(), Pers As SsGroup, Ls&, Détail, dC&, C&
With Application.Caller: ReDim Ts(1 To .Rows.Count, 1 To .Columns.Count): End With
dC = Src.Columns.Count - UBound(Ts, 2)
For Each Pers In GroupOrg(Src, 1)
   Ls = Ls + 1: Ts(Ls, 1) = "Total " & Pers.Id
   For Each Détail In Pers.Contenu
      For C = 2 To UBound(Ts, 2): Ts(Ls, C) = Ts(Ls, C) + Détail(C + dC): Next C, Détail, Pers
While Ls < UBound(Ts): Ls = Ls + 1: For C = 1 To UBound(Ts, 2): Ts(Ls, C) = "": Next C: Wend
TotauxPers = Ts
End Function
La plage passée à la fonction doit commencer à la colonne portant les noms et se terminer à la dernière colonne à totaliser. Mais la fonction doit être invoquée dans une plage commençant à la colonne qui précède la 1ère à totaliser.
Donc, avec l'exemple donné, en B10:J110 :
Code:
=TotauxPers($A$2:DECALER($J10;-1;0))
validé toujours en matriciel.
 

peternewman007

XLDnaute Nouveau
Re : Somme.si en colonne en VBA

Je pense qu'en te montrant mon fichier final, tu comprendras mieux (enfin si ça tombe c'est moi qui ne comprend pas ton explication ^^) . Tu le trouveras ici.

Comment puis-je adapter ton code?

Merci d'avance,

Peter
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Somme.si en colonne en VBA

Il n'y a pas de nom dans le classeur en lien.
J'ai mis Toto, Titi, Tata en A12:A14, En G3853:AM3558 :
Code:
=TotauxPers(A$12:DECALER($AO3853;-1;0))
J'y ai obtenu :
Total Tata00000000000000080000000000008800
Total Titi40000000000000000000000000004400
Total Toto00000000008000000000000000008800
Total764768768768768007680768760768007687607687687680076876876876876800######00

Mais vous pouvez transformer ça en Sub si vous préférez.
L'avantage c'est qu'il n'y aurait plus lieu de compléter Ts avec des "" pour que ça n'apparaisse pas sous forme de 0 au déchargement dans la plage désirée.

Edit: Attention, ça a mis en évidence une erreur dans le calcul de dC. Faisons le comme ça :
VB:
With Application.Caller
   ReDim Ts(1 To .Rows.Count, 1 To .Columns.Count)
   dC = .Column - 1: End With
Comme ça si la colonne d'où part la formule est la G c'est 7, - 1 = 6
Et la colonne 2 de Ts doit prendre 2 + 6 = 8 qui est bien la colonne H.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 668
Messages
2 090 739
Membres
104 643
dernier inscrit
adriano22