XL 2013 Optimisation SommeProd (formule ou vba)

GADENSEB

XLDnaute Impliqué
Bonsoir le forum
je gère le fichier ci-joint que je souhaite optimiser :

Opitmiser les sommeprod dans l'onglet SYNTHESE
pour exemple en E6
Code:
=SOMMEPROD((B_Annee=$A6)*(B_Semaine=$C6)*(B_Statut=E$3)*(B_Apayer))
comme le fichier original comporte 10000 lignes le recalcul des sommeprod sur l'ensemble de la page SYNTHESE prends environ 1 minute
poue éviter le recalcul en permance à la saisie des données dans "COMPTES" j'ai bloqué les calculs avec

Code:
Sub Désactivation_App()
    'On désactive les applications (optimisation).
    With Application
        .EnableEvents = False
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
End Sub

qui sont ensuite réactivé à l'ouverture de l'onglet SYNTHESE avec
Code:
Sub Activation_App()
    'On réactive les applications (ne pas oublier).
    With Application
        .EnableEvents = True
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub

avez vous une solution plus fluide?

... on m'impose de ne pas utiliser un TCD ....
 

Dranreb

XLDnaute Barbatruc
GigIdx voulez vous dire ? Relisez la feuille d'aide. Si vous l'avez installé dans les complément, vous pouvez l'ouvrir par menu Développeur, groupe Compléments, commande Compléments Excel, cochez "Fonction Gigogne". Il ne restera plus qu'à cocher GigIdx dans le projet VBA de votre classeur d'application, menu Outils, Références…
Parce que le code d'application que j'ai indiqué est incomplet, bien sûr, il ne fait rien, c'est juste la structure mais c'est dépourvu d'instruction produisant un moindre résultat.
Pour cela, réfléchissez un peu ce qu'il faudrait bien y insérer, et à quels endroits.
Avant d'écrire quelque chose dans une nouvelle ligne de T par T(L, C) = quelque chose ce sera L = L + 1, etc.
Ou encore pour cumuler un détail dans une certaine colonne C convenablement calculée préalablement ce sera T(L, C) = T(L, C) + Détail(x)
(Pas x bien sûr: un numéro)
 
Dernière édition:

GADENSEB

XLDnaute Impliqué
Hello
C'est bon j'ai inséré la fonction Gigogne
et les déclarations de variables
c'est good comme cela ?
aprés il faut bien déclarer C ? comme quoi ?
pour avoir cela ?????
T(L, C) = T(L, C) + Détail(x)
 

Pièces jointes

  • BUDGET - SYNTHESE 2017 - TEST OPTIMISATION SOMMEPROD - v2.xlsm
    34.9 KB · Affichages: 44

Dranreb

XLDnaute Barbatruc
Bonjour.
Non, dans une procédure les déclarations de variable locales se mettent toujours dans une instruction Dim, séparées par des virgules. Deux instructions ne sont donc pas correctes.
Les indices de tableaux sont des nombres entiers, que voudriez vous que ça puisse être d'autre ?
Mettez Option Explicit en tête du module pour qu'il vous aide par la suite à trouver les variables que vous aurez oublié de déclarer avant de tenter une exécution.
Avec ça il n'y a donc plus d'erreur de compilation quand vous faites menu Débogagen, Compiler VBAProject.
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim Ann As SsGr, Poste As SsGr, BudReel As SsGr
Dim T(), L As Long, C As Long, Détail As Variant
For Each Ann In Gigogne(Feuil2.[A2], 3, 7, -5)
   For Each Poste In Ann.Co
      For Each BudReel In Poste.Co
         For Each Détail In BudReel.Co
            Next Détail
         Next BudReel
      Next Poste
   Next Ann
End Sub
Mais il ne se passe toujours rien de visible à l'exécution, bien sûr, mais l'exploration de la collection fonctionne sûrement déjà correctement, comme en témoigne cette instruction insérée après le for Each BudReel :
VB:
         MsgBox Ann.Id & " —› " & Poste.Id & " —› " & BudReel.Id

Edit: Je n'avais même pas vu qu'il y avait toutes les années, disposées horizontalement.
(je déteste ces trucs de plans avec les boutons + et -, et je ne sais pas du tout si on va pouvoir garder ça)
Si vous tenez vraiment à ce que ça reste comme ça, la position du SsGr Ann n'est pas bonne, je pense même qu'il ne le faut peut être pas, ni donc la colonne 3 dans l'appel de la fonction Gigogne.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ce code sort quelque chose, à partir de la ligne 30 :
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim Rng As Range, AnDéb As Long, An As Long, CMax As Long, Groupe As SsGr, Ligne As SsGr, BudReel As SsGr
Dim T(), L As Long, C As Long, Détail As Variant
Set Rng = ColUti(Feuil2.[B2])
AnDéb = Year(WorksheetFunction.Min(Rng))
CMax = (Year(WorksheetFunction.Max(Rng)) - AnDéb + 1) * 14 + 4
ReDim T(1 To 500, 1 To CMax)
L = -2
For Each Groupe In Gigogne(Feuil2.[A2], 8, 9, -5)
   L = L + 1
   T(L + 2, 1) = Groupe.Id
   For Each Ligne In Groupe.Co
      L = L + 1
      T(L + 1, 2) = Ligne.Id
      For Each BudReel In Ligne.Co
         L = L + 1
         T(L, 3) = BudReel.Id
         For Each Détail In BudReel.Co
            An = Year(Détail(2))
            C = (An - AnDéb) * 14 + 4 + Month(Détail(2))
            T(L, C) = T(L, C) + Détail(18)
            C = (An - AnDéb) * 14 + 17
            T(L, C) = T(L, C) + Détail(18)
            Next Détail
         Next BudReel
      If Ligne.Count = 2 Then
         L = L + 1
         T(L, 3) = "Écart"
         For C = 5 To CMax: T(L, C) = T(L - 2, C) - T(L - 1, C): Next C
         End If
      Next Ligne
   Next Groupe
T(L + 1, 1) = "RÉCAPITULATIF"
For Each Groupe In Gigogne(Feuil2.[A2], 8, -5)
   L = L + 1
   T(L + 1, 1) = Groupe.Id
   For Each BudReel In Groupe.Co
      L = L + 1
      T(L, 3) = BudReel.Id
      For Each Détail In BudReel.Co
         An = Year(Détail(2))
         C = (An - AnDéb) * 14 + 4 + Month(Détail(2))
         T(L, C) = T(L, C) + Détail(18)
         C = (An - AnDéb) * 14 + 17
         T(L, C) = T(L, C) + Détail(18)
         Next Détail
      Next BudReel
   If Groupe.Count = 2 Then
      L = L + 1
      T(L, 3) = "Écart"
      For C = 5 To CMax: T(L, C) = T(L - 2, C) - T(L - 1, C): Next C
      End If
   Next Groupe
Me.[A30].Resize(L, UBound(T, 2)).Value = T
End Sub
 

GADENSEB

XLDnaute Impliqué
Hello
Excellent !
je l'ai testé sur le fichier originel (11500 lignes) .....3 secondes d’exécution ....
Au top !!
exactement ce que je cherché
Un grand merci à Mr DANREB !!!
Comme tjrs un travail extraordinaire ;-)

Petites améliorations :
Je me rends comptes que je n'avais pas précisé la chose, sorry mea culpa
Il ya un regroupement principal, celui de la colonne F "COMPTES".
Ici j'ai inclus un compte LIVRET donc il ya 2 comptes COURANT et LIVRET à partir ( et en dessous desquels) doivent s'opérer les regroupements déjà produits.
Donc il faut rajouter un niveau 0
j'ai essayé
Code:
For Each Groupe In Gigogne(Feuil2.[A2],6,8, 9, -5)
à la place de
Code:
For Each Groupe In Gigogne(Feuil2.[A2],8, 9, -5)

et j'ai ce message d'erreur
upload_2017-8-2_1-44-33.png


J'avoue que je ne pige pas trop la présentation de RÉCAPITULATIF ....
avoir en Colonne A la colonne 8 de Gigogne puis colonne B la colonne 9 de Gigogne j'aime pas trop lol

J'avais placé la colonne A pour pouvoir placé la colonne G de mon onglet COMPTES en vue de faciliter les sommeprod... mais si cela ne sert plus. .....--> a supprimer la colonne A
Le top ;-) serait ce rendu comme je l'avais placé, qui du coup commencerai en colonne A

upload_2017-8-2_1-51-37.png



il faut recalibrer "L" si je comprends bien pour que quand "T" soit compléter il se place à la ligne en dessous et non pas sur la colonne suivante
C'est bien cela ?

C'est modifs sont jouables?

Encore un grand merci à toi

Good night
 

Pièces jointes

  • upload_2017-8-2_1-50-31.png
    upload_2017-8-2_1-50-31.png
    2.1 KB · Affichages: 45
  • BUDGET - SYNTHESE 2017 - TEST OPTIMISATION SOMMEPROD - v3.xlsm
    40.6 KB · Affichages: 46

Dranreb

XLDnaute Barbatruc
Bonjour.
Jamais eu de problème pour ajouter une colonne de regroupement supplémentaire. Cela implique évidemment une variable SsGr correspondante supplémentaire et un niveau de boucle imbriquée supplémentaire pour la parcourir.
Ce n'est donc plus For Each Groupe In Gigogne(Feuil2.[A2],6, 8, 9, -5) mais
For Each Compte In Gigogne(Feuil2.[A2], 6, 8, 9, -5) et après seulement
For Each Groupe In Compte.Co. Sinon ça peut expliquer en effet l'erreur parce que derrière For Each Détail on utilise Détail(2) et Détail(18) ce qui ne veut rien dire parce que Détail ne contient pas déjà une ligne de détail, mais encore un SsGr, qui lui les contient. Les lignes de détails ne sont associées qu'aux propriétés Co des SsGr correspondant à la dernière colonne spécifiée. Les Co des SsGr correspondant à toutes les colonnes spécifiées devant celle ci contiennent chaque fois les SsGr de la colonne spécifiée derrière elle.
Si vous tenez à ce que le récapitulatif des groupes toutes lignes confondues vienne d'abord, mettez le code en tête. En tout cas c'est ce que j'ai essayé de rendre en tant que partie verte "REVENU". "Argent du mois" quant à lui je ne sais pas d'où ça sort. Mais on peut le fixer arbitrairement si on sait quoi y mettre, tout comme j'ai fixé "Écart" à un autre niveau.
 
Dernière édition:

GADENSEB

XLDnaute Impliqué
hello

je viens d'essaye de bouger le code et j'en suis là
Code:
Option Explicit

Private Sub Worksheet_Activate()
Dim Rng As Range, AnDéb As Long, An As Long, CMax As Long, Compte As SsGr, Groupe As SsGr, Ligne As SsGr, BudReel As SsGr
Dim T(), L As Long, C As Long, Détail As Variant
Set Rng = ColUti(Feuil2.[B2])
AnDéb = Year(WorksheetFunction.Min(Rng))
CMax = (Year(WorksheetFunction.Max(Rng)) - AnDéb + 1) * 14 + 4
ReDim T(1 To 500, 1 To CMax)
L = -2
For Each Compte In Gigogne(Feuil2.[A2], 6, 8, 9, -5)
For Each Groupe In Compte.Co
   L = L + 1
   T(L + 2, 1) = Groupe.ID
   For Each Ligne In Groupe.Co
      L = L + 1
      T(L + 1, 2) = Ligne.ID
      For Each BudReel In Ligne.Co
         L = L + 1
         T(L, 3) = BudReel.ID
         For Each Détail In BudReel.Co
            An = Year(Détail(2))
            C = (An - AnDéb) * 14 + 4 + Month(Détail(2))
            T(L, C) = T(L, C) + Détail(18)
            C = (An - AnDéb) * 14 + 17
            T(L, C) = T(L, C) + Détail(18)
            Next Détail
         Next BudReel
      If Ligne.Count = 2 Then
         L = L + 1
         T(L, 3) = "Écart"
         For C = 5 To CMax: T(L, C) = T(L - 2, C) - T(L - 1, C): Next C
         End If
      Next Ligne
   Next Groupe
T(L + 1, 1) = "RÉCAPITULATIF"
For Each Groupe In Gigogne(Feuil2.[A2], 8, -5)
   L = L + 1
   T(L + 1, 1) = Groupe.ID
   For Each BudReel In Groupe.Co
      L = L + 1
      T(L, 3) = BudReel.ID
      For Each Détail In BudReel.Co
         An = Year(Détail(2))
         C = (An - AnDéb) * 14 + 4 + Month(Détail(2))
         T(L, C) = T(L, C) + Détail(18)
         C = (An - AnDéb) * 14 + 17
         T(L, C) = T(L, C) + Détail(18)
         Next Détail
      Next BudReel
   If Groupe.Count = 2 Then
      L = L + 1
      T(L, 3) = "Écart"
      For C = 5 To CMax: T(L, C) = T(L - 2, C) - T(L - 1, C): Next C
      End If
   Next Groupe
   Next Compte
Me.[A30].Resize(L, UBound(T, 2)).Value = T
End Sub


je suis pas sur pour de bien avoir inclu une nouvelle boucle avec
For Each Compte In Gigogne(Feuil2.[A2], 6, 8, 9, -5)
For Each Groupe In Compte.Co

-->Mon travail parait correct ?


en fait la bdd que j'ai fourni est seulement un extrait avec une série de données ciblées , pour résumer
- j'ai 5 comptes différents (Colonne F)
- Qui ont plusieurs subdivisions "GROUPE" (Colonne H)
- Et des sous subdivisions à Chaque fois "LIGNE" (colonne I)

Je me rends compte que j'ai oublié que tous les calculs doivent s'opérer en ayant filtré la colonne BQ (Colonne O) = "OUI"

En tt cas merci pour le code.
C'est génial

Dans le futur, (pas maintenant) j'aimerais faire un classement bien précis dans le rendu des données :
- Ordre des COMPTES
- Ordre des GROUPE

Cela est possible à la source de ce code ?
Ou devrais-je développer plusieurs codes avec des Compte.Co = XXXX à chaque fois
et du coup faire apparaitre, au final, mon résultat
avec des regroupements comme ceci (voir photo)
une partie, REVENUS, puis RESERVES Puis DEPENSES où il y a tt les autres regroupements

upload_2017-8-3_10-35-10.png

TT ceci est pr le futur, sauf idée géniale now

Merci de l'aide
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Le Next Compte ne doit pas être tout à la fin. Il doit terminer d'abord l'exploration de la 1ère Collection, après le 1er Next Groupe.
Pour ne prendre que les "OUI" on peut se contenter de le tester dans la boucle Détail:
If Détail(15) = "OUI" Then et End If avant le Next Détail.
Pas évident d'imposer un autre ordre que celui résultant du classement, lequel permet toujours d'avoir tout ensemble facilement, comme ça doit être regroupé. Pratiquement pas d'autre solution que de substituer préalablement dans un tableau des données les arguments par leur position dans une autre table imposée.
Idée: Si on ne veut le détail que des "REEL" mais quand même cumuler tout dans des lignes au début, on a intérêt à noter LDéb = L au début des Groupe
et derrière For Each ButReel faire un truc comme LTot = LDéb - (BudReel.Id = "BUBGET")
pour cumler chaque fois en T(LTot, C) en même temps qu'en T(L, C)
 
Dernière édition:

GADENSEB

XLDnaute Impliqué
Hello
Effectivement cela devient compliqué, cela a faire du développement logiciel.

et si pour simplifer la chose on reparté de mon poste 29
https://www.excel-downloads.com/thr...-formule-ou-vba.20014764/page-2#post-20136883
avec les POSTES en colonne A
pour l'allier à la puissance de calcul de GIGOGNE ?

cela pourrait revenir au code que tu m'avais fait pour mon premier fichier ?
Code:
Private Sub Worksheet_Activate()

  With Worksheets("SYNTHESE")
  Range("A:t").Select 'à préciser
  ActiveWindow.Zoom = True
  Range("B4").Select
  End With

Dim PlgSyn As Range, TSyn(), C&, TDon(), DicTT As New Dictionary, LE&, LS&, L&
TSyn = [A3:K3].Value
For C = 5 To 11: DicTT(TSyn(1, C)) = C: Next C
Set PlgSyn = Intersect([A6:K1000000], UsedRange)
On Error Resume Next
Do: Me.Comments(1).Delete: Loop Until Err
On Error GoTo 0
TSyn = PlgSyn.Resize(, 4).Value
ReDim Preserve TSyn(1 To UBound(TSyn, 1), 1 To 11)
TDon = [Table2].Value
LS = 1
For LE = 1 To UBound(TDon, 1)
   If LE > 1 Then If TDon(LE, 18) < TDon(LE - 1, 18) Then MsgBox "Date déclassée dans TDon", _
         vbCritical, "Synthèse": Application.Goto [Table2].Cells(LE, 18): Exit Sub
   For L = LS + 1 To UBound(TSyn) - 1
      If TSyn(L, 2) < TSyn(LS, 2) Then MsgBox "Date déclassée dans TSyn", _
         vbCritical, "Synthèse": Application.Goto PlgSyn.Cells(L, 2): Exit Sub
      If TSyn(L, 2) > TDon(LE, 18) Then Exit For
      LS = L: Next L
   If DicTT.Exists(TDon(LE, 26)) Then
      C = DicTT(TDon(LE, 26))
      TSyn(LS, C) = TSyn(LS, C) + TDon(LE, 25)
      If TDon(LE, 25) <> "" Then
      ModifierCommentaire PlgSyn(LS, C), TDon(LE, 6) & ": " & Format$(TDon(LE, 25), "0.00") & " €"
      End If
   Else: MsgBox """" & TDon(LE, 26) & """ non prévu dans les titres.", _
      vbCritical, "Synthèse": Application.Goto [Table2].Cells(LE, 26): Exit Sub: End If
   Next LE
PlgSyn = TSyn
PlgSyn.Cells(UBound(TSyn, 1), "E").Resize(, 7).FormulaR1C1 = "=SUM(R6C:R[-1]C)"

End Sub

Je peux fournir le modéle de mon tableau complet pour compléter
Qu'en penses tu ?

PS : ce qui est dommage, c'est que ne serait plus en dynamique comme pour GIgogne
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Le classeur du poste 29 c'est le même bazar, sauf que comme je répondais au 30, quand je l'ouvre il n'y a qu'une feuille avec partout des #VALEUR! chez moi.
Continuons avec Gigogne, il me semble qu'on n'est pas trop loin du résultat.
 

GADENSEB

XLDnaute Impliqué
hello
ok restons là dessus.
j'en suis là

Code:
Option Explicit

Private Sub Worksheet_Activate()
Dim Rng As Range, AnDéb As Long, An As Long, CMax As Long, Compte As SsGr, Groupe As SsGr, Ligne As SsGr, BudReel As SsGr
Dim T(), L As Long, C As Long, Détail As Variant
Set Rng = ColUti(Feuil2.[B2])
AnDéb = Year(WorksheetFunction.Min(Rng))
CMax = (Year(WorksheetFunction.Max(Rng)) - AnDéb + 1) * 14 + 4
ReDim T(1 To 500, 1 To CMax)
L = -2
For Each Compte In Gigogne(Feuil2.[A2], 6, 8, 9, -5)
For Each Groupe In Compte.Co
   L = L + 1
   T(L + 2, 1) = Groupe.ID
   For Each Ligne In Groupe.Co
      L = L + 1
      T(L + 1, 2) = Ligne.ID
      For Each BudReel In Ligne.Co
         L = L + 1
         T(L, 3) = BudReel.ID
         
         For Each Détail In BudReel.Co
         If Détail(15) = "OUI" Then
            An = Year(Détail(2))
            C = (An - AnDéb) * 14 + 4 + Month(Détail(2))
            T(L, C) = T(L, C) + Détail(18)
            C = (An - AnDéb) * 14 + 17
            T(L, C) = T(L, C) + Détail(18)
         End If
            Next Détail
         Next BudReel
      If Ligne.Count = 2 Then
         L = L + 1
         T(L, 3) = "Écart"
         For C = 5 To CMax: T(L, C) = T(L - 2, C) - T(L - 1, C): Next C
         End If
      Next Ligne
   Next Groupe
T(L + 1, 1) = "RÉCAPITULATIF"
For Each Groupe In Gigogne(Feuil2.[A2], 8, -5)
   L = L + 1
   T(L + 1, 1) = Groupe.ID
   For Each BudReel In Groupe.Co
      L = L + 1
      T(L, 3) = BudReel.ID
      For Each Détail In BudReel.Co
         An = Year(Détail(2))
         C = (An - AnDéb) * 14 + 4 + Month(Détail(2))
         T(L, C) = T(L, C) + Détail(18)
         C = (An - AnDéb) * 14 + 17
         T(L, C) = T(L, C) + Détail(18)
         Next Détail
      Next BudReel
   If Groupe.Count = 2 Then
      L = L + 1
      T(L, 3) = "Écart"
      For C = 5 To CMax: T(L, C) = T(L - 2, C) - T(L - 1, C): Next C
      End If
   Next Groupe
   Next Compte
Me.[A30].Resize(L, UBound(T, 2)).Value = T
End Sub



et j'ai un bug sur :
T(L + 1, 2) = Ligne.ID
upload_2017-8-4_3-42-44.png




par contre je n'ai pas compris comment placer
Idée: Si on ne veut le détail que des "REEL" mais quand même cumuler tout dans des lignes au début, on a intérêt à noter LDéb = L au début des Groupe
et derrière For Each ButReel faire un truc comme LTot = LDéb - (BudReel.Id = "BUBGET")
pour cumler chaque fois en T(LTot, C) en même temps qu'en T(L, C)

bonne nuit
 

Dranreb

XLDnaute Barbatruc
Bonjour.
500 lignes maxi n'est peut être pas suffisant au Redim du début ?
Lorsqu'on attaque un nouveau Groupe, la valeur courante de L n'est pas loin d'être celle de la 1ère ligne où on pourrait cumuler des totaux du Groupe tous Ligne confondus. Alors notons la dans une variable LDéb qui ne bougera plus quand on incrémentera L pour les différents Ligne. Après, la ligne de total LTot à prendre c'est LDéb pour un BudReel.Id = "REEL" et LDéb + 1 pour BudReel.Id = "BUDGET".
 

GADENSEB

XLDnaute Impliqué
heuuu j'avoue que j'ai perdu le fil ......
je ne sais plus ou en est et ou intégrer tes codes.....
est ce que l'on peut faire un point global?
(pour info je ne pourrais certainement plus me connecter pendant 72 heures)
a+ bon We
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Mais bon sang, ce n'est pourtant pas compliqué, ça ressemblerait à ça, quoi, si on ne veut plus sortir les détails par Ligne des "BUDGET" comme il semblerait sur l'illustration du poste #52:
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim Rng As Range, AnDéb As Long, AnFin As Long, M As Long, CMax As Long, T(), L As Long, _
    Compte As SsGr, Groupe As SsGr, LDéb As Long, Ligne As SsGr, BudReel As SsGr, _
    LTot As Long, NonBudget As Boolean, Détail As Variant, An As Long, C As Long
Set Rng = ColUti(Feuil2.[B2])
AnDéb = Year(WorksheetFunction.Min(Rng))
AnFin = Year(WorksheetFunction.Max(Rng))
CMax = (AnFin - AnDéb + 1) * 14 + 4
ReDim T(1 To 5000, 1 To CMax)
For An = AnDéb To AnFin: For M = 1 To 12
   T(1, (An - AnDéb) * 14 + 4 + M) = Format(DateSerial(An, M, 1), "'mmm yy"): Next M, An
For Each Compte In Gigogne(Feuil2.[A2], 6, 8, 9, -5)
   L = L + 2: T(L, 1) = "Compte """ & Compte.ID & """."
   For Each Groupe In Compte.Co
      L = L + 1: LDéb = L ' On note cette ligne de début comme celle du total groupe REEL.
      T(L, 1) = "      Groupe """ & Groupe.ID & """.": T(L, 2) = "Total toutes lignes."
      T(L, 3) = "REEL"
      T(L + 1, 3) = "BUDGET"
      T(L + 2, 3) = "Écart"
      L = L + 3
      For Each Ligne In Groupe.Co
         For Each BudReel In Ligne.Co
            NonBudget = BudReel.ID <> "BUDGET"
            If NonBudget Then
               L = L + 1
               T(L, 2) = Ligne.ID
               T(L, 3) = BudReel.ID
               LTot = LDéb ' Ligne total Groupe REEL
            Else
               LTot = LDéb + 1 ' Ligne total Groupe BUDGET
               End If
            For Each Détail In BudReel.Co
               If Détail(15) = "OUI" Then
                  An = Year(Détail(2))
                  C = (An - AnDéb) * 14 + 4 + Month(Détail(2))
                  If NonBudget Then T(L, C) = T(L, C) + Détail(18)
                  T(LTot, C) = T(LTot, C) + Détail(18) ' Cumul en ligne total Groupe.
                  C = (An - AnDéb) * 14 + 17
                  If NonBudget Then T(L, C) = T(L, C) + Détail(18)
                  T(LTot, C) = T(LTot, C) + Détail(18) ' Cumul en ligne total Groupe.
                  End If: Next Détail
            Next BudReel
         Next Ligne
      For C = 4 To CMax: T(LDéb + 2, C) = T(LDéb, C) - T(LDéb + 1, C): Next C
      Next Groupe
   Next Compte
Me.[A30].Resize(5000, UBound(T, 2)).Value = T
End Sub
 
Dernière édition:

GADENSEB

XLDnaute Impliqué
Hello
Je rentre a peine.
JE viens de tester ton code.... il marche au poil sur 11000 lignes en 2 sec
merci du travail déjà
C'est vrai que je m'y perds un peu (pour l'instant) quand on utilise trop de référence T L .....
JE vais étudier le résultat !!!
Bonne AM

Seb
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16